Руководство по классификации аудио для Android

Задача MediaPipe Audio Classifier позволяет выполнять классификацию аудиоданных. Эту задачу можно использовать для идентификации звуковых событий из набора обученных категорий. В этих инструкциях показано, как использовать аудиоклассификатор с приложениями Android.

Дополнительные сведения о возможностях, моделях и параметрах конфигурации этой задачи см. в разделе Обзор .

Пример кода

Пример кода задач MediaPipe — это простая реализация приложения Audio Classifier для Android. В примере используется микрофон на физическом устройстве Android для непрерывной классификации звуков, а также можно запускать классификатор для звуковых файлов, хранящихся на устройстве.

Вы можете использовать это приложение в качестве отправной точки для своего собственного приложения для Android или обращаться к нему при изменении существующего приложения. Пример кода Audio Classifier размещен на GitHub .

Загрузите код

Следующие инструкции показывают, как создать локальную копию кода примера с помощью инструмента командной строки git .

Чтобы загрузить пример кода:

  1. Клонируйте репозиторий git, используя следующую команду:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. При желании настройте свой экземпляр git на использование разреженной проверки, чтобы у вас были только файлы для примера приложения Audio Classifier:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/audio_classifier/android
    

После создания локальной версии кода примера вы можете импортировать проект в Android Studio и запустить приложение. Инструкции см. в Руководстве по установке для Android .

Ключевые компоненты

Следующие файлы содержат ключевой код для этого примера приложения классификации аудио:

  • AudioClassifierHelper.kt — инициализирует классификатор звука и обрабатывает выбор модели и делегата.
  • RecorderFragment.kt — создает пользовательский интерфейс и код управления для записи звука в реальном времени.
  • LibraryFragment.kt — создает пользовательский интерфейс и код управления для выбора аудиофайлов.
  • ProbabilitiesAdapter.kt — обрабатывает и форматирует результаты прогнозирования классификатора.

Настраивать

В этом разделе описаны ключевые шаги по настройке среды разработки и проектов кода специально для использования Audio Classifier. Общие сведения о настройке среды разработки для использования задач MediaPipe, включая требования к версии платформы, см. в руководстве по настройке для Android .

Зависимости

Классификатор аудио использует библиотеку com.google.mediapipe:tasks-audio . Добавьте эту зависимость в файл build.gradle вашего проекта разработки приложения для Android. Импортируйте необходимые зависимости с помощью следующего кода:

dependencies {
    ...
    implementation 'com.google.mediapipe:tasks-audio:latest.release'
}

Модель

Для задачи MediaPipe Audio Classifier требуется обученная модель, совместимая с этой задачей. Дополнительную информацию о доступных обученных моделях для Audio Classifier смотрите в разделе «Модели обзора задач».

Выберите и загрузите модель, а затем сохраните ее в каталоге вашего проекта:

<dev-project-root>/src/main/assets

Используйте метод BaseOptions.Builder.setModelAssetPath() чтобы указать путь, используемый моделью. Этот метод упоминается в примере кода в следующем разделе.

В примере кода Audio Classifier модель определяется в файле AudioClassifierHelper.kt .

Создать задачу

Вы можете использовать функцию createFromOptions для создания задачи. Функция createFromOptions принимает параметры конфигурации, включая режим работы, локаль отображаемых имен, максимальное количество результатов, порог уверенности, а также список разрешенных или запрещенных категорий. Дополнительные сведения о параметрах конфигурации см. в разделе Обзор конфигурации .

Задача «Классификатор аудио» поддерживает следующие типы входных данных: аудиоклипы и аудиопотоки. При создании задачи вам необходимо указать режим работы, соответствующий вашему типу входных данных. Выберите вкладку, соответствующую вашему типу входных данных, чтобы узнать, как создать задачу и выполнить вывод.

Аудиоклипы

AudioClassifierOptions options =
    AudioClassifierOptions.builder()
        .setBaseOptions(
            BaseOptions.builder().setModelAssetPath("model.tflite").build())
        .setRunningMode(RunningMode.AUDIO_CLIPS)
        .setMaxResults(5)
        .build();
audioClassifier = AudioClassifier.createFromOptions(context, options);
    

Аудиопоток

AudioClassifierOptions options =
    AudioClassifierOptions.builder()
        .setBaseOptions(
            BaseOptions.builder().setModelAssetPath("model.tflite").build())
        .setRunningMode(RunningMode.AUDIO_STREAM)
        .setMaxResults(5)
        .setResultListener(audioClassifierResult -> {
             // Process the classification result here.
        })
        .build();
audioClassifier = AudioClassifier.createFromOptions(context, options);
    

Реализация примера кода Audio Classifier позволяет пользователю переключаться между режимами обработки. Такой подход усложняет код создания задачи и может не подойти для вашего варианта использования. Вы можете увидеть код переключения режима в функции initClassifier() AudioClassifierHelper .

Варианты конфигурации

Эта задача имеет следующие параметры конфигурации для приложений Android:

Название опции Описание Диапазон значений Значение по умолчанию
runningMode Устанавливает режим выполнения задачи. Аудио Классификатор имеет два режима:

AUDIO_CLIPS: режим запуска аудиозадачи для независимых аудиоклипов.

