Raspberry Pi – Reconocimiento de voz en español

Print Friendly, PDF & Email

Bueno, bueno, tras un largo verano de disfrute y ocio volvemos a la carga!!! En este documento veremos cómo hacer que una Raspberry Pi nos esté escuchando, esperando a que le hablemos y ejecute los comandos que le indiquemos. Es algo realmente muy sencillo de hacer, he estado tiempo probando alternativas más complejas tanto de instalar como de configurar, y esta para mí es la mejor. Lo que vais a ver en este documento lo podréis implementar en menos de 30 minutos! y decirle… “Antonia, ponme Telecinco”!

Raspberry_reconocimiento_voz_espanol_03-bujarra

Nos basaremos en una Raspberry Pi 2 o 3 con Jessie instalado y actualizado, a esta Raspberry le instalaremos Apache y le pondremos una web que permitirá que el navegador que la visite, conecte su microfono y le hable. La web tratará lo que escuche ejecutando cualquier comando que configuremos previamente. A esta web nos podremos conectar desde un PC/Portatil/móvil/tableta y con el Chrome, nos solicitará acceso al microfono y nos estará escuchando en todo momento. Lo ideal es hacer todo en la misma Raspberry Pi, me explico, conectarla a ella un microfono y hacer que autologee al reiniciar y ejecute el Chromium contra sí mismo. Por lo que la Pi estará sirviendo una web que escuchará cuando te conectes a ella y con su propio navegador y su microfono hará de ‘cliente’ y de ‘servidor’.

 

Raspberry_reconocimiento_voz_espanol_02-bujarra

Bien, todo esto es posible gracias a una librería de Javascript que tendrá la web (html) llamada Annyang, añadiendo la posibilidad de usar reconocimiento de voz a los usuarios que se conecten. Reenviará lo que escuche a una pequeña web de php que ejecutará los comandos. En mi caso tras pronunciar su nombre (Antonia), cogerá las siguientes palabras y buscará si hay algún comando que ejecutar. Tengo puesto también que si le llamo de otra forma (Manolo), me buscará en WolframAlpha la respuesta a la pregunta que le haga 🙂 pero eso no lo he puesto en este documento para no despistar; vamos, el uso normal con Antonia es que me encienda/regule/apague la luz de la sala, suba/baje estores, cambie de canal de TV al que yo le diga ;), ponga la calefacción, la alarma, me diga temperaturas, previsiones del tiempo…

 

Raspberry_reconocimiento_voz_espanol_01-bujarra

Y además, esto se puede hacer con cualquier idioma! en este documento se tratará de reconocer el Español o Castellano, es gratuito, ocupa 1kb el script… qué más! Por cierto, para el que pregunte, estoy usando un micrófono buenillo (en mi humilde opinión), omnidireccional, que escucha perfectamente desde cualquier sitio (tengo una sala de 30m2 y está escondido) es un CAD Audio U9 Condenser Microphone, Omni. Pero vamos que con cualquier micrófono funciona, sea USB o de una webcam. Ya os digo, lo podeis poner en la misma Pi, o usarlo desde otros equipos en la casa.

 

Instalación de Apache,

Lo primero de todo será instalar apache con php y sus requisitos:

[sourcecode language=”plain”]sudo apt-get install apache2 php5 libapache2-mod-php5[/sourcecode]

 

Cambiaremos el usuario que ejecutará apache2 (lo hago para que escuche el audio de mis comandos, por no meter al usuario de apache en el grupo de audio):

[sourcecode language=”plain”]sudo vim /etc/apache2/envvars[/sourcecode]

Y modificamos:

[sourcecode language=”plain”]export APACHE_RUN_USER=pi
export APACHE_RUN_GROUP=pi[/sourcecode]

 

Bien, para que la web no esté constantemente pidiendo acceso al micrófono, si hacemos que el sitio sea seguro (HTTPS) e instalamos un certificado autofirmado, el navegador confiará en el sitio y ya no pedirá acceso al micro más que la primera vez. Por lo que os pongo aquí los pasos necesarios para securizar la web, crearemos un directorio para guardar ahí los certificados, crearemos el certificado y la clave privada, habilitamos los modulos en apache, creamos enlace a la configuración de Apache y la editaremos para indicar las rutas correctas de los certificados:

[sourcecode language=”plain”]sudo mkdir /etc/apache2/ssl
sudo openssl req -x509 -nodes -days 1095 -newkey rsa:2048 -out /etc/apache2/ssl/server.crt -keyout /etc/apache2/ssl/server.key
sudo a2enmod ssl
sudo ln -s /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-enabled/000-default-ssl.conf
sudo vim /etc/apache2/sites-enabled/000-default-ssl.conf[/sourcecode]

 

Y modificamos:

[sourcecode language=”plain”]SSLCertificateFile /etc/apache2/ssl/server.crt
SSLCertificateKeyFile /etc/apache2/ssl/server.key[/sourcecode]

 

Finalmente, reiniciamos Apache y listo!

[sourcecode language=”plain”]sudo /etc/init.d/apache2 restart[/sourcecode]

 

Ficheros necesarios,

Os dejo aquí los dos únicos ficheros necesarios, los dejaremos en /var/www/html/:

 

index.html

