Задача MediaPipe Audio Classifier позволяет выполнять классификацию аудиоданных. Эту задачу можно использовать для идентификации звуковых событий из набора обученных категорий. В этих инструкциях показано, как использовать аудиоклассификатор с приложениями Android.
Дополнительные сведения о возможностях, моделях и параметрах конфигурации этой задачи см. в разделе Обзор .
Пример кода
Пример кода задач MediaPipe — это простая реализация приложения Audio Classifier для Android. В примере используется микрофон на физическом устройстве Android для непрерывной классификации звуков, а также можно запускать классификатор для звуковых файлов, хранящихся на устройстве.
Вы можете использовать это приложение в качестве отправной точки для своего собственного приложения для Android или обращаться к нему при изменении существующего приложения. Пример кода Audio Classifier размещен на GitHub .
Загрузите код
Следующие инструкции показывают, как создать локальную копию кода примера с помощью инструмента командной строки git .
Чтобы загрузить пример кода:
- Клонируйте репозиторий git, используя следующую команду:
git clone https://github.com/google-ai-edge/mediapipe-samples
- При желании настройте свой экземпляр 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
примера кода .