Guia de classificação de áudio para Web

A tarefa MediaPipe Audio Classifier permite realizar a classificação em dados de áudio. Use essa tarefa para identificar eventos sonoros de um conjunto de categorias treinadas. Estas instruções mostram como usar o classificador de áudio para apps da Web e do Node.

Para ver essa tarefa em ação, confira a demonstração. Para mais informações sobre os recursos, modelos e opções de configuração dessa tarefa, consulte a Visão geral.

Exemplo de código

O exemplo de código do classificador de áudio oferece uma implementação completa dessa tarefa em JavaScript para sua referência. Esse código ajuda você a testar essa tarefa e começar a criar seu próprio app de classificação de áudio. É possível ver, executar e editar o exemplo do classificador de áudio usando apenas seu navegador da Web.

Configuração

Esta seção descreve as principais etapas para configurar seu ambiente de desenvolvimento e projetos de código especificamente para usar o classificador de áudio. Para informações gerais sobre como configurar seu ambiente de desenvolvimento para usar as tarefas do MediaPipe, incluindo requisitos de versão da plataforma, consulte o Guia de configuração para a Web.

Pacotes JavaScript

O código do classificador de áudio está disponível no pacote @mediapipe/tasks-audio NPM do MediaPipe. Você pode encontrar e baixar essas bibliotecas nos links fornecidos no guia de configuração da plataforma.

É possível instalar os pacotes necessários com o seguinte código para teste local usando este comando:

npm install @mediapipe/tasks-audio

Se você quiser importar o código da tarefa por um serviço de rede de fornecimento de conteúdo (CDN), adicione o seguinte código à tag no arquivo 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

A tarefa do classificador de áudio do MediaPipe exige um modelo treinado compatível com essa tarefa. Para mais informações sobre os modelos treinados disponíveis para o classificador de áudio, consulte a seção Modelos na visão geral da tarefa.

Selecione e baixe um modelo e armazene-o no diretório do projeto, por exemplo:

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

Criar a tarefa

Use uma das funções createFrom...() do classificador de áudio para preparar a tarefa para executar inferências. Use a função createFromModelPath() com um caminho relativo ou absoluto para o arquivo modelo treinado. Se o modelo já estiver carregado na memória, use o método createFromModelBuffer().

O exemplo de código abaixo demonstra o uso da função createFromOptions() para configurar a tarefa. A função createFromOptions permite personalizar o classificador de áudio com opções de configuração. Para mais informações sobre as opções de configuração, consulte Opções de configuração.

O código a seguir demonstra como criar e configurar a tarefa com opções 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"
    }
  });

Confira um exemplo completo em example code.

Opções de configuração

Essa tarefa tem as seguintes opções de configuração para aplicativos da Web e JavaScript:

Nome da opção Descrição Intervalo de valor Valor padrão
displayNamesLocale Define o idioma dos rótulos a serem usados para os nomes de exibição fornecidos nos metadados do modelo da tarefa, se disponíveis. O padrão é en para inglês. É possível adicionar rótulos localizados aos metadados de um modelo personalizado usando a API TensorFlow Lite Metadata Writer. Código da localidade en
maxResults Define o número máximo opcional de resultados de classificação com pontuação mais alta a serem retornados. Se for < 0, todos os resultados disponíveis serão retornados. Qualquer número positivo -1
scoreThreshold Define o limite de pontuação de previsão que substitui o fornecido nos metadados do modelo, se houver. Resultados abaixo desse valor são rejeitados. [0.0, 1.0] Não definido
categoryAllowlist Define a lista opcional de nomes de categorias permitidos. Se não estiver vazio, os resultados de classificação cujo nome de categoria não estiver neste conjunto serão filtrados. Nomes de categorias duplicados ou desconhecidos são ignorados. Essa opção é mutuamente exclusiva com categoryDenylist, e usar as duas resulta em um erro. Qualquer string Não definido
categoryDenylist Define a lista opcional de nomes de categorias que não são permitidos. Se não estiver vazio, os resultados de classificação cujo nome de categoria estiver neste conjunto serão filtrados. Nomes de categorias duplicados ou desconhecidos são ignorados. Essa opção é mutuamente exclusiva com categoryAllowlist, e usar as duas resulta em um erro. Qualquer string Não definido

Preparar dados

O classificador de áudio funciona com clipes e streams de áudio e pode ser usado com arquivos de áudio em qualquer formato compatível com o navegador host. A tarefa processa o pré-processamento de entrada de dados, incluindo reamostragem, buffer e enquadramento.

Executar a tarefa

O classificador de áudio usa o método classify() para executar inferências em arquivos de clipes de áudio ou streams de áudio. A API Audio Classifier retorna as possíveis categorias para eventos de áudio reconhecidos no áudio de entrada.

As chamadas para o método classify() do classificador de áudio são executadas de forma síncrona e bloqueiam a thread da interface do usuário. Se você classificar o áudio do microfone de um dispositivo, cada classificação vai bloquear a linha de execução principal. Para evitar isso, implemente web workers para executar classify() em outra linha de execução.

O código a seguir demonstra como executar o processamento com o modelo de tarefa:

Clipes de áudio

// 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
);
  

Stream de áudio

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 uma implementação mais completa da execução de uma tarefa de classificador de áudio, consulte o exemplo.

Processar e mostrar resultados

Depois de concluir uma execução de inferência, a tarefa do classificador de áudio retorna um objeto AudioClassifierResult que contém a lista de categorias possíveis para os objetos no áudio 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

O exemplo de código do classificador de áudio mostra como exibir os resultados da classificação retornados da tarefa. Consulte o exemplo para mais detalhes.