Social

¡Hola a todos! Esta semana me han regalado una Raspberry Pi 2 por mi cumpleaños, y no he tardado nada en ponerme a trastear con ella. De los proyectos que me rondaban la mente, el que me parecía más interesante es el de Reconocimiento de voz, pero no solo para hacer transcripciones, sino para ejecutar acciones con el GPIO de la Pi.
Así que después de unos días de pruebas y testeos, he conseguido tener un proceso continuo que escucha la entrada de voz para ejecutar comandos como encender o apagar LEDs conectados al GPIO. A partir de aquí se puede hacer cualquier cosa que se nos pase por la imaginación. Queréis saber como hacer justo esto en vuestra Raspberry? Pues a seguir leyendo!

¿Que necesitaremos?
– Una Raspberry Pi, en principio no importa el modelo
– Una tarjeta de sonido USB y un micro, un microfono USB o una WebCam con Micro (por USB).
– Algunos LEDs, yo he utilizado los de una caja de ordenador antigua (led de Power y HD)

Lo primero que haremos será instalar el software libre de reconocimiento de voz, llamado PocketSphinx.
Para ello ejecutaremos los siguientes comandos (algunos requiere elevación). Con esto instalaremos y actualizaremos el software, además de dar preferencia a la tarjeta de audio o entrada por USB a la hora de hacer el reconocimiento de voz.

apt-get install rpi-update
apt-get install git-core
rpi-update

-> Conecta tu micro USB (o camara+micro, o tarjeta sonido + micro) y
-> reinicia la RPi.

vi /etc/modprobe.d/alsa-base.conf 

# Cambiamos lo siguiente:
# Comentamos esta linia
# options snd-usb-audio index=-2
# Y añadimos la siguiente:
options snd-usb-audio index=0

-> Cerramos el archivo y recargamos alsa:

alsa force-reload

wget http://sourceforge.net/projects/cmusphinx/files/sphinxbase/\
0.8/sphinxbase-0.8.tar.gz/download
mv download sphinxbase-0.8.tar.gz
wget http://sourceforge.net/projects/cmusphinx/files/\
pocketsphinx/0.8/pocketsphinx-0.8.tar.gz/download
mv download pocketsphinx-0.8.tar.gz
tar -xzvf sphinxbase-0.8.tar.gz
tar -xzvf pocketsphinx-0.8.tar.gz

apt-get install bison
apt-get install libasound2-dev

cd sphinxbase-0.8
./configure --enable-fixed
make
make install

cd ../pocketsphinx-0.8/
./configure
make
sudo make install

Es recomendable utilizar las ultimas versiones del software.

Una vez instalado podemos ejecutar el comando ./pocketsphinx_continuous para empezar a probar si reconoce la voz.
En el caso de que os de un error de que no encuentra la entrada de audio, ejecutaremos como administrador con sudo.

 Ahora, crearemos unos diccionarios con las palabras que queramos asignar a algunas acciones.
Esto ayudara al software a realizar el Speech to text, ya que solo tendrá que comprobar la entrada de audio con las entradas que nosotros creamos en el diccionario.
En mi caso, cree un diccionario con pocas palabras como: Green On, Red On, Green Off, Red Off. Para encender y apagar los leds.Para crear el diccionario, crea un archivo de texto plano (.txt) con una palabra en cada fila.
Luego entra en la siguiente dirección (LM-TOOL) y sube el archivo txt.
Te mostrará los enlaces para descargar tu diccionario.
Descarga el .TAR y descomprimelo en una carpeta donde ejecutaremos los scripts.
Para realizar las primeras pruebas, entra en la carpeta del diccionario y ejecuta el siguiente comando:
sudo pocketsphinx_continuous -lm 9640.lm -dict 9640.dic > capture.txt -samprate 16000/8000/48000
Donde 9640.lm y 9640.dic sera substituido por el numero del diccionario que acabáis de crear.
Al ejecutar el comando podéis decir las palabras del diccionario, y una vez acabéis (Control+C para cerrar) podéis leer el archivo capture.txt para comprobar si es correcto.

Ahora pasamos a conectar los Leds y empezar a jugar con ellos. Para empezar, conectaremos los LEDS en los Pines GPIO17 y Ground (tierra) y GPIO1 y Ground.
Ahora ejecutaremos los siguientes comandos para indicar que están activos, y que son de salida:

echo 17 > /sys/class/gpio/export
echo 1 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio17/direction
echo out > /sys/class/gpio/gpio1/direction

Podemos apagarlos y encenderlos cambiando el valor, con el siguiente comando:

echo 1 > /sys/class/gpio/gpio17/value
echo 0 > /sys/class/gpio/gpio17/value

