IA con Python: reconocimiento de voz

En este capítulo, aprenderemos sobre el reconocimiento de voz usando IA con Python.

El habla es el medio más básico de comunicación humana adulta. El objetivo básico del procesamiento del habla es proporcionar una interacción entre un ser humano y una máquina.

El sistema de procesamiento del habla tiene principalmente tres tareas:

  • First, reconocimiento de voz que permite a la máquina captar las palabras, frases y oraciones que decimos

  • Second, procesamiento del lenguaje natural para permitir que la máquina entienda lo que hablamos, y

  • Third, síntesis de voz para permitir que la máquina hable.

Este capítulo se centra en speech recognition, el proceso de comprensión de las palabras pronunciadas por los seres humanos. Recuerde que las señales de voz se capturan con la ayuda de un micrófono y luego debe ser entendido por el sistema.

Construyendo un reconocedor de voz

El reconocimiento de voz o el reconocimiento automático de voz (ASR) es el centro de atención para proyectos de IA como la robótica. Sin ASR, no es posible imaginar un robot cognitivo interactuando con un humano. Sin embargo, no es fácil construir un reconocedor de voz.

Dificultades para desarrollar un sistema de reconocimiento de voz

Desarrollar un sistema de reconocimiento de voz de alta calidad es realmente un problema difícil. La dificultad de la tecnología de reconocimiento de voz se puede caracterizar ampliamente a lo largo de una serie de dimensiones, como se analiza a continuación:

  • Size of the vocabulary- El tamaño del vocabulario afecta la facilidad de desarrollar un ASR. Considere los siguientes tamaños de vocabulario para una mejor comprensión.

    • Un vocabulario de tamaño pequeño consta de 2-100 palabras, por ejemplo, como en un sistema de menú de voz

    • Un vocabulario de tamaño mediano consta de varios cientos a miles de palabras, por ejemplo, como en una tarea de recuperación de una base de datos.

    • Un vocabulario de gran tamaño consta de varias decenas de palabras, como en una tarea de dictado general.

    Tenga en cuenta que, cuanto mayor sea el tamaño del vocabulario, más difícil será realizar el reconocimiento.

  • Channel characteristics- La calidad del canal también es una dimensión importante. Por ejemplo, el habla humana contiene un ancho de banda alto con un rango de frecuencia completo, mientras que un habla telefónica consta de un ancho de banda bajo con un rango de frecuencia limitado. Tenga en cuenta que es más difícil en este último.

  • Speaking mode- La facilidad para desarrollar un ASR también depende del modo de habla, es decir, si el habla está en modo de palabra aislada, en modo de palabra conectada o en modo de habla continua. Tenga en cuenta que un discurso continuo es más difícil de reconocer.

  • Speaking style- Un discurso leído puede ser en un estilo formal o espontáneo y conversacional con un estilo casual. Este último es más difícil de reconocer.

  • Speaker dependency- El habla puede depender del hablante, adaptarse al hablante o ser independiente del hablante. Un altavoz independiente es el más difícil de construir.

  • Type of noise- El ruido es otro factor a considerar al desarrollar un ASR. La relación señal / ruido puede estar en varios rangos, según el entorno acústico que observa menos ruido de fondo frente a más ruido de fondo.

    • Si la relación señal / ruido es superior a 30 dB, se considera de rango alto.

    • Si la relación señal / ruido se encuentra entre 30dB y 10db, se considera como SNR medio.

    • Si la relación señal / ruido es inferior a 10 dB, se considera de rango bajo.

    Por ejemplo, el tipo de ruido de fondo, como el ruido estacionario, no humano, el habla de fondo y la diafonía de otros hablantes también contribuye a la dificultad del problema.

  • Microphone characteristics- La calidad del micrófono puede ser buena, media o inferior a la media. Además, la distancia entre la boca y el micrófono puede variar. Estos factores también deben tenerse en cuenta para los sistemas de reconocimiento.

A pesar de estas dificultades, los investigadores trabajaron mucho en varios aspectos del habla, como comprender la señal del habla, el hablante e identificar los acentos.

Deberá seguir los pasos que se indican a continuación para crear un reconocedor de voz:

Visualización de señales de audio: lectura de un archivo y trabajo en él

Este es el primer paso en la construcción de un sistema de reconocimiento de voz, ya que permite comprender cómo está estructurada una señal de audio. Algunos pasos comunes que se pueden seguir para trabajar con señales de audio son los siguientes:

Grabación

Cuando tenga que leer la señal de audio de un archivo, primero grábelo usando un micrófono.

Muestreo

Al grabar con micrófono, las señales se almacenan en forma digitalizada. Pero para trabajar con él, la máquina los necesita en forma numérica discreta. Por tanto, deberíamos realizar un muestreo a una determinada frecuencia y convertir la señal en forma numérica discreta. La elección de la alta frecuencia para el muestreo implica que cuando los humanos escuchan la señal, la sienten como una señal de audio continua.

Ejemplo

El siguiente ejemplo muestra un enfoque paso a paso para analizar una señal de audio, utilizando Python, que se almacena en un archivo. La frecuencia de esta señal de audio es 44,100 HZ.

Importe los paquetes necesarios como se muestra aquí -

import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile

Ahora, lea el archivo de audio almacenado. Devolverá dos valores: la frecuencia de muestreo y la señal de audio. Proporcione la ruta del archivo de audio donde está almacenado, como se muestra aquí:

frequency_sampling, audio_signal = wavfile.read("/Users/admin/audio_file.wav")

Visualice los parámetros como la frecuencia de muestreo de la señal de audio, el tipo de datos de la señal y su duración, utilizando los comandos que se muestran:

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

Este paso implica normalizar la señal como se muestra a continuación:

audio_signal = audio_signal / np.power(2, 15)

En este paso, extraemos los primeros 100 valores de esta señal para visualizar. Utilice los siguientes comandos para este propósito:

audio_signal = audio_signal [:100]
time_axis = 1000 * np.arange(0, len(signal), 1) / float(frequency_sampling)

Ahora, visualice la señal usando los comandos que se dan a continuación:

plt.plot(time_axis, signal, color='blue')
plt.xlabel('Time (milliseconds)')
plt.ylabel('Amplitude')
plt.title('Input audio signal')
plt.show()

Podrá ver un gráfico de salida y datos extraídos para la señal de audio anterior como se muestra en la imagen aquí

Signal shape: (132300,)
Signal Datatype: int16
Signal duration: 3.0 seconds

Caracterización de la señal de audio: transformación al dominio de la frecuencia

Caracterizar una señal de audio implica convertir la señal en el dominio del tiempo en el dominio de la frecuencia y comprender sus componentes de frecuencia mediante. Este es un paso importante porque brinda mucha información sobre la señal. Puede utilizar una herramienta matemática como la Transformada de Fourier para realizar esta transformación.

Ejemplo

El siguiente ejemplo muestra, paso a paso, cómo caracterizar la señal, utilizando Python, que se almacena en un archivo. Tenga en cuenta que aquí estamos utilizando la herramienta matemática Transformada de Fourier para convertirla en el dominio de frecuencia.

Importe los paquetes necesarios, como se muestra aquí -

import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile

Ahora, lea el archivo de audio almacenado. Devolverá dos valores: la frecuencia de muestreo y la señal de audio. Proporcione la ruta del archivo de audio donde se almacena como se muestra en el comando aquí -

frequency_sampling, audio_signal = wavfile.read("/Users/admin/sample.wav")

En este paso, mostraremos los parámetros como la frecuencia de muestreo de la señal de audio, el tipo de datos de la señal y su duración, utilizando los comandos que se indican a continuación:

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

En este paso, necesitamos normalizar la señal, como se muestra en el siguiente comando:

audio_signal = audio_signal / np.power(2, 15)

Este paso implica extraer la longitud y la mitad de la señal. Utilice los siguientes comandos para este propósito:

length_signal = len(audio_signal)
half_length = np.ceil((length_signal + 1) / 2.0).astype(np.int)

Ahora, necesitamos aplicar herramientas matemáticas para transformar en dominio de frecuencia. Aquí estamos usando la Transformada de Fourier.

signal_frequency = np.fft.fft(audio_signal)

Ahora, haga la normalización de la señal de dominio de frecuencia y cuadrela -

signal_frequency = abs(signal_frequency[0:half_length]) / length_signal
signal_frequency **= 2

A continuación, extraiga la longitud y la mitad de la señal transformada en frecuencia:

len_fts = len(signal_frequency)

Tenga en cuenta que la señal transformada de Fourier debe ajustarse tanto para casos pares como impares.

if length_signal % 2:
   signal_frequency[1:len_fts] *= 2
else:
   signal_frequency[1:len_fts-1] *= 2

Ahora, extraiga la potencia en decibal (dB) -

signal_power = 10 * np.log10(signal_frequency)

Ajuste la frecuencia en kHz para el eje X -

x_axis = np.arange(0, len_half, 1) * (frequency_sampling / length_signal) / 1000.0

Ahora, visualice la caracterización de la señal de la siguiente manera:

plt.figure()
plt.plot(x_axis, signal_power, color='black')
plt.xlabel('Frequency (kHz)')
plt.ylabel('Signal power (dB)')
plt.show()

Puede observar el gráfico de salida del código anterior como se muestra en la imagen a continuación:

Generando señal de audio monótona

Los dos pasos que ha visto hasta ahora son importantes para aprender sobre las señales. Ahora bien, este paso será útil si desea generar la señal de audio con algunos parámetros predefinidos. Tenga en cuenta que este paso guardará la señal de audio en un archivo de salida.

Ejemplo

En el siguiente ejemplo, vamos a generar una señal monótona, usando Python, que será almacenada en un archivo. Para ello, deberá seguir los siguientes pasos:

Importe los paquetes necesarios como se muestra:

import numpy as np
import matplotlib.pyplot as plt
from scipy.io.wavfile import write

Proporcione el archivo donde se debe guardar el archivo de salida

output_file = 'audio_signal_generated.wav'

Ahora, especifique los parámetros de su elección, como se muestra:

duration = 4 # in seconds
frequency_sampling = 44100 # in Hz
frequency_tone = 784
min_val = -4 * np.pi
max_val = 4 * np.pi

En este paso, podemos generar la señal de audio, como se muestra:

t = np.linspace(min_val, max_val, duration * frequency_sampling)
audio_signal = np.sin(2 * np.pi * tone_freq * t)

Ahora, guarde el archivo de audio en el archivo de salida:

write(output_file, frequency_sampling, signal_scaled)

Extraiga los primeros 100 valores para nuestro gráfico, como se muestra:

audio_signal = audio_signal[:100]
time_axis = 1000 * np.arange(0, len(signal), 1) / float(sampling_freq)

Ahora, visualice la señal de audio generada de la siguiente manera:

plt.plot(time_axis, signal, color='blue')
plt.xlabel('Time in milliseconds')
plt.ylabel('Amplitude')
plt.title('Generated audio signal')
plt.show()

Puede observar la trama como se muestra en la figura que se muestra aquí:

Extracción de características del habla

Este es el paso más importante en la construcción de un reconocedor de voz porque después de convertir la señal de voz en el dominio de frecuencia, debemos convertirla en la forma utilizable de vector de características. Podemos utilizar diferentes técnicas de extracción de características como MFCC, PLP, PLP-RASTA, etc. para este propósito.

Ejemplo

En el siguiente ejemplo, vamos a extraer las características de la señal, paso a paso, usando Python, usando la técnica MFCC.

Importe los paquetes necesarios, como se muestra aquí -

import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile
from python_speech_features import mfcc, logfbank

Ahora, lea el archivo de audio almacenado. Devolverá dos valores: la frecuencia de muestreo y la señal de audio. Proporcione la ruta del archivo de audio donde está almacenado.

frequency_sampling, audio_signal = wavfile.read("/Users/admin/audio_file.wav")

Tenga en cuenta que aquí estamos tomando las primeras 15000 muestras para su análisis.

audio_signal = audio_signal[:15000]

Utilice las técnicas de MFCC y ejecute el siguiente comando para extraer las características de MFCC:

features_mfcc = mfcc(audio_signal, frequency_sampling)

Ahora, imprima los parámetros de MFCC, como se muestra:

print('\nMFCC:\nNumber of windows =', features_mfcc.shape[0])
print('Length of each feature =', features_mfcc.shape[1])

Ahora, trace y visualice las características de MFCC usando los comandos que se dan a continuación:

features_mfcc = features_mfcc.T
plt.matshow(features_mfcc)
plt.title('MFCC')

En este paso, trabajamos con las características del banco de filtros como se muestra:

Extraiga las características del banco de filtros -

filterbank_features = logfbank(audio_signal, frequency_sampling)

Ahora, imprima los parámetros del banco de filtros.

print('\nFilter bank:\nNumber of windows =', filterbank_features.shape[0])
print('Length of each feature =', filterbank_features.shape[1])

Ahora, trace y visualice las características del banco de filtros.

filterbank_features = filterbank_features.T
plt.matshow(filterbank_features)
plt.title('Filter bank')
plt.show()

Como resultado de los pasos anteriores, puede observar las siguientes salidas: Figura 1 para MFCC y Figura 2 para Banco de filtros

Reconocimiento de palabras habladas

El reconocimiento de voz significa que cuando los humanos están hablando, una máquina lo entiende. Aquí estamos usando la API de Google Speech en Python para que esto suceda. Necesitamos instalar los siguientes paquetes para esto:

  • Pyaudio - Se puede instalar usando pip install Pyaudio mando.

  • SpeechRecognition - Este paquete se puede instalar usando pip install SpeechRecognition.

  • Google-Speech-API - Se puede instalar usando el comando pip install google-api-python-client.

Ejemplo

Observe el siguiente ejemplo para comprender el reconocimiento de palabras habladas:

Importe los paquetes necesarios como se muestra:

import speech_recognition as sr

Cree un objeto como se muestra a continuación:

recording = sr.Recognizer()

Ahora el Microphone() el módulo tomará la voz como entrada -

with sr.Microphone() as source: recording.adjust_for_ambient_noise(source)
   print("Please Say something:")
   audio = recording.listen(source)

Ahora la API de Google reconocería la voz y daría la salida.

try:
   print("You said: \n" + recording.recognize_google(audio))
except Exception as e:
   print(e)

Puede ver el siguiente resultado:

Please Say Something:
You said:

Por ejemplo, si dijiste tutorialspoint.com, entonces el sistema lo reconoce correctamente de la siguiente manera:

tutorialspoint.com