Guia de classificação de áudio para Android

A tarefa MediaPipe Audio Classifier permite que você faça a classificação de dados de áudio. Você pode use essa tarefa para identificar eventos sonoros de um conjunto de categorias treinadas. Esses instruções mostram como usar o Classificador de áudio com apps Android.

Para mais informações sobre recursos, modelos e opções de configuração, desta tarefa, consulte a Visão geral.

Exemplo de código

O código de exemplo do MediaPipe Tasks é uma implementação simples de um classificador de áudio para Android. O exemplo usa o microfone de um dispositivo Android físico para pode classificar continuamente sons e também executar o classificador em arquivos de som armazenadas no dispositivo.

Você pode usar o app como ponto de partida para seu próprio app Android ou consultá-lo ao modificar um aplicativo existente. O exemplo de código do Audio Classifier está hospedado GitHub.

Fazer o download do código

As instruções a seguir mostram como criar uma cópia local do exemplo. usando a ferramenta de linha de comando git.

Para fazer o download do código de exemplo:

  1. Clone o repositório git usando o seguinte comando:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. Como opção, configure sua instância do Git para usar a finalização esparsa. então, você tem apenas os arquivos do app de exemplo do Audio Classifier:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/audio_classifier/android
    

Depois de criar uma versão local do código de exemplo, você pode importar o projeto no Android Studio e executar o app. Para instruções, consulte a Guia de configuração para Android.

Principais componentes

Os arquivos a seguir contêm o código essencial para esse áudio aplicação de exemplo de classificação:

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 a configuração do seu ambiente de desenvolvimento para usar tarefas do MediaPipe, incluindo requisitos de versão da plataforma, consulte Guia de configuração para Android.

Dependências

O Classificador de áudio usa a biblioteca com.google.mediapipe:tasks-audio. Adicionar dependência do arquivo build.gradle da Projeto de desenvolvimento de apps Android. Importe as dependências necessárias com o seguinte código:

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

Modelo

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

Selecione e faça o download do modelo e armazene-o no diretório do projeto:

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

Use o método BaseOptions.Builder.setModelAssetPath() para especificar o caminho. usados pelo modelo. Esse método é mencionado no exemplo de código nos próximos nesta seção.

Na Exemplo de código do classificador de áudio o modelo é definido em AudioClassifierHelper.kt .

Criar a tarefa

Use a função createFromOptions para criar a tarefa. A A função createFromOptions aceita opções de configuração, incluindo modo, nome de exibição, localidade, número máximo de resultados, limite de confiança, e uma lista de permissões ou de bloqueio. Para mais informações sobre configurações opções, consulte Visão geral da configuração.

A tarefa Classificador de áudio oferece suporte aos seguintes tipos de dados de entrada: clipes de áudio e streams de áudio. Você precisa especificar o modo de corrida correspondente o tipo de dados de entrada ao criar uma tarefa. Escolha a guia correspondente ao seu tipo de dados de entrada para ver como criar a tarefa e executar a inferência.

Clipes de áudio

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

Stream de áudio

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

A implementação de código de exemplo do Audio Classificador permite que o usuário alterne entre os modos de processamento. A abordagem torna o código de criação da tarefa mais complicado podem não ser adequados para seu caso de uso. O código da troca de modo aparece na função initClassifier() do AudioClassifierHelper.

Opções de configuração

Esta tarefa tem as seguintes opções de configuração para apps Android:

Nome da opção Descrição Intervalo de valor Valor padrão
runningMode Define o modo de execução da tarefa. O Classificador de áudio tem dois modos:

AUDIO_CLIPS: o modo para executar a tarefa de áudio em clipes de áudio independentes.

AUDIO_STREAM: o modo para executar a tarefa de áudio em um stream de áudio, como do microfone. Neste modo, resultListener deve ser chamado para configurar um listener e receber os resultados da classificação de forma assíncrona.
{AUDIO_CLIPS, AUDIO_STREAM} AUDIO_CLIPS
displayNamesLocale Define o idioma dos rótulos a serem usados para nomes de exibição fornecidos no 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 Metadata Writer do TensorFlow Lite; Código da localidade en
maxResults Define o número máximo opcional de resultados da classificação com maior pontuação como voltar. Se < 0, todos os resultados disponíveis serão retornados. Qualquer número positivo -1
scoreThreshold Define o limite de pontuação da previsão que substitui o fornecido no os 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, resultados de classificação cujo nome de categoria não esteja neste conjunto serão que foram filtradas. Nomes de categorias duplicados ou desconhecidos são ignorados. Essa opção é mutuamente exclusiva com categoryDenylist e usando os dois resultarão em erro. Qualquer string Não definido
categoryDenylist Define a lista opcional de nomes de categorias que não são permitidos. Se não vazio, os resultados de classificação cujo nome de categoria estiver neste conjunto serão filtrados para fora. Nomes de categorias duplicados ou desconhecidos são ignorados. Essa opção é mutuamente exclusivo com categoryAllowlist e usar ambos resulta em um erro. Qualquer string Não definido
resultListener Define o listener de resultados para receber os resultados da classificação. de forma assíncrona quando o classificador de áudio está no stream de áudio modo Só pode ser usado quando o modo de corrida está definido como AUDIO_STREAM N/A Não definido
errorListener Define um listener de erro opcional. N/A Não definido

Preparar dados

O Classificador de áudio funciona com clipes e streams de áudio. A tarefa lida com o pré-processamento de entradas de dados, incluindo reamostragem, armazenamento em buffer e enquadramento. No entanto, você deve converter os dados de entrada de áudio para um com.google.mediapipe.tasks.components.containers.AudioData antes de transmiti-lo para a tarefa do Audio Classifier.

Clipes de áudio

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

// Load an audio on the users device as a float array.

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

Stream de áudio

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)
    

Executar a tarefa

Você pode chamar a função classify correspondente ao modo de corrida para e acionar inferências. A API Audio Classifier retorna as categorias possíveis para os eventos de áudio reconhecidos nos dados de entrada de áudio.

Clipes de áudio

AudioClassifierResult classifierResult = audioClassifier.classify(audioData);
    

Stream de áudio

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

Observe o seguinte:

  • Ao executar no modo de stream de áudio, você também precisa fornecer o Tarefa do classificador de áudio com um carimbo de data/hora para rastrear quais dados de áudio o stream foi usado para a inferência.
  • Ao executar no modelo de clipes de áudio, a tarefa do Classificador de áudio bloqueia linha de execução atual até terminar de processar o áudio de entrada. Para evitar o bloqueio de respostas da interface do usuário, execute o processamento em uma linha de execução em segundo plano.

Confira um exemplo de execução do Classificador de áudio com clipes de áudio. Classe AudioClassifierHelper na exemplo de código.

Gerenciar e exibir resultados

Depois de executar uma inferência, a tarefa do classificador de áudio retorna uma lista de possíveis categorias para os eventos de áudio na entrada de áudio. A listagem a seguir mostra um exemplo dos dados de saída desta tarefa:

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

Em um app Android, a tarefa retorna uma ClassificationResult que contém uma lista de objetos AudioClassifierResult, representando as previsões para um evento de áudio, incluindo o rótulo da categoria e a pontuação de confiança.

Clipes de áudio

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

Stream de áudio

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

Confira um exemplo de como exibir a classificação resultados retornados dessa tarefa na classe ProbabilitiesAdapter do exemplo de código.