Guía de clasificación de audio para Python

La tarea MediaPipe Audio Classifier te permite realizar la clasificación de datos de audio. Puedes usar esta tarea para identificar eventos de sonido a partir de un conjunto de categorías entrenadas. En estas instrucciones, se muestra cómo usar el clasificador de audio con Python.

Para obtener más información sobre las capacidades, los modelos y las opciones de configuración de esta tarea, consulta la Descripción general.

Ejemplo de código

El código de ejemplo de un clasificador de audio proporciona una implementación completa de esta tarea en Python para tu referencia. Este código te ayuda a probar esta tarea y comenzar a compilar tu propio clasificador de audio. Puedes ver, ejecutar y editar el código de ejemplo del clasificador de audio solo con tu navegador web con Google Colab. Puedes ver el código fuente de este ejemplo en GitHub.

Si quieres implementar el clasificador de audio para Raspberry Pi, consulta la app de ejemplo de Raspberry Pi.

Configuración

En esta sección, se describen los pasos clave para configurar tu entorno de desarrollo y los proyectos de código específicamente para usar el clasificador de audio. Si quieres obtener información general sobre la configuración de tu entorno de desarrollo para usar tareas de MediaPipe, incluidos los requisitos de la versión de la plataforma, consulta la Guía de configuración de Python.

Paquetes

La tarea del clasificador de audio es el paquete pip de mediapipe. Puedes instalar la dependencia con el siguiente comando:

$ python -m pip install mediapipe

Importaciones

Importa las siguientes clases para acceder a las funciones de la tarea del clasificador de audio:

import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import audio

Modelo

La tarea del clasificador de audio de MediaPipe requiere un modelo entrenado que sea compatible con esta tarea. Si deseas obtener más información sobre los modelos entrenados disponibles para el clasificador de audio, consulta la descripción general de la tarea en la sección Modelos.

Selecciona y descarga un modelo, y almacénalo en un directorio local. Puedes usar el modelo recomendado de Yamnet.

model_path = '/absolute/path/to/lite-model_yamnet_classification_tflite_1.tflite'

Especifica la ruta del modelo dentro del parámetro Nombre del modelo, como se muestra a continuación:

base_options = BaseOptions(model_asset_path=model_path)

Crea la tarea

Usa la función create_from_options para crear la tarea. La función create_from_options acepta opciones de configuración, incluidos el modo de ejecución, la configuración regional de los nombres visibles, la cantidad máxima de resultados, el umbral de confianza, la lista de categorías permitidas y la lista de bloqueo. Para obtener más información sobre las opciones de configuración, consulta Descripción general de la configuración.

La tarea Clasificador de audio admite clips de audio y transmisiones de audio como entrada. Cuando creas la tarea, debes especificar el modo de ejecución correspondiente a tu tipo de datos de entrada. Elige la pestaña correspondiente a tu tipo de datos de entrada para ver cómo crear la tarea y ejecutar la inferencia.

Clips de audio

AudioClassifier = mp.tasks.audio.AudioClassifier
AudioClassifierOptions = mp.tasks.audio.AudioClassifierOptions
AudioRunningMode = mp.tasks.audio.RunningMode
BaseOptions = mp.tasks.BaseOptions

options = AudioClassifierOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.tflite'),
    max_results=5,
    running_mode=AudioRunningMode.AUDIO_CLIPS)

with AudioClassifier.create_from_options(options) as classifier:
  # The classifier is initialized. Use it here.
  # ...
    

Transmisión de audio

AudioClassifier = mp.tasks.audio.AudioClassifier
AudioClassifierOptions = mp.tasks.audio.AudioClassifierOptions
AudioClassifierResult = mp.tasks.audio.AudioClassifierResult
AudioRunningMode = mp.tasks.audio.RunningMode
BaseOptions = mp.tasks.BaseOptions

def print_result(result: AudioClassifierResult, timestamp_ms: int):
    print(AudioClassifierResult result: {}’.format(result))

options = AudioClassifierOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.tflite'),
    running_mode=AudioRunningMode.AUDIO_STREAM,
    max_results=5,
    result_callback=print_result)

with AudioClassifier.create_from_options(options) as classifier:
  # The classifier is initialized. Use it here.
  # ...
  

Si deseas ver un ejemplo completo de cómo crear un clasificador de audio para usarlo con audio, consulta el ejemplo de código.

Opciones de configuración

Esta tarea incluye las siguientes opciones de configuración para aplicaciones de Python:

Nombre de la opción Descripción Rango de valores Valor predeterminado
running_mode Establece el modo de ejecución para la tarea. El clasificador de audio tiene dos modos:

AUDIO_CLIPS: Es el modo que permite ejecutar la tarea de audio en clips de audio independientes.

AUDIO_STREAM: Es el modo para ejecutar la tarea de audio en una transmisión de audio, como desde un micrófono. En este modo, se debe llamar a resultListener para configurar un objeto de escucha a fin de recibir los resultados de clasificación de forma asíncrona.
{AUDIO_CLIPS, AUDIO_STREAM} AUDIO_CLIPS
display_names_locale Configura el idioma de las etiquetas que se usarán para los nombres visibles proporcionados en los metadatos del modelo de la tarea, si están disponibles. El valor predeterminado es en para inglés. Puedes agregar etiquetas localizadas a los metadatos de un modelo personalizado con la API de Metadata Writer de TensorFlow Lite Código de configuración regional en
max_results Configura la cantidad máxima opcional de resultados de clasificación con puntuación más alta que se mostrarán. Si es inferior a 0, se devolverán todos los resultados disponibles. Cualquier número positivo -1
score_threshold Establece el umbral de puntuación de predicción que anula el proporcionado en los metadatos del modelo (si corresponde). Se rechazarán los resultados inferiores a este valor. [0.0, 1.0] No establecida
category_allowlist Establece la lista opcional de nombres de categorías permitidas. Si no está vacío, se filtrarán los resultados de clasificación cuyo nombre de categoría no esté en este conjunto. Los nombres de categorías duplicados o desconocidos se ignoran. Esta opción es mutuamente excluyente con category_denylist, y el uso de ambos da como resultado un error. Cualquier cadena No establecida
category_denylist Establece la lista opcional de nombres de categorías que no están permitidas. Si no está vacío, se filtrarán los resultados de clasificación cuyo nombre de categoría se encuentre en este conjunto. Los nombres de categorías duplicados o desconocidos se ignoran. Esta opción es mutuamente exclusiva con category_allowlist, y el uso de ambas da como resultado un error. Cualquier cadena No establecida
result_callback Configura el objeto de escucha de resultados para recibir los resultados de clasificación de forma asíncrona cuando el clasificador de audio está en el modo de transmisión de audio. Solo se puede usar cuando el modo de ejecución está configurado en AUDIO_STREAM N/A No establecida

Preparar los datos

El clasificador de audio funciona con clips y transmisiones de audio. Esta tarea controla el procesamiento previo de la entrada de datos, lo que incluye el remuestreo, el almacenamiento en búfer y el enmarcado.

Prepara la entrada como un archivo de audio o un array de NumPy y, luego, conviértela en un objeto AudioData de MediaPipe. Puedes usar una biblioteca externa como SciPy para cargar tus audios de entrada como arrays NumPy.

En los siguientes ejemplos, se explica y se muestra cómo preparar datos para su procesamiento en cada uno de los tipos de datos disponibles:

Clips de audio

import numpy as np
from scipy.io import wavfile

AudioData = mp.tasks.components.containers.AudioData

sample_rate, buffer = wavfile.read('/path/to/audio.wav')
audio_data = AudioData.create_from_array(
    buffer.astype(float) / np.iinfo(np.int16).max, sample_rate)
    

Transmisión de audio

import numpy as np

AudioData = mp.tasks.components.containers.AudioData

# Read microphone data as np arrays, then call

audio_data = AudioData.create_from_array(
    buffer.astype(float) / np.iinfo(np.int16).max, sample_rate)
    

Ejecuta la tarea

Llama a la función de clasificación correspondiente a tu modo de ejecución para activar las inferencias. La API de Audio Classifier muestra las categorías posibles para los eventos de audio dentro del búfer de audio de entrada.

Clips de audio

# Perform audio classification on the provided audio clip.
audio_classifier_result_list = classifier.classify(audio_data)
    

Transmisión de audio

# Send live audio data to perform audio classification.
# Results are sent to the `result_callback` provided in the `AudioClassifierOptions`
classifier.classify_async(audio_data, timestamp_ms)
    

Ten en cuenta lo siguiente:

  • Cuando se ejecuta en el modo de transmisión de audio, también debes proporcionar a la tarea Clasificador de audio la marca de tiempo de los datos de audio de entrada.
  • Cuando se ejecuta en el modelo de clips de audio, la tarea Clasificador de audio bloqueará el subproceso actual hasta que termine de procesar el audio de entrada.

Para ver un ejemplo más completo de cómo ejecutar el clasificador de audio con clips de audio, consulta el ejemplo de código.

Cómo controlar y mostrar los resultados

Cuando se ejecuta la inferencia, la tarea Clasificador de audio muestra un objeto AudioClassifierResult que contiene la lista de categorías posibles para los eventos de audio dentro del audio de entrada.

A continuación, se muestra un ejemplo de los datos de salida de esta tarea:

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

En el código de ejemplo del clasificador de audio, se muestra cómo mostrar los resultados de clasificación que se muestran con esta tarea. Consulta el ejemplo de código para obtener más información.