IA com Python - reconhecimento de fala
Neste capítulo, aprenderemos sobre o reconhecimento de fala usando IA com Python.
A fala é o meio mais básico de comunicação humana adulta. O objetivo básico do processamento da fala é fornecer uma interação entre um ser humano e uma máquina.
O sistema de processamento de voz tem principalmente três tarefas -
First, reconhecimento de fala que permite que a máquina capte as palavras, frases e sentenças que falamos
Second, processamento de linguagem natural para permitir que a máquina entenda o que falamos, e
Third, síntese de voz para permitir que a máquina fale.
Este capítulo enfoca speech recognition, o processo de compreensão das palavras faladas por seres humanos. Lembre-se de que os sinais de fala são captados com o auxílio de um microfone e então devem ser compreendidos pelo sistema.
Construindo um Reconhecedor de Fala
O reconhecimento de fala ou reconhecimento automático de fala (ASR) é o centro das atenções para projetos de IA, como a robótica. Sem ASR, não é possível imaginar um robô cognitivo interagindo com um humano. No entanto, não é muito fácil construir um reconhecedor de fala.
Dificuldades em desenvolver um sistema de reconhecimento de voz
O desenvolvimento de um sistema de reconhecimento de voz de alta qualidade é realmente um problema difícil. A dificuldade da tecnologia de reconhecimento de voz pode ser amplamente caracterizada ao longo de uma série de dimensões, conforme discutido abaixo -
Size of the vocabulary- O tamanho do vocabulário afeta a facilidade de desenvolvimento de um ASR. Considere os seguintes tamanhos de vocabulário para uma melhor compreensão.
Um vocabulário de tamanho pequeno consiste em 2-100 palavras, por exemplo, como em um sistema de menu de voz
Um vocabulário de tamanho médio consiste em várias centenas a 1.000 de palavras, por exemplo, como em uma tarefa de recuperação de banco de dados
Um vocabulário de tamanho grande consiste em vários 10.000 palavras, como em uma tarefa de ditado geral.
Channel characteristics- A qualidade do canal também é uma dimensão importante. Por exemplo, a fala humana contém alta largura de banda com faixa de frequência total, enquanto a fala por telefone consiste em baixa largura de banda com faixa de frequência limitada. Observe que é mais difícil no último.
Speaking mode- A facilidade de desenvolver um ASR também depende do modo de fala, ou seja, se a fala está em modo de palavra isolada, ou modo de palavra conectada, ou em modo de fala contínua. Observe que uma fala contínua é mais difícil de reconhecer.
Speaking style- Um discurso lido pode ser em estilo formal ou espontâneo e coloquial com estilo casual. Este último é mais difícil de reconhecer.
Speaker dependency- A fala pode ser dependente do locutor, adaptável do locutor ou independente do locutor. Um alto-falante independente é o mais difícil de construir.
Type of noise- O ruído é outro fator a considerar ao desenvolver um ASR. A relação sinal-ruído pode estar em vários intervalos, dependendo do ambiente acústico que observa menos ou mais ruído de fundo -
Se a relação sinal-ruído for maior que 30dB, é considerada uma faixa alta
Se a relação sinal-ruído estiver entre 30dB e 10db, é considerado como SNR médio
Se a relação sinal-ruído for inferior a 10dB, é considerada uma faixa baixa
Microphone characteristics- A qualidade do microfone pode ser boa, média ou abaixo da média. Além disso, a distância entre a boca e o microfone pode variar. Esses fatores também devem ser considerados para sistemas de reconhecimento.
Observe que quanto maior o tamanho do vocabulário, mais difícil é realizar o reconhecimento.
Por exemplo, o tipo de ruído de fundo como estacionário, ruído não humano, fala de fundo e diafonia de outros alto-falantes também contribui para a dificuldade do problema.
Apesar dessas dificuldades, os pesquisadores trabalharam muito em vários aspectos da fala, como entender o sinal da fala, o locutor e identificar os sotaques.
Você terá que seguir as etapas abaixo para construir um reconhecedor de fala -
Visualizando sinais de áudio - Lendo de um arquivo e trabalhando nele
Esta é a primeira etapa na construção de um sistema de reconhecimento de voz, pois dá uma compreensão de como um sinal de áudio é estruturado. Algumas etapas comuns que podem ser seguidas para trabalhar com sinais de áudio são as seguintes -
Gravação
Quando você tiver que ler o sinal de áudio de um arquivo, grave-o usando um microfone, primeiro.
Amostragem
Ao gravar com microfone, os sinais são armazenados em formato digitalizado. Mas para trabalhar nisso, a máquina precisa deles na forma numérica discreta. Portanto, devemos realizar a amostragem em uma certa frequência e converter o sinal na forma numérica discreta. A escolha da alta frequência para amostragem implica que, quando os humanos ouvem o sinal, eles o sentem como um sinal de áudio contínuo.
Exemplo
O exemplo a seguir mostra uma abordagem passo a passo para analisar um sinal de áudio, usando Python, que é armazenado em um arquivo. A frequência deste sinal de áudio é 44.100 Hz.
Importe os pacotes necessários conforme mostrado aqui -
import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile
Agora, leia o arquivo de áudio armazenado. Ele retornará dois valores: a frequência de amostragem e o sinal de áudio. Forneça o caminho do arquivo de áudio onde ele está armazenado, conforme mostrado aqui -
frequency_sampling, audio_signal = wavfile.read("/Users/admin/audio_file.wav")
Exiba os parâmetros como frequência de amostragem do sinal de áudio, tipo de dados do sinal e sua duração, usando os comandos mostrados -
print('\nSignal shape:', audio_signal.shape)
print('Signal Datatype:', audio_signal.dtype)
print('Signal duration:', round(audio_signal.shape[0] /
float(frequency_sampling), 2), 'seconds')
Esta etapa envolve a normalização do sinal conforme mostrado abaixo -
audio_signal = audio_signal / np.power(2, 15)
Nesta etapa, estamos extraindo os primeiros 100 valores desse sinal para visualização. Use os seguintes comandos para este propósito -
audio_signal = audio_signal [:100]
time_axis = 1000 * np.arange(0, len(signal), 1) / float(frequency_sampling)
Agora, visualize o sinal usando os comandos fornecidos abaixo -
plt.plot(time_axis, signal, color='blue')
plt.xlabel('Time (milliseconds)')
plt.ylabel('Amplitude')
plt.title('Input audio signal')
plt.show()
Você seria capaz de ver um gráfico de saída e dados extraídos para o sinal de áudio acima, conforme mostrado na imagem aqui
Signal shape: (132300,)
Signal Datatype: int16
Signal duration: 3.0 seconds
Caracterizando o Sinal de Áudio: Transformando em Domínio de Freqüência
A caracterização de um sinal de áudio envolve a conversão do sinal do domínio do tempo em domínio da frequência e a compreensão de seus componentes de frequência. Esta é uma etapa importante porque fornece muitas informações sobre o sinal. Você pode usar uma ferramenta matemática como a transformada de Fourier para realizar essa transformação.
Exemplo
O exemplo a seguir mostra, passo a passo, como caracterizar o sinal, em Python, que fica armazenado em um arquivo. Observe que aqui estamos usando a ferramenta matemática transformada de Fourier para convertê-la no domínio da frequência.
Importe os pacotes necessários, conforme mostrado aqui -
import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile
Agora, leia o arquivo de áudio armazenado. Ele retornará dois valores: a frequência de amostragem e o sinal de áudio. Forneça o caminho do arquivo de áudio onde ele está armazenado, conforme mostrado no comando aqui -
frequency_sampling, audio_signal = wavfile.read("/Users/admin/sample.wav")
Nesta etapa, exibiremos os parâmetros como frequência de amostragem do sinal de áudio, tipo de dados do sinal e sua duração, usando os comandos fornecidos abaixo -
print('\nSignal shape:', audio_signal.shape)
print('Signal Datatype:', audio_signal.dtype)
print('Signal duration:', round(audio_signal.shape[0] /
float(frequency_sampling), 2), 'seconds')
Nesta etapa, precisamos normalizar o sinal, conforme mostrado no seguinte comando -
audio_signal = audio_signal / np.power(2, 15)
Esta etapa envolve a extração do comprimento e metade do comprimento do sinal. Use os seguintes comandos para este propósito -
length_signal = len(audio_signal)
half_length = np.ceil((length_signal + 1) / 2.0).astype(np.int)
Agora, precisamos aplicar ferramentas matemáticas para a transformação no domínio da frequência. Aqui estamos usando a transformada de Fourier.
signal_frequency = np.fft.fft(audio_signal)
Agora, faça a normalização do sinal no domínio da frequência e eleve-o ao quadrado -
signal_frequency = abs(signal_frequency[0:half_length]) / length_signal
signal_frequency **= 2
Em seguida, extraia o comprimento e metade do comprimento do sinal transformado de frequência -
len_fts = len(signal_frequency)
Observe que o sinal transformado de Fourier deve ser ajustado para casos pares e ímpares.
if length_signal % 2:
signal_frequency[1:len_fts] *= 2
else:
signal_frequency[1:len_fts-1] *= 2
Agora, extraia a potência em decibal (dB) -
signal_power = 10 * np.log10(signal_frequency)
Ajuste a frequência em kHz para o eixo X -
x_axis = np.arange(0, len_half, 1) * (frequency_sampling / length_signal) / 1000.0
Agora, visualize a caracterização do sinal da seguinte forma -
plt.figure()
plt.plot(x_axis, signal_power, color='black')
plt.xlabel('Frequency (kHz)')
plt.ylabel('Signal power (dB)')
plt.show()
Você pode observar o gráfico de saída do código acima, conforme mostrado na imagem abaixo -
Gerando Sinal de Áudio Monótono
As duas etapas que você viu até agora são importantes para aprender sobre os sinais. Agora, esta etapa será útil se você deseja gerar o sinal de áudio com alguns parâmetros predefinidos. Observe que esta etapa salvará o sinal de áudio em um arquivo de saída.
Exemplo
No exemplo a seguir, vamos gerar um sinal monótono, usando Python, que será armazenado em um arquivo. Para isso, você terá que seguir os seguintes passos -
Importe os pacotes necessários conforme mostrado -
import numpy as np
import matplotlib.pyplot as plt
from scipy.io.wavfile import write
Forneça o arquivo onde o arquivo de saída deve ser salvo
output_file = 'audio_signal_generated.wav'
Agora, especifique os parâmetros de sua escolha, como mostrado -
duration = 4 # in seconds
frequency_sampling = 44100 # in Hz
frequency_tone = 784
min_val = -4 * np.pi
max_val = 4 * np.pi
Nesta etapa, podemos gerar o sinal de áudio, conforme mostrado -
t = np.linspace(min_val, max_val, duration * frequency_sampling)
audio_signal = np.sin(2 * np.pi * tone_freq * t)
Agora, salve o arquivo de áudio no arquivo de saída -
write(output_file, frequency_sampling, signal_scaled)
Extraia os primeiros 100 valores para o nosso gráfico, conforme mostrado -
audio_signal = audio_signal[:100]
time_axis = 1000 * np.arange(0, len(signal), 1) / float(sampling_freq)
Agora, visualize o sinal de áudio gerado da seguinte forma -
plt.plot(time_axis, signal, color='blue')
plt.xlabel('Time in milliseconds')
plt.ylabel('Amplitude')
plt.title('Generated audio signal')
plt.show()
Você pode observar o gráfico conforme mostrado na figura dada aqui -
Extração de recurso da fala
Esta é a etapa mais importante na construção de um reconhecedor de fala porque, depois de converter o sinal de fala no domínio da frequência, devemos convertê-lo na forma utilizável de vetor de características. Podemos usar diferentes técnicas de extração de recursos como MFCC, PLP, PLP-RASTA etc. para esse propósito.
Exemplo
No exemplo a seguir, vamos extrair os recursos do sinal, passo a passo, usando Python, usando a técnica MFCC.
Importe os pacotes necessários, conforme mostrado aqui -
import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile
from python_speech_features import mfcc, logfbank
Agora, leia o arquivo de áudio armazenado. Ele retornará dois valores - a frequência de amostragem e o sinal de áudio. Forneça o caminho do arquivo de áudio onde ele está armazenado.
frequency_sampling, audio_signal = wavfile.read("/Users/admin/audio_file.wav")
Observe que aqui estamos pegando as primeiras 15.000 amostras para análise.
audio_signal = audio_signal[:15000]
Use as técnicas do MFCC e execute o seguinte comando para extrair os recursos do MFCC -
features_mfcc = mfcc(audio_signal, frequency_sampling)
Agora, imprima os parâmetros MFCC, como mostrado -
print('\nMFCC:\nNumber of windows =', features_mfcc.shape[0])
print('Length of each feature =', features_mfcc.shape[1])
Agora, plote e visualize os recursos MFCC usando os comandos fornecidos abaixo -
features_mfcc = features_mfcc.T
plt.matshow(features_mfcc)
plt.title('MFCC')
Nesta etapa, trabalhamos com os recursos do banco de filtros, conforme mostrado -
Extraia os recursos do banco de filtros -
filterbank_features = logfbank(audio_signal, frequency_sampling)
Agora, imprima os parâmetros do banco de filtros.
print('\nFilter bank:\nNumber of windows =', filterbank_features.shape[0])
print('Length of each feature =', filterbank_features.shape[1])
Agora, plote e visualize os recursos do banco de filtros.
filterbank_features = filterbank_features.T
plt.matshow(filterbank_features)
plt.title('Filter bank')
plt.show()
Como resultado das etapas acima, você pode observar as seguintes saídas: Figura 1 para MFCC e Figura 2 para Banco de filtros
Reconhecimento de palavras faladas
O reconhecimento de fala significa que, quando os humanos estão falando, uma máquina o entende. Aqui, estamos usando a API do Google Speech em Python para fazer isso acontecer. Precisamos instalar os seguintes pacotes para isso -
Pyaudio - Pode ser instalado usando pip install Pyaudio comando.
SpeechRecognition - Este pacote pode ser instalado usando pip install SpeechRecognition.
Google-Speech-API - Pode ser instalado usando o comando pip install google-api-python-client.
Exemplo
Observe o exemplo a seguir para entender sobre o reconhecimento de palavras faladas -
Importe os pacotes necessários conforme mostrado -
import speech_recognition as sr
Crie um objeto como mostrado abaixo -
recording = sr.Recognizer()
Agora o Microphone() o módulo terá a voz como entrada -
with sr.Microphone() as source: recording.adjust_for_ambient_noise(source)
print("Please Say something:")
audio = recording.listen(source)
Agora, a API do Google reconheceria a voz e forneceria a saída.
try:
print("You said: \n" + recording.recognize_google(audio))
except Exception as e:
print(e)
Você pode ver a seguinte saída -
Please Say Something:
You said:
Por exemplo, se você disse tutorialspoint.com, então o sistema o reconhece corretamente da seguinte maneira -
tutorialspoint.com