Path: blob/master/site/pt-br/tutorials/audio/simple_audio.ipynb
25118 views
Copyright 2020 The TensorFlow Authors.
Reconhecimento de áudio simples: reconhecendo palavras-chave
Este tutorial demonstra como pré-processar arquivos de áudio no formato WAV e construir e treinar um modelo básico de reconhecimento automático de fala (ASR, na sigla em inglês) para reconhecer dez palavras diferentes. Você usará uma parte do dataset Speech Commands (Warden, 2018), que contém clipes de áudio curtos (de um segundo ou menos) de comandos em inglês, como "down", "go", "left", "no", "right", "stop", "up" e "yes".
Os sistemas de reconhecimento de voz e áudio do mundo real são complexos. Mas, assim como a classificação de imagens com o dataset MNIST, este tutorial deve fornecer uma compreensão básica das técnicas envolvidas.
Configuração
Importe os módulos e dependências necessários. Você usará tf.keras.utils.audio_dataset_from_directory
(introduzido no TensorFlow 2.10), que ajuda a gerar datasets de classificação de áudio a partir de diretórios de arquivos .wav
. Você também precisará do Seaborn para visualização neste tutorial.
Importe o dataset mini Speech Commands
Para economizar tempo com o carregamento de dados, você trabalhará com uma versão reduzida do dataset Speech Commands. O dataset original consiste em mais de 105.000 arquivos de áudio no formato WAV (Waveform) de pessoas falando 35 palavras diferentes. Esses dados foram coletados pelo Google e divulgados sob licença CC BY.
Baixe e extraia o arquivo mini_speech_commands.zip
que contém os datasets Speech Commands menores com tf.keras.utils.get_file
:
Os clipes de áudio do dataset são armazenados em oito pastas correspondentes a cada comando de fala: no
, yes
, down
, go
, left
, up
, right
e stop
:
Divididos em diretórios dessa forma, você pode carregar facilmente os dados usando keras.utils.audio_dataset_from_directory
.
Os clipes de áudio têm 1 segundo ou menos a 16kHz. O output_sequence_length=16000
preenche os curtos para exatamente 1 segundo (e cortaria os mais longos) para que possam ser facilmente agrupados em lote.
O dataset agora contém lotes de clipes de áudio e rótulos inteiros. Os clipes de áudio têm o formato (batch, samples, channels)
(lote, amostras, canais).
Este dataset contém apenas áudio de canal único, então use a função tf.squeeze
para eliminar o eixo extra:
A função utils.audio_dataset_from_directory
retorna apenas até duas divisões (splits). É uma boa ideia manter um dataset de testes separado do seu dataset de validação. Idealmente, você o manteria em um diretório separado, mas neste caso você pode usar Dataset.shard
para dividir o dataset de validação em duas metades. Observe que a iteração sobre qualquer fragmento carregará todos os dados e manterá apenas sua fração.
Vamos desenhar algumas formas de onda de áudio:
Converta formas de onda em espectrogramas
As formas de onda no dataset são representadas no domínio do tempo. A seguir, você transformará as formas de onda dos sinais no domínio do tempo em sinais no domínio da frequência e do tempo, calculando a transformada de Fourier de tempo curto (STFT, da sigla em inglês) para converter as formas de onda em espectrogramas, que mostram mudanças de frequência ao longo do tempo e podem ser representadas como imagens 2D. Você alimentará as imagens do espectrograma em sua rede neural para treinar o modelo.
Uma transformada de Fourier (tf.signal.fft
) converte um sinal em seus componentes de frequência, mas perde todas as informações de tempo. Em comparação, o STFT (tf.signal.stft
) divide o sinal em janelas de tempo e executa uma transformada de Fourier em cada janela, preservando algumas informações de tempo e retornando um tensor 2D no qual você pode executar convoluções padrão.
Crie uma função utilitária para converter formas de onda em espectrogramas:
As formas de onda precisam ter o mesmo comprimento, para que, ao convertê-las em espectrogramas, os resultados tenham dimensões semelhantes. Isso pode ser feito simplesmente preenchendo com zero os clipes de áudio com menos de um segundo (usando
tf.zeros
).Ao chamar
tf.signal.stft
, escolha os parâmetrosframe_length
eframe_step
de forma que a "imagem" do espectrograma gerado seja quase quadrada. Para obter mais informações sobre a escolha dos parâmetros STFT, consulte este vídeo do Coursera sobre processamento de sinal de áudio e STFT.O STFT produz um array de números complexos representando magnitude e fase. No entanto, neste tutorial você usará apenas a magnitude, que pode ser derivada aplicando
tf.abs
na saída detf.signal.stft
.
Em seguida, comece a explorar os dados. Imprima as formas da forma de onda tensorizada de um exemplo e o espectrograma correspondente e reproduza o áudio original:
Agora, defina uma função para exibir um espectrograma:
Desenhe a forma de onda do exemplo ao longo do tempo e o espectrograma correspondente (frequências ao longo do tempo):
Agora, crie datasets de espectrograma a partir dos datasets de áudio:
Examine os espectrogramas para diferentes exemplos do dataset:
Construa e treine o modelo
Adicione operações Dataset.cache
e Dataset.prefetch
para reduzir a latência de leitura durante o treinamento do modelo:
Para o modelo, você usará uma rede neural convolucional (CNN) simples, já que transformou os arquivos de áudio em imagens de espectrograma.
Seu modelo tf.keras.Sequential
usará as seguintes camadas de pré-processamento Keras:
tf.keras.layers.Resizing
: para reduzir a resolução da entrada para permitir que o modelo treine mais rapidamente.tf.keras.layers.Normalization
: para normalizar cada pixel da imagem com base em sua média e desvio padrão.
Para a camada Normalization
, seu método adapt
precisaria primeiro ser chamado nos dados de treinamento para calcular estatísticas agregadas (ou seja, a média e o desvio padrão).
Configure o modelo Keras com o otimizador Adam e a perda de entropia cruzada:
Treine o modelo ao longo de 10 épocas para fins de demonstração:
Vamos plotar as curvas de perda de treinamento e validação para verificar como seu modelo melhorou durante o treinamento:
Avalie o desempenho do modelo
Execute o modelo sobre o dataset de testes e verifique o desempenho do modelo:
Exiba uma matriz de confusão
Use uma matriz de confusão para verificar o desempenho do modelo ao classificar cada um dos comandos no dataset de teste:
Execute inferência num arquivo de áudio
Por fim, verifique o resultado da previsão do modelo usando um arquivo de áudio de entrada de alguém dizendo “no” (não). Qual é o desempenho do seu modelo?
Como a saída sugere, seu modelo deveria ter reconhecido o comando de áudio como "no".
Exporte o modelo com pré-processamento
O modelo não é muito fácil de usar se você precisar aplicar essas etapas de pré-processamento antes de passar os dados ao modelo para inferência. Portanto, crie uma versão ponta a ponta:
Teste a execução do modelo "export":
Salve e recarregue o modelo, o modelo recarregado fornece uma saída idêntica:
Próximos passos
Este tutorial demonstrou como realizar uma classificação de áudio simples/reconhecimento automático de fala usando uma rede neural convolucional com TensorFlow e Python. Para saber mais, considere os seguintes recursos:
O tutorial Sound classification with YAMNet (Classificação de som com YAMNet) mostra como usar o aprendizado por transferência para classificação de áudio.
Os notebooks do desafio de reconhecimento de fala TensorFlow do Kaggle.
O codelab TensorFlow.js – Reconhecimento de áudio usando aprendizagem por transferência ensina como criar seu próprio aplicativo Web interativo para classificação de áudio.
A tutorial on deep learning for music information retrieval (Um tutorial sobre aprendizagem profunda para recuperação de informação musical) (Choi et al., 2017) em arXiv.
O TensorFlow também oferece suporte adicional para preparação e aumento de dados de áudio para ajudar em seus próprios projetos baseados em áudio.
Considere usar a biblioteca librosa para análise de música e áudio.