Introducción al reconocimiento de voz con Python

El reconocimiento de voz es una de las tareas más importantes en la interacción humano-computadora. Usaremos la biblioteca SpeechRecognition para realizar esta tarea en Python.

El reconocimiento de voz, como su nombre indica, se refiere al reconocimiento automático del habla humana. El reconocimiento de voz es una de las tareas más importantes en el dominio de la interacción humano-computadora. Si alguna vez ha interactuado con Alexa o le ha ordenado a Siri que complete una tarea, ya ha experimentado el poder del reconocimiento de voz.

El reconocimiento de voz tiene varias aplicaciones que van desde la transcripción automática de datos de voz (como mensajes de voz) hasta la interacción con robots a través del habla.

En este tutorial, verá cómo podemos desarrollar una aplicación de reconocimiento de voz muy simple que sea capaz de reconocer el habla de archivos de audio, así como en vivo desde un micrófono. Entonces, comencemos sin más preámbulos.

Se han desarrollado varias bibliotecas de reconocimiento de voz en Python. Sin embargo, usaremos la biblioteca Reconocimiento de voz, que es la más simple de todas las bibliotecas.

Instalación de la biblioteca de reconocimiento de voz {#instalación de la biblioteca de reconocimiento de voz}

Ejecute el siguiente comando para instalar la biblioteca:

1
$ pip install SpeechRecognition

Reconocimiento de voz desde archivos de audio

En esta sección, verá cómo podemos traducir el habla de un archivo de audio a texto. El archivo de audio que usaremos como entrada se puede descargar desde este enlace. Descargue el archivo a su sistema de archivos local.

El primer paso, como siempre, es importar las bibliotecas requeridas. En este caso, solo necesitamos importar la biblioteca speech_recognition que acabamos de descargar.

1
import speech_recognition as speech_recog

Para convertir voz a texto, la única clase que necesitamos es la clase Recognizer del módulo speech_recognition. Dependiendo de la API subyacente utilizada para convertir la voz en texto, la clase Recognizer tiene los siguientes métodos:

  • recognize_bing(): utiliza la API de voz de Microsoft Bing
  • recognize_google(): utiliza la API de voz de Google
  • recognize_google_cloud(): utiliza la API de Google Cloud Speech
  • recognize_houndify(): utiliza la API Houndify de SoundHound
  • recognize_ibm(): utiliza IBM Speech to Text API
  • recognize_sphinx(): Utiliza la API de PocketSphinx

Entre todos los métodos anteriores, el método recognize_sphinx() se puede usar sin conexión para traducir voz a texto.

Para reconocer el habla de un archivo de audio, tenemos que crear un objeto de la clase AudioFile del módulo speech_recognition. La ruta del archivo de audio que desea traducir a texto se pasa al constructor de la clase AudioFile. Ejecute el siguiente script:

1
sample_audio = speech_recog.AudioFile('E:/Datasets/my_audio.wav')

En el código anterior, actualice la ruta al archivo de audio que desea transcribir.

Usaremos el método recognize_google() para transcribir nuestros archivos de audio. Sin embargo, el método recognize_google() requiere el objeto AudioData del módulo speech_recognition como parámetro. Para convertir nuestro archivo de audio en un objeto AudioData, podemos usar el método record() de la clase Recognizer. Necesitamos pasar el objeto AudioFile al método record(), como se muestra a continuación:

1
2
with sample_audio as audio_file:
    audio_content = recog.record(audio_file)

Ahora, si verifica el tipo de la variable audio_content, verá que tiene el tipo speech_recognition.AudioData.

1
type(audio_content)

Producción:

1
speech_recognition.AudioData

Ahora podemos simplemente pasar el objeto audio_content al método recognize_google() del objeto de clase Recognizer() y el archivo de audio se convertirá en texto. Ejecute el siguiente script:

1
recog.recognize_google(audio_content)

Producción:

1
'Bristol O2 left shoulder take the winding path to reach the lake no closely the size of the gas tank degrees office 30 face before you go out the race was badly strained and hung them the stray cat gave birth to kittens the young girl gave no clear response the meal was called before the bells ring what weather is in living'

La salida anterior muestra el texto del archivo de audio. Puede ver que el archivo no se ha transcrito correctamente al 100%, pero la precisión es bastante razonable.

Configuración de la duración y los valores de compensación

En lugar de transcribir el discurso completo, también puede transcribir un segmento particular del archivo de audio. Por ejemplo, si desea transcribir solo los primeros 10 segundos del archivo de audio, debe pasar 10 como valor para el parámetro duración del método record(). Mira el siguiente guión:

1
2
3
4
5
sample_audio = speech_recog.AudioFile('E:/Datasets/my_audio.wav')
with sample_audio as audio_file:
    audio_content = recog.record(audio_file, duration=10)

recog.recognize_google(audio_content)

Producción:

1
'Bristol O2 left shoulder take the winding path to reach the lake no closely the size of the gas'

De la misma forma, puedes saltarte alguna parte del archivo de audio desde el principio usando el parámetro offset. Por ejemplo, si no desea transcribir los primeros 4 segundos del audio, pase 4 como valor para el atributo offset. Como ejemplo, el siguiente script omite los primeros 4 segundos del archivo de audio y luego transcribe el archivo de audio durante 10 segundos.

1
2
3
4
5
sample_audio = speech_recog.AudioFile('E:/Datasets/my_audio.wav')
with sample_audio as audio_file:
    audio_content = recog.record(audio_file, offset=4, duration=10)

recog.recognize_google(audio_content)

Producción:

1
'take the winding path to reach the lake no closely the size of the gas tank web degrees office dirty face'

Ruido de manejo {#ruido de manejo}

Un archivo de audio puede contener ruido debido a varias razones. El ruido puede afectar la calidad de la traducción de voz a texto. Para reducir el ruido, la clase Recognizer contiene el método adjust_for_ambient_noise(), que toma el objeto AudioData como parámetro. La siguiente secuencia de comandos muestra cómo puede mejorar la calidad de la transcripción eliminando el ruido del archivo de audio:

1
2
3
4
5
6
sample_audio = speech_recog.AudioFile('E:/Datasets/my_audio.wav')
with sample_audio as audio_file:
    recog.adjust_for_ambient_noise(audio_file)
    audio_content = recog.record(audio_file)

recog.recognize_google(audio_content)

Producción:

1
'Bristol O2 left shoulder take the winding path to reach the lake no closely the size of the gas tank web degrees office 30 face before you go out the race was badly strained and hung them the stray cat gave birth to kittens the younger again no clear response the mail was called before the bells ring what weather is in living'

El resultado es bastante similar al que obtuvimos antes; esto se debe al hecho de que el archivo de audio ya tenía muy poco ruido.

Reconocimiento de voz desde Live Microphone

En esta sección, verá cómo puede transcribir audio en vivo recibido a través de un micrófono en su sistema.

Hay varias formas de procesar la entrada de audio recibida a través del micrófono y se han desarrollado varias bibliotecas para hacerlo. Una de esas bibliotecas es PyAudio. Ejecute el siguiente script para instalar la biblioteca PyAudio:

1
$ pip install PyAudio

Ahora la fuente del audio a transcribir es un micrófono. Para capturar el audio de un micrófono, primero debemos crear un objeto de la clase Microphone del módulo Speach_Recogniton, como se muestra aquí:

1
mic = speech_recog.Microphone()

Para ver la lista de todos los micrófonos en su sistema, puede usar el método list_microphone_names():

1
speech_recog.Microphone.list_microphone_names()

Producción:

1
2
3
4
5
6
7
['Microsoft Sound Mapper - Input',
 'Microphone (Realtek High Defini',
 'Microsoft Sound Mapper - Output',
 'Speakers (Realtek High Definiti',
 'Microphone Array (Realtek HD Audio Mic input)',
 'Speakers (Realtek HD Audio output)',
 'Stereo Mix (Realtek HD Audio Stereo input)']

Esta es una lista de micrófonos disponibles en mi sistema. Tenga en cuenta que su lista probablemente se verá diferente.

El siguiente paso es capturar el audio del micrófono. Para hacerlo, debe llamar al método listen() de la clase Recognizer(). Al igual que el método record(), el método listen() también devuelve el objeto speech_recognition.AudioData, que luego se puede pasar al método recognize_google().

La siguiente secuencia de comandos solicita al usuario que diga algo en el micrófono y luego imprime lo que el usuario haya dicho:

1
2
3
4
5
6
7
8
with mic as audio_file:
    print("Speak Please")

    recog.adjust_for_ambient_noise(audio_file)
    audio = recog.listen(audio_file)

    print("Converting Speech to Text...")
    print("You said: " + recog.recognize_google(audio))

Una vez que ejecute el script anterior, verá el siguiente mensaje:

1
Please say something

En este momento, diga lo que quiera y luego haga una pausa. Una vez que haya hecho una pausa, verá la transcripción de lo que haya dicho. Aquí está la salida que obtuve:

1
2
Converting Speech to Text...
You said: hello this is normally from stack abuse abuse this is an article on speech recognition I hope you will like it and this is just a test speech and when I will stop speaking are you in today thank you for Reading

Es importante mencionar que si el método recognize_google() no puede hacer coincidir las palabras que dices con ninguna de las palabras en su repositorio, se lanza una excepción. Puedes probar esto diciendo algunas palabras ininteligibles. Debería ver la siguiente excepción:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
Speak Please
Converting Speech to Text...
---------------------------------------------------------------------------
UnknownValueError                         Traceback (most recent call last)
<ipython-input-27-41218bc8a239> in <module>
      8     print("Converting Speech to Text...")
      9
---> 10     print("You said: " + recog.recognize_google(audio))
     11
     12

~\Anaconda3\lib\site-packages\speech_recognition\__init__.py in recognize_google(self, audio_data, key, language, show_all)
    856         # return results
    857         if show_all: return actual_result
--> 858         if not isinstance(actual_result, dict) or len(actual_result.get("alternative", [])) == 0: raise UnknownValueError()
    859
    860         if "confidence" in actual_result["alternative"]:

UnknownValueError:

Un mejor enfoque es usar el bloque try cuando se llama al método recognize_google() como se muestra a continuación:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
with mic as audio_file:
    print("Speak Please")

    recog.adjust_for_ambient_noise(audio_file)
    audio = recog.listen(audio_file)

    print("Converting Speech to Text...")

    try:
        print("You said: " + recog.recognize_google(audio))
    except Exception as e:
        print("Error: " + str(e))

Conclusión

El reconocimiento de voz tiene varias aplicaciones útiles en el dominio de la interacción humano-computadora y la transcripción automática de voz. Este artículo explica brevemente el proceso de transcripción de voz en Python a través de la biblioteca speech_recognition y explica cómo traducir voz a texto cuando la fuente de audio es un archivo de audio o un micrófono en vivo.