Rhasspy – Control por voz segura en Home Assistant (en castellano)
Para todos aquellos que tengamos un Home Assistant y nos interese poder controlarlo por voz, digamos, una alternativa al Alexa o al Google Home, pues tenemos Rhasspy. ¿Y por qué Rhasspy? Por que nuestros micrófonos no se conectarán a Internet, nadie nos escuchará y será totalmente seguro y personalizable, ¡Empezamos!
Una obsesión que tengo es la de ver micrófonos por todos lados que controlan los hogares modernos, estos domóticos o inteligentes. Micrófonos que escuchan en nuestras casas y no sabemos quién está detrás o con qué fin nos dan un servicio gratuito ;-). En casa probé una vez un micrófono de estos de Google o Amazon y me quedé asombrado por la cantidad de conexiones y tráfico que generan las 24h del día, creo que no es normal que con esto del IoT tengamos que compartir con terceros datos de cualquier tipo, si ponemos la lavadora, o cuantos m2 limpia la aspiradora, o geolocalizándonos… evitemos ser nosotros el producto.
Así que tras mucho tiempo mirando y probando alternativas, la mejor con diferencia es Rhasspy, es sencilla, es muy completa, podemos hacer muchas cositas, mandar acciones, hacer preguntas, conversaciones… y luego actuar e integrarlo con Home Assistant para que ejecuten automatizaciones. Y por supuesto podremos hablarla en castellano (español) o cualquier otro idioma soportado (Inglés, Alemán, Castellano, Francés, Italiano, Alemán, Ruso, Griego, Hindi, Mandarín, Vietnamita, Portugués, Sueco o Catalán entre otros.)
Rhasspy se puede instalar en modo digamos local, todo en una Raspberry, esto es, que tenga el micrófono en ella, que esté esperando una palabra clave para ‘despertar’, que grabe lo que le preguntamos/ordenamos y luego lo gestione para entender y llame a la automatización de Hassio correspondiente. Pero lo ideal, es que no tengamos un micrófono solo en casa, si no varios repartidos por las habitaciones, así que Rhasspy se puede instalar digamos en modo cliente con lo mínimo, vaya, que este esperando la palabra clave y grabe nuestra pregunta/orden y luego se lo mande a un Rhasspy central que será la que lo procese y lo mande a Home Assistant. La idea de este cliente/servidor es para tener varios satélites con micrófonos y una configuración única central (y no cada Raspberry Pi con una configuración distinta). Y en mi caso particular el Rhasspy central, al ser importante (tiene la configuración y hace el cómputo) corre en una máquina virtual, al no necesitar micrófono… Y por últimisimo, por si a alguien le interesa, se podría instalar directamente sobre Home Assistant
Bueno, creo que con esto nos situamos y cogemos la idea, pues Rhasspy corre en un contenedor, así que tardaremos 2 minutos en tenerlo desplegado donde necesitemos. Voy a segregar el post en distintas situaciones para que cada uno escoja su escenario ideal.
Rhasspy solitario
Este escenario es el de tener 1 sola Raspberry Pi, que se encargue ella de todo el proceso; ideal quizá si vamos a hacer un robot o similar, que atienda a la palabra de activación ‘Bender’ por ejemplo. Empezamos, necesitamos tener Docker instalado, si no lo tenemos, le damos:
curl -sSL https://get.docker.com | sh
Tenemos que crear un fichero de configuración para que funcione la tarjeta de sonido de la Raspberry Pi en Docker, le podemos llamar ‘/home/pi/asound.conf.txt’ y le metemos este contenido:
pcm.!default { type hw card 1 } ctl.!default { type hw card 1 }
Y nada, levantamos el contenedor con la imagen de Rhasspy, indicando en el perfil el idioma con el que trabajaremos:
sudo docker run -d -p 12101:12101 \ --restart unless-stopped \ -v "$HOME/.config/rhasspy/profiles:/profiles" \ -v "/home/pi/asound.conf.txt:/etc/asound.conf" \ --device /dev/snd:/dev/snd \ synesthesiam/rhasspy-server:latest \ --user-profiles /profiles \ --profile es
Una vez el contenedor de Rhasspy esté iniciado, podremos probar que el efectivamente el contenedor accede correctamente al micrófono, que es funcional y graba. Abrimos un bash y probamos:
sudo docker exec -it ID_CONTENEDOR_RHASSPY bash arecord -r 16000 -c 1 -f S16_LE test.wav
Podremos ya abrir la gestión de Rhasspy, mediante un navegador web nos conectamos a: http://DIRECCION_IP_RHASSPYl:12101
En el menú superior, podremos ver los servicios que corren en este Rhasspy y al haber dicho que es un Rhasspy solitario deberán correr todos ellos. En el caso que luego veremos, de una instalación en red con varios micrófonos, los roles serán distintos.
También desde este interfaz inicial podremos hacer pruebas de reconocimiento de voz, a ver si nos entiende bien…
La primera opción de grabación de sonido o Audio Recording será básicamente la tarjeta de sonido que usaremos para grabar.
En Wake word seleccionaremos la opción que nos interese para reconocimiento de la palabra clave, o de activación; os recomiendo ir probando todos para ver cuál os reconoce mejor, o dependiendo de las palabras claves que ya existan o nos gusten, así como podremos crear una propia. En el ejemplo de la imagen sin complicación, la palabra clave sería ‘Alexa’.
En Speech to Text indicaremos el modelo de recoonocimiento, por defecto Kaldi funciona sin mayor complicación.
Intent Recognition lo usaremos para trabajar con el fichero de sentencias personalizadas que luego crearemos.
Luego en Text to Speech será donde convierta el texto a audio, NanoTTS igualmente funciona a las mil maravillas, y en Language verificaremos que tenemos el que nos interese.
En Audio Playing indicaremos cual es nuestro dispositivo de sonido para reproducir por los altavoces, en caso que tenga que tirar sonidos de que nos entiende o no, así como alguna frase…
En Dialogue Management dejaremos Rhasspy.
Y por último, en Intent Handling será donde podremos manejar las salidas de Rhasspy, en este caso que se conecte a un Home Assistant y le mande eventos. Luego tendremos automatizaciones en Home Assistant escuchando y esperando eventos para activarse y realizar la tarea que nos interese.
Rhasspy en red (cliente)
Este otro escenario sería si queremos tener varios micrófonos repartidos por el hogar, no sólo uno. La idea es que en cada Raspberry Pi con un micrófono le hagamos la misma instalación y configuración mínima.
Bueno, pues la instalación sería exactamente igual que el Rhasspy solitario; simplemente que llevará menos servicios levantados en local. Deberemos indicar que los siguientes servicios corren en el Rhasspy servidor/central:
- Intent recognition, indicando Remote HTTP y como URL: ‘http://DIRECCION_IP_RHASSPY_SERVIDOR:12101/api/text-to-intent’
- Text to Speech, indicando Remote HTTP y como URL: ‘http://192.168.1.216:12101/api/text-to-speech’
Rhasspy en red (servidor)
En este caso, esta máquina no sería necesario que tenga tarjeta de sonido, ya que ni grabará ni reproducirá nada, así que puedes instalarlo donde quieras, otra Raspberry Pi, o si puedes en una máquina virtual, o donde quieras, total, es un contenedor de Docker… La instalación sería más simple pues:
docker run -d -p 12101:12101 \ --restart unless-stopped \ -v "$HOME/.config/rhasspy/profiles:/profiles" \ synesthesiam/rhasspy-server:latest \ --user-profiles /profiles \ --profile es
Y la parte de configuración del servidor pues la inversa del cliente, no tendremos Audio Recording, ni Wake Word, ni hará la conversión de Text to Speech ni el Audio Playing.
Sentencias
Una vez tengamos el sistema en funcionamiento, nos reconozca la palabra clave, las frases de prueba, pues toca alimentar un fichero de sentencias o frases en Rhasspy (en el caso de red, esto solo se haría en el lado del servidor).
Desde el segundo icono podremos crear nuestros ficheros con las frases que queremos que intercepte tras escuchar la palabra clave. El bloque entre corchetes será el Evento que generará, y podremos crear variables que mandaremos dentro de los datos del evento, como pueda ser una acción (encender o apagar) y recogerlo como state (por ejemplo), y luego el nombre del objeto o lugar y lo recogemos como ‘name’. Os pego unos ejemplos que así lo entendéis mejor, explico fatal:
EstadoLuz] (enciende | apaga){state} la (lámpara de la sala){name} (enciende | apaga){state} la (luz de la cocina){name} ... [SubeBajaPersianas] (baja | sube){state} las (persianas de la sala){name} (baja | sube){state} la (persiana del despacho){name} ... [TempState] que temperatura hace en (casa){name} que temperatura hace en la (calle){name} que temperatura hace en la (cocina){name} ... [PreguntasVarias] hay (cartas){name} en el buzón mira si hay (cartas){name} donde esta (Héctor){name} ...
Crear un Token en Home Assistant
Cómo seguro que os habéis fijado, en Rhasspy, para enviar las salidas a Home Assistant lo hacemos desde Intent Handling, a parte de indicar la URL de Home Assistant, también deberemos indicar un Token de acceso. Para generar este Token, podrás seguir estos pasos.
Dentro de Home Assistant, desde las opciones del usuario con privilegios de admin, podremos crear Tokens de acceso de larga duración, pulsamos en “Crear Token”,
Le indicamos un nombre descriptivo para en un futuro nos acordemos de qué y para qué tenemos esto,
Y copiamos y guardamos en lugar seguro este Token, que será el que le indiquemos a Rhasspy.
Integración de Rhasspy en Home Assistant
Y nada, si queremos que Home Assistant recoja los mensajes de Rhasspy y los trate, lo haremos de manera sencilla, mediante automatizaciones.
Crearemos una automatización de escucha por cada acción que queramos realizar, lo único a tener en cuenta es que el desencadenante de la automatización será un ‘Evento’, y en ‘Tipo de evento’ recogeremos el Evento que generó gracias al fichero de sentencias (con el prefijo rhasspy_ ). Y como datos del evento filtramos qué escuchamos en particular. Así que si queremos que se encienda la calefacción, espero ese evento con los atributos correspondientes a ‘calefacción’ y como acción ‘enciende’, y luego las acciones al gusto, cada uno tenéis mucha imaginación y cosas que podéis trastear con Rhasspy.
Total, que post largo, pero que espero que a muchos os pueda orientar siempre que os guste hablar con la casa y con el objeto de securizarlo. Que los micrófonos o nada se conecte a Internet, que nadie nos espíe de manera gratuita… Y podamos personalizar la palabra de activación a algo más cercano, y sobre todo que tiene tantas posibilidades como ideas tengamos.
Os mando un abrazo a todos y todas, ser felices, gracias a todos los que movéis este tipo de contenidos en redes sociales.