[sourcecode language=”plain”]<html>
<html>
<head>
<meta charset="utf-8">
<script src="//cdnjs.cloudflare.com/ajax/libs/annyang/2.4.0/annyang.min.js"></script>
</head>
<body>
<script>
function openPage(voz){
window.open(‘hector.php?voz=’+voz);}

if (annyang) {
annyang.setLanguage(‘es-ES’);
var commands = {
‘Antonia *voz’ : openPage,
‘Manolo *voz’ : openPage
};
annyang.addCommands(commands);
annyang.start();
}
</script>
</body>
</html>
[/sourcecode]

Este fichero es la web inicial, la que carga el Javascript y permite grabar desde el audio de un navegador. Podremos cambiar ahí el idioma de origen y poner cualquier otro, así como la(s) palabra(s) que tiene que escuchar y tras ello lanzar una función que abre la web hector.php con las palabras dichas como argumentos en la URL. Ej, digo: ‘Antonia, pon la uno’. Y abriría ‘https://X.X.X.X/hector.php?voz=pon la 1’ en una pestaña y luego se cierra.

hector.php

[sourcecode language=”plain”]<html>
<body>
<?php
$valor = $_REQUEST[‘voz’];
if($valor==’apaga la música’ || $valor==’apagar la música’ || $valor==’para la música’)
{
exec(‘/home/pi/textoAvoz.sh "Si mi amo"’);
exec(‘/home/pi/musica_apaga.sh’);
}

if($valor==’sube electores’ || $valor==’sube el store’)
{
exec(‘/home/pi/textoAvoz.sh "Si mi amo"’);
exec(‘/home/pi/estoresubeon.sh’);
}
if($valor==’pon la sexta’ || $valor==’font la sexta’ || $valor==’por la sexta’)
{
exec(‘/home/pi/textoAvoz.sh "Si mi amo"’);
exec(‘/home/pi/la6_enciende.sh’);
}
echo "<script>window.close();</script>";
?>
</body>
</html>[/sourcecode]

Os pongo sólo un pequeño ejemplo del fichero para dar alguna idea, como veis es muy sencillo, sólo es captar los audios que nos escuche y ejecutar un script. En mi caso no siempre me escucha las palabras correctas, por lo que con ese pequeñito diccionario de posibles errores entiende los posibles fallos. Por lo que ‘pon’ a veces me entiende ‘font’, ‘por’… 🙂 Si alguna vez decimos un comando y no nos entiende, con ver el historial del navegador y ver ‘qué’ nos ha entendido y añadirlo a las posibilidades. Con eso ya escucha perfecto!

 

Instalar Chromium

Bien, esto es opcional. Si queremos que la propia Raspberry tenga el micrófono seguiremos estos pasos también, ya que le instalaremos Chrome y haremos que se abra automáticamente cuando la sesión de ‘pi’ arranque para que se conecte contra el servidor web.

Estos pasos son para instalar Chromium en una Raspberry Pi 3:

[sourcecode language=”plain”]
wget https://launchpad.net/~canonical-chromium-builds/+archive/ubuntu/stage/+build/7916060/+files/chromium-browser_45.0.2454.85-0ubuntu0.15.04.1.1181_armhf.deb
wget https://launchpad.net/~canonical-chromium-builds/+archive/ubuntu/stage/+build/7916060/+files/chromium-codecs-ffmpeg-extra_45.0.2454.85-0ubuntu0.15.04.1.1181_armhf.deb
sudo dpkg -i chromium-codecs-ffmpeg-extra_45.0.2454.85-0ubuntu0.15.04.1.1181_armhf.deb chromium-browser_45.0.2454.85-0ubuntu0.15.04.1.1181_armhf.deb[/sourcecode]

 

Ahora haremos que cuando autologuee la sesión de ‘pi’ en las X, abra Chromium contra el servicio web:

[sourcecode language=”plain”]vim ~/.config/lxsession/LXDE-pi/autostart[/sourcecode]

Y añadimos al final:

[sourcecode language=”plain”]@chromium-browser https://127.0.0.1[/sourcecode]

 

Probando,

Raspberry_reconocimiento_voz_espanol_04-bujarra
Una vez abramos el navegador contra la dirección IP de la Raspberry Pi nos pedirá acceso al micrófono, al habernos conectado con https:// sólo nos lo pedirá esta vez y ya lo guardará en las preferencias. Por defecto si todo ha ido bien nos abrirá contra ‘index.html’.

 

Raspberry_reconocimiento_voz_espanol_05-bujarra

Yo la manera que lo he hecho (no la mejor, pero rápida y funcional) es que tras escucharnos, el navegador abrirá en una pestaña la URL con las palabras que nos ha entendido atacando a hector.php pasandoselas como variable. Luego se cerrará la pestaña!

 

Bueno, pues esto es todo, agradecer a Miguel Ignacio Guerra del blog Cucopc alguna ayudita que me ha echado. Gracias a todos y espero que lo disfrutéis, combinando este tipo de documentos con otros que veréis en la sección de Raspberry Pi, podemos hacer un hogar inteligente totalmente intuitivo y poderoso.

 

Posts recomendados

Autor

nheobug@bujarra.com
Autor del blog Bujarra.com Cualquier necesidad que tengas, no dudes en contactar conmigo, os intentare ayudar siempre que pueda, compartir es vivir ;) . Disfrutar de los documentos!!!