AUDIO_STREAM: режим запуска аудиозадачи в аудиопотоке, например, с микрофона. В этом режиме необходимо вызвать resultListener, чтобы настроить прослушиватель для асинхронного получения результатов классификации.
{ AUDIO_CLIPS, AUDIO_STREAM } AUDIO_CLIPS
displayNamesLocale Задает язык меток, которые будут использоваться для отображаемых имен, представленных в метаданных модели задачи, если они доступны. По умолчанию en английский язык. Вы можете добавить локализованные метки к метаданным пользовательской модели с помощью API записи метаданных TensorFlow Lite. Код региона ru
maxResults Устанавливает необязательное максимальное количество возвращаемых результатов классификации с наивысшим баллом. Если < 0, будут возвращены все доступные результаты. Любые положительные числа -1
scoreThreshold Устанавливает порог оценки прогноза, который переопределяет тот, который указан в метаданных модели (если таковые имеются). Результаты ниже этого значения отклоняются. [0,0, 1,0] Не задано
categoryAllowlist Устанавливает необязательный список разрешенных имен категорий. Если поле не пусто, результаты классификации, имя категории которых отсутствует в этом наборе, будут отфильтрованы. Повторяющиеся или неизвестные названия категорий игнорируются. Эта опция является взаимоисключающей с categoryDenylist , и использование обеих приводит к ошибке. Любые строки Не задано
categoryDenylist Устанавливает необязательный список имен категорий, которые не разрешены. Если значение не пустое, результаты классификации, имя категории которых находится в этом наборе, будут отфильтрованы. Повторяющиеся или неизвестные названия категорий игнорируются. Этот параметр является взаимоисключающим с categoryAllowlist , и использование обоих приводит к ошибке. Любые строки Не задано
resultListener Настраивает прослушиватель результатов на асинхронное получение результатов классификации, когда аудиоклассификатор находится в режиме аудиопотока. Может использоваться только в том случае, если для режима работы установлено значение AUDIO_STREAM Н/Д Не задано
errorListener Устанавливает дополнительный прослушиватель ошибок. Н/Д Не задано

Подготовьте данные

Audio Classifier работает с аудиоклипами и аудиопотоками. Задача выполняет предварительную обработку входных данных, включая повторную выборку, буферизацию и кадрирование. Однако вам необходимо преобразовать входные аудиоданные в объект com.google.mediapipe.tasks.components.containers.AudioData , прежде чем передавать их в задачу классификатора аудио.

Аудиоклипы

import com.google.mediapipe.tasks.components.containers.AudioData;

// Load an audio on the user’s device as a float array.

// Convert a float array to a MediaPipe’s AudioData object.
AudioData audioData =
    AudioData.create(
        AudioData.AudioDataFormat.builder()
            .setNumOfChannels(numOfChannels)
            .setSampleRate(sampleRate)
            .build(),
        floatData.length);
audioData.load(floatData);
    

Аудиопоток

import android.media.AudioRecord;
import com.google.mediapipe.tasks.components.containers.AudioData;

AudioRecord audioRecord =
    audioClassifier.createAudioRecord(/* numChannels= */ 1, /* sampleRate= */ 16000);
audioRecord.startRecording();

...

// To get a one second clip from the AudioRecord object:
AudioData audioData =
    AudioData.create(
        16000 /*sample counts per second*/);
        AudioData.AudioDataFormat.create(audioRecord.getFormat()),
audioData.load(audioRecord)
    

Запустить задачу

Вы можете вызвать функцию classify , соответствующую вашему режиму работы, чтобы инициировать выводы. API аудиоклассификатора возвращает возможные категории аудиособытий, распознаваемых во входных аудиоданных.

Аудиоклипы

AudioClassifierResult classifierResult = audioClassifier.classify(audioData);
    

Аудиопоток

// Run inference on the audio block. The classifications results will be available
// via the `resultListener` provided in the `AudioClassifierOptions` when
// the audio classifier was created.
audioClassifier.classifyAsync(audioBlock, timestampMs);
    

Обратите внимание на следующее:

  • При работе в режиме аудиопотока необходимо также предоставить задаче аудиоклассификатора метку времени, чтобы отслеживать, какие аудиоданные в потоке использовались для вывода.
  • При работе в модели аудиоклипов задача Классификатор аудио блокирует текущий поток до тех пор, пока он не завершит обработку входного аудио. Чтобы избежать блокировки ответов пользовательского интерфейса, выполняйте обработку в фоновом потоке.

Пример запуска Audio Classifier с аудиоклипами вы можете увидеть, класс AudioClassifierHelper смотрите в примере кода .

Обработка и отображение результатов

После выполнения вывода задача «Классификатор аудио» возвращает список возможных категорий аудиособытий во входном аудио. В следующем листинге показан пример выходных данных этой задачи:

AudioClassifierResult:
  Timestamp in microseconds: 100
  ClassificationResult #0:
    Timestamp in microseconds: 100  
    Classifications #0 (single classification head):
      head index: 0
      category #0:
        category name: "Speech"
        score: 0.6
        index: 0
      category #1:
        category name: "Music"
        score: 0.2
        index: 1

В приложении Android задача возвращает ClassificationResult , который содержит список объектов AudioClassifierResult , представляющих прогнозы для аудиособытия, включая метку категории и оценку достоверности.

Аудиоклипы

// In the audio clips mode, the classification results are for the entire audio
// clip. The results are timestamped AudioClassifierResult objects, each
// classifying an interval of the entire audio clip that starts at
// ClassificationResult.timestampMs().get().

for (ClassificationResult result : audioClassifierResult.classificationResults()) {
  // Audio interval start timestamp:
  result.timestampMs().get();
  // Classification result of the audio interval.
  result.classifications();
}
    

Аудиопоток

// In the audio stream mode, the classification results list only contains one
// element, representing the classification result of the audio block that
// starts at ClassificationResult.timestampMs in the audio stream.

ClassificationResult result = audioClassifierResult.classificationResults().get(0);
// The audio block start timestamp
audioClassifierResult.timestampMs();
// Alternatively, the same timestamp can be retrieved from
// result.timestampMs().get();

// Classification result.
result.classifications();
    

Пример того, как отобразить результаты классификации, возвращаемые из этой задачи, вы можете увидеть в классе ProbabilitiesAdapter примера кода .