¡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.
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.
Luego entra en la siguiente dirección (LM-TOOL) y sube el archivo txt.
Te mostrará los enlaces para descargar tu diccionario.
sudo pocketsphinx_continuous -lm 9640.lm -dict 9640.dic > capture.txt -samprate 16000/8000/48000
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.
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 timei=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=1infile.close()
time.sleep(2)
Y ahora el archivo all.py, que ejecuta PocketSphinx en “segundo plano”.
#!/usr/bin/python
import os
import subprocess, timeos.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!!
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 […]