Guía de clasificación de audio para la Web

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 para apps web y de Node.

Puedes ver esta tarea en acción en la demostración. 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 Audio Classifier proporciona una implementación completa de esta tarea en JavaScript para tu referencia. Este código te ayuda a probar esta tarea y a comenzar a compilar tu propia app de clasificación de audio. Puedes ver, ejecutar y editar el ejemplo de Audio Classifier con solo tu navegador web.

Configuración

En esta sección, se describen los pasos clave para configurar tu entorno de desarrollo y proyectos de código específicamente para usar Audio Classifier. Si deseas obtener información general para configurar tu entorno de desarrollo para usar las tareas de MediaPipe, incluidos los requisitos de versión de la plataforma, consulta la guía de configuración para la Web.

Paquetes de JavaScript

El código del clasificador de audio está disponible a través del paquete NPM de MediaPipe @mediapipe/tasks-audio. Puedes encontrar y descargar estas bibliotecas desde los vínculos que se proporcionan en la Guía de configuración de la plataforma.

Puedes instalar los paquetes requeridos con el siguiente código para la organización local con el siguiente comando:

npm install @mediapipe/tasks-audio

Si deseas importar el código de la tarea a través de un servicio de red de distribución de contenido (CDN), agrega el siguiente código en la etiqueta <head> de tu archivo HTML:

<!-- Replace "my-cdn-service.com" with your CDN -->
<head>
  <script src="https://my-cdn-service.com/npm/@mediapipe/tasks-audio/audio_bundle.js"
    crossorigin="anonymous"></script>
</head>

Modelo

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

Selecciona y descarga un modelo y, luego, guárdalo en el directorio de tu proyecto, por ejemplo:

<dev-project-root>/app/shared/models/

Crea la tarea

Usa una de las funciones createFrom...() de Audio Classifier para preparar la tarea para ejecutar inferencias. Usa la función createFromModelPath() con una ruta de acceso relativa o absoluta al archivo del modelo entrenado. Si tu modelo ya está cargado en la memoria, puedes usar el método createFromModelBuffer().

En el siguiente ejemplo de código, se muestra el uso de la función createFromOptions() para configurar la tarea. La función createFromOptions te permite personalizar el clasificador de audio con opciones de configuración. Para obtener más información sobre las opciones de configuración, consulta Opciones de configuración.

El siguiente código muestra cómo compilar y configurar la tarea con opciones personalizadas:

const audio = await FilesetResolver.forAudioTasks(
    "https://my-cdn-service.com/npm/@mediapipe/tasks-audio/wasm"
  );

const audioClassifier = await AudioClassifier.createFromOptions(audio, {
    baseOptions: {
      modelAssetPath:
        "https://tfhub.dev/google/lite-model/yamnet/classification/tflite/1?lite-format=tflite"
    }
  });

Puedes ver un ejemplo completo en example code.

Opciones de configuración

Esta tarea tiene las siguientes opciones de configuración para aplicaciones web y de JavaScript:

Nombre de la opción Descripción Rango de valores Valor predeterminado
displayNamesLocale Establece 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 TensorFlow Lite Metadata Writer. Código de configuración regional en
maxResults Establece la cantidad máxima opcional de resultados de clasificación con la puntuación más alta que se devolverán. Si es < 0, se devolverán todos los resultados disponibles. Cualquier número positivo -1
scoreThreshold Establece el umbral de la puntuación de predicción que anula el proporcionado en los metadatos del modelo (si hay alguno). Se rechazan los resultados por debajo de este valor. [0.0, 1.0] Sin establecer
categoryAllowlist Establece la lista opcional de nombres de categorías permitidos. Si no está vacío, se filtrarán los resultados de clasificación cuyo nombre de categoría no se encuentre en este conjunto. Se ignoran los nombres de categorías duplicados o desconocidos. Esta opción es mutuamente exclusiva con categoryDenylist, y usar ambas opciones genera un error. Cualquier cadena Sin establecer
categoryDenylist 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. Se ignoran los nombres de categorías duplicados o desconocidos. Esta opción es mutuamente excluyente con categoryAllowlist, y usar ambas opciones genera un error. Cualquier cadena Sin establecer

Preparar los datos

El Clasificador de audio funciona con clips y transmisiones de audio, y puede trabajar con archivos de audio en cualquier formato compatible con el navegador host. La tarea controla el procesamiento previo de los datos de entrada, incluido el remuestreo, el almacenamiento en búfer y el encuadre.

Ejecuta la tarea

El clasificador de audio usa el método classify() para ejecutar inferencias en archivos de clips de audio o transmisiones de audio. La API de Audio Classifier devuelve las posibles categorías de los eventos de audio reconocidos en el audio de entrada.

Las llamadas al método classify() de Audio Classifier se ejecutan de forma síncrona y bloquean el subproceso de la interfaz de usuario. Si clasificas el audio del micrófono de un dispositivo, cada clasificación bloqueará el subproceso principal. Para evitar esto, puedes implementar trabajadores web para ejecutar classify() en otro subproceso.

En el siguiente código, se muestra cómo ejecutar el procesamiento con el modelo de tareas:

Clips de audio

// Create audio buffer
const sample = await response.arrayBuffer();
const audioBuffer = await audioCtx.decodeAudioData(sample);

// Use AudioClassifier to run classification
const results = audioClassifier.classify(
  audioBuffer.getChannelData(0),
  audioBuffer.sampleRate
);
  

Transmisión de audio

stream = await navigator.mediaDevices.getUserMedia(constraints);
audioCtx = new AudioContext({ sampleRate: 16000 });

const source = audioCtx.createMediaStreamSource(stream);
const scriptNode = audioCtx.createScriptProcessor(16384, 1, 1);

scriptNode.onaudioprocess = function (audioProcessingEvent) {
  const inputBuffer = audioProcessingEvent.inputBuffer;
  let inputData = inputBuffer.getChannelData(0);

  // Classify the audio
  const result = audioClassifier.classify(inputData);
  const categories = result[0].classifications[0].categories;
};
  

Para obtener una implementación más completa de la ejecución de una tarea de Audio Classifier, consulta el ejemplo.

Cómo controlar y mostrar los resultados

Una vez que completas una ejecución de inferencia, la tarea Audio Classifier devuelve un objeto AudioClassifierResult que contiene la lista de categorías posibles para los objetos dentro del audio de entrada.

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 visualizar los resultados de clasificación que devuelve la tarea. Consulta el ejemplo para obtener más detalles.