Ahora, para empezar a hacer acciones basadas en los comandos de voz, he escrito algunos Scripts en Python, para hacer esto. La particularidad de este codigo es que ejecuta PocketSphinx y lo deja escuchando, para que cada vez que digamos un comando, automaticamente compruebe si esta descrito y ejecute la acción en cuestión.
Asi que podeis crear los siguientes archivos y copiar el contenido para realizar las pruebas. Recordad que las palabras que utilizo estan creadas en mi diccionario. También podeis observar que pese a que esta comentado, también llamo a un programa llamado Festival, que es justamente lo contrario, un sintetizador de voz por si nos interesa que la Raspberry nos conteste cada vez que haga una acción.

Archivo read.py:

#!/usr/bin/python
import os
import time

i=0

while i != 1 :
infile = open(‘capture.txt’, ‘r’)

for line in infile:
if line.find(“GREEN OFF”) != -1 :
os.system(“echo 0 > /sys/class/gpio/gpio17/value”)
os.system(“true > capture.txt”)
#os.system(“festival -b ‘(SayText “Green led off”)'”)
if line.find(“GREEN OK”) != -1 :
os.system(“echo 1 > /sys/class/gpio/gpio17/value”)
os.system(“true > capture.txt”)
#os.system(“festival -b ‘(SayText “Green led ON”)'”)
if line.find(“RED OFF”) != -1 :
os.system(“echo 0 > /sys/class/gpio/gpio2/value”)
os.system(“true > capture.txt”)
#os.system(“festival -b ‘(SayText “Red led Off”)'”)
if line.find(“RED OK”) != -1 :
os.system(“echo 1 > /sys/class/gpio/gpio2/value”)
os.system(“true > capture.txt”)
#os.system(“festival -b ‘(SayText “Red led ON”)'”)
if line.find(“TEST”) != -1 :
os.system(“echo 1 > /sys/class/gpio/gpio2/value”)
os.system(“echo 1 > /sys/class/gpio/gpio17/value”)
os.system(“true > capture.txt”)
#os.system(“festival -b ‘(SayText “Green and red led ON”)'”)
if line.find(“EXIT”) != -1 :
os.system(“sudo pkill -9 pocketsphinx”)
os.system(“true > capture.txt”)
#os.system(“festival -b ‘(SayText “Goodbye!”)'”)
i=1

infile.close()
time.sleep(2)

Y ahora el archivo all.py, que  ejecuta PocketSphinx en “segundo plano”.

#!/usr/bin/python
import os
import subprocess, time

os.system(“rm capture.txt”)

#os.system(“./shut.py &”)

os.system(“sudo pocketsphinx_continuous -lm 3906.lm -dict 3906.dic > capture.txt -samprate 16000/8000/48000 &”)

os.system(“./read.py &”)

Ahora damos permiso de ejecución a los dos programas:

chmod +x all.py read.py

Y ya podemos ejecutar all.py para hacer la prueba.

Este “trozo” de codigo va a seguir en desarrollo para intentar encontrar mejoras. Lo ofrezco de forma libre para que cualquiera pueda utilizarlo y jugar un poco con todo esto.

Si quieres comprar una Raspberry Pi para empezar a trastear, puedes encontrarlas en Amazon a un precio buenisimo, además de que puedes disfrutar del envío gratis si pruebas Amazon Premium desde el enlace de abajo!

Un saludo!!


Xavi Gonzalez

Actualmente DevOps Engineer en MotoGP (Dorna Sports). Apasionado de GNU/Linux y del software libre. Me gusta trastear con cualquier gadget, y rodar en moto.

6 comentarios

Pedro Alexander Patiño · 13 enero, 2018 a las 14:47

Me ha parecido tu proyecto espectacular. Q bueno fuera q pudieras incluir imagenes de las conexiones y ademas q sistema operativo has utilizado en la pi.

Xavi Gonzalez · 10 abril, 2018 a las 14:38

Gracias por tu comentario Pedro. Realmente con cualquier Linux (Raspbian) se puede ejecutar. Las conexiones son simples: el pin 2 y el 17 para las luces o leds que quieres encender con la voz, y la controladora de audio por USB.
Un saludo!

david · 29 junio, 2018 a las 7:58

Buenos dias, muy buen post…. estaba buscando algo parecido. Entiendo que funcionaria igualmente con palabras en español?

Xavi Gonzalez · 23 julio, 2018 a las 16:44

Tal y como está publicado, no. El software que utilizo solo tiene reconocimiento en inglés, a si que es difícil que te “entienda” si le hablas en Español. ¡Un saludo!

jeferson · 21 enero, 2020 a las 22:09

muy buen aporte amigo felicitaciones. Una consulta como hago para probar el funcionamiento del microfono?

XG Home Controller, domótica con Raspberry Pi - El blog de Xavi Gonzalez · 16 octubre, 2015 a las 11:27

[…] post bien podría ser la segunda parte de “Reconocimiento de voz con Raspberry Pi“, ya que desde que empecé a añadirle “funcionalidades”, no he podido […]

Deja una respuesta

Marcador de posición del avatar

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*