A tarefa do Classificador de áudio do MediaPipe permite classificar 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 com apps Android.
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 código de exemplo do MediaPipe Tasks é uma implementação simples de um app Classificador de áudio para Android. O exemplo usa o microfone em um dispositivo Android físico para classificar sons continuamente e também pode executar o classificador em arquivos de som armazenados no dispositivo.
Você pode usar o app como ponto de partida para seu próprio app Android ou se referir a ele ao modificar um app já existente. O código de exemplo do Classificador de áudio está hospedado no GitHub (em inglês).
Fazer o download do código
As instruções a seguir mostram como criar uma cópia local do código de exemplo usando a ferramenta de linha de comando git.
Para fazer o download do código de exemplo:
- Clone o repositório git usando o seguinte comando:
git clone https://github.com/google-ai-edge/mediapipe-samples
- Como opção, configure sua instância git para usar a finalização da compra esparsa
para que você tenha apenas os arquivos do app de exemplo do classificador de áudio:
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ê poderá importar o projeto para o Android Studio e executar o app. Para conferir instruções, consulte o Guia de configuração para Android.
Principais componentes
Os arquivos a seguir contêm o código essencial para esse exemplo de classificação de áudio:
- AudioClassifierHelper.kt: inicializa o classificador de áudio, processa o modelo e delega a seleção.
- RecorderFragment.kt: cria a interface do usuário e o código de controle para gravação de áudio ao vivo.
- LibraryFragment.kt: cria a interface do usuário e o código de controle para selecionar arquivos de áudio.
- ProbabilitiesAdapter.kt: processa e formata os resultados de previsão do classificador.
Configuração
Esta seção descreve as principais etapas para configurar seu ambiente de desenvolvimento e projetos de código para usar o Classificador de áudio. Para ter informações gerais sobre como configurar seu ambiente de desenvolvimento para usar tarefas do MediaPipe, incluindo requisitos de versão da plataforma, consulte o Guia de configuração para Android.
Dependências
O classificador de áudio usa a biblioteca com.google.mediapipe:tasks-audio
. Adicione essa
dependência ao arquivo build.gradle
do
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 MediaPipe requer um modelo treinado compatível com ela. Para mais informações sobre os modelos treinados disponíveis para o Classificador de áudio, consulte a seção Modelos de visão geral da tarefa.
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
usado pelo modelo. Esse método é mencionado no exemplo de código na próxima seção.
No
código de exemplo do classificador de áudio,
o modelo é definido no arquivo
AudioClassifierHelper.kt
.
Criar a tarefa
Use a função createFromOptions
para criar a tarefa. A
função createFromOptions
aceita opções de configuração, incluindo o modo de
execução, a localidade dos nomes de exibição, o número máximo de resultados, o limite de confiança
e uma lista de permissões ou negações de categoria. Para mais informações sobre as opções
de configuração, consulte Visão geral da configuração.
A tarefa "Classificador de áudio" oferece suporte aos seguintes tipos de dados de entrada: clipes e streams de áudio. Ao criar uma tarefa, você precisa especificar o modo de execução correspondente ao tipo de dados de entrada. Escolha a guia correspondente ao tipo de dados de entrada para conferir 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);
O exemplo de implementação do código do Classificador de áudio permite que o usuário alterne entre
modos de processamento. A abordagem torna o código de criação da tarefa mais complicado e
pode não ser apropriada para seu caso de uso. Veja o código de alternância de modo
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 no microfone. Nesse modo, resultListener precisa ser chamado para configurar um listener e receber os resultados de classificação de forma assíncrona. |
{AUDIO_CLIPS, AUDIO_STREAM } |
AUDIO_CLIPS |
displayNamesLocale |
Define o idioma dos rótulos a ser usado para nomes de exibição fornecidos nos
metadados do modelo da tarefa, se disponível. 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 a melhor pontuação a ser retornado. Se < 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). Os resultados abaixo desse valor são rejeitados. | [0,0, 1,0] | Não definido |
categoryAllowlist |
Define a lista opcional de nomes de categorias permitidas. Se não estiver em branco, os resultados de classificação com nome de categoria que não estiver nesse conjunto serão filtrados. Nomes de categoria duplicados ou desconhecidos são ignorados.
Essa opção é mutuamente exclusiva com categoryDenylist , e o uso
de ambos 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 em branco, os resultados de classificação com o nome de categoria nesse conjunto serão filtrados. Nomes de categoria duplicados ou desconhecidos são ignorados. Essa opção é mutuamente
exclusiva com categoryAllowlist , e o uso de 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 modo de
stream de áudio. 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 da entrada de dados, incluindo reamostragem, armazenamento em buffer e enquadramento.
No entanto, você precisa converter os dados de áudio de entrada em um
objeto com.google.mediapipe.tasks.components.containers.AudioData
antes de transmiti-los para a tarefa do Classificador de áudio.
Clipes de áudio
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);
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
É possível chamar a função classify
correspondente ao modo de execução para
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 à tarefa do classificador de áudio um carimbo de data/hora para rastrear quais dados de áudio no stream foram usados para a inferência.
- Quando executada no modelo de clipes de áudio, a tarefa Classificador de áudio bloqueia a 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.
Você pode conferir um exemplo de execução do Classificador de áudio com clipes de áudio. Consulte a
classe AudioClassifierHelper
no
exemplo de código.
Gerenciar e mostrar resultados
Depois de executar uma inferência, a tarefa Classificador de áudio retorna uma lista de categorias possíveis para os eventos de áudio no áudio de entrada. A listagem a seguir mostra um exemplo dos dados de saída dessa 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 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();
Você pode consultar um exemplo de como exibir os resultados de classificação retornados por essa tarefa na classe ProbabilitiesAdapter
do exemplo de código.