Para el reconocimiento de voz en inglés con ROS (Robot Operating System) vamos a utilizar el paquete pocketsphinx desarrollado por la Universidad Carnegie Mellon en Pittsburgh, Pennsylvania, está escrito en lenguaje C y es una de las versiones del proyecto CMUSphinx o también conocido con un término más corto como Sphinx.

Antes que nada es muy importante tener en cuenta que se necesita tener un micrófono externo para tener una mejor experiencia ya que los micrófonos que vienen incorporados en los dispositivos no suelen tener buena calidad.

Paquete Pocketsphinx

Dentro del paquete pocketsphinx, se encuentra el nodo recognizer.py que es un script desarrollado en Python. Este nodo se conecta al stream de audio entrante del ordenador, capturando las palabras a través del micrófono y empareja los comandos de voz con palabras o frases que se encuentran en el vocabulario actual (corpus), luego el reconocimiento de la frase será enviado por el tópico /recognizer/output, utilizando un mensaje de tipo std_msgs/String. El nodo recognizer.py necesita dos ficheros para poder funcionar correctamente: un modelo de lenguaje y un diccionario de palabras.

  • Modelo de Lenguaje: ayuda a restringir de manera significativa el proceso de emparejamiento eliminando palabras que no son probables, sirve para describir un lenguaje complejo. El modelo de lenguaje se almacena en un fichero de extensión .lm.

  • Diccionario: contiene las palabras y los fonemas que componen cada palabra que se va a usar. Se almacena en un fichero de texto con extensión .dic.

Estos dos ficheros se encuentran dentro de la carpeta demo del paquete pocketsphinx siendo la ruta la siguiente: /opt/ros/indigo/share/pocketsphinx/demo

Allí se encuentra el fichero del diccionario voice_cmd.dic y el del modelo de lenguaje voide_cmd.lm.

Uso del Paquete Pocketsphinx

Lo primero es abrir la terminal y lanzar el nodo maestro ejecutando el comando:

roscore

Abrimos otra terminal para imprimir por pantalla las palabras que se encuentran en el diccionario dentro de la carpeta demo, ya que son los comandos básicos que serán reconocidos. Para hacer esto podemos ejecutar lo siguiente:

cat voice_cmd.dic

En otra terminal podemos iniciar el reconocedor de voz con el comando:

roslaunch pocketsphinx voice_cmd.launch

Para verificar si las palabras son reconocidas abrimos otra terminal y ejecutamos:

rostopic echo /recognizer/output

Luego comenzamos a pronunciar a través del micrófono las palabras que se encuentran en el diccionario voice_cmd.dic que estamos utilizando en este caso.

Por otra parte también podemos generar nuestros propios ficheros de diccionario (.dic) y modelo de lenguaje (.lm) a través de un fichero de texto donde hayamos incluido nuestras propias palabras o frases.

Entonces creamos nuestro fichero de texto con las palabras que deseemos incluir sin símbolos de puntuación, en este caso el fichero es llamado corpus.txt, para crear este vocabulario para el reconocimiento de voz, tenemos que subir nuestro archivo corpus.txt al siguiente enlace y compilarlo:

http://www.speech.cs.cmu.edu/tools/lmtool-new.html

Descargamos el archivo comprimido en .tgz que nos generó la página, luego lo descomprimimos y pasamos a la carpeta misc de nuestro paquete.

Vamos a nuestro directorio de launch donde debemos crear un launcher(.launch) para poder ejecutar el programa de reconocimiento de voz donde utilizaremos el vocabulario que hemos creado, llamando así a nuestro modelo de lenguaje y diccionario.

En una terminal imprimimos por pantalla nuestro diccionario que se encuentra en la carpeta misc:

cat corpus.txt

Abrimos otra terminal para iniciar el reconocimiento de voz con launch que hemos creado, simplemente debemos ejecutar el siguiente comando:

roslaunch speech_recognition custom_recognizer.launch

Los resultados de reconocimiento de voz se publican en el tópico recognizer/output por lo que en otra terminal ejecutamos el comando:

rostopic echo /recognizer/output

Podemos comenzar a pronunciar a través del micrófono las palabras de nuestro diccionario.

Los invito a ver más de este tema en el curso que ofrece OpenWebinars sobre Introducción a la Programación en ROS.

Artículo desarrollado a partir del vídeo por Jhuly Acosta.