
Rhasspy – Control per veu segura a Home Assistant (en castellà)
Per a tots aquells que tinguem un Home Assistant i ens interessi poder controlar-lo per veu, diguem-ne, una alternativa a l'Alexa o al Google Home, doncs tenim Rhasspy. I per què Rhasspy? Perquè els nostres micròfons no es connectaran a Internet, ningú ens escoltarà i serà totalment segur i personalitzable, Comencem!
Una obsessió que tinc és la de veure micròfons per tot arreu que controlen les llars modernes, aquests domòtics o intel·ligents. Micròfons que escolten a les nostres cases i no sabem qui hi ha darrere o amb quina finalitat ens donen un servei gratuït ;-). A casa vaig fer una vegada un micròfon d'aquests de Google o Amazon i em vaig quedar assegut per la quantitat de connexions i trànsit que generen les 24h del dia, crec que no és normal que amb això de l'IoT haguem de compartir amb terceres dades de qualsevol tipus, si posem la rentadora, o quants m2 neteja l' aspiradora, o geolocalitzant-nos… evitem ser nosaltres el producte.
Així que després de molt de temps mirant i provant alternatives, la millor amb diferència és Rhasspy, és senzilla, és molt completa, podem fer moltes cosetes, manar accions, fer preguntes, converses… i després actuar i integrar-lo amb Home Assistant perquè executin automatitzacions. I per suposat podrem parlar-la en castellà (espanyol) o qualsevol altre idioma suportat (Anglès, Alemany, Castellà, Francès, Italià, Alemany, Rus, Grec, Hindi, Mandarí, Vietnamita, Portuguès, Suec o Català entre d' altres.)
Rhasspy es pot instal·lar en mode diguem local, tot en una Raspberry, això és, que tingui el micròfon en ella, que estigui esperant una paraula clau per 'despertar', que gravi el que li preguntem/ordenem i després ho gestioni per entendre i cridi a l'automatització de Hassio corresponent. Però l'ideal, és que no tinguem un micròfon només a casa, si no diversos repartits per les habitacions, així que Rhasspy es pot instal·lar diguem en mode client amb el mínim, vagi, que aquest esperant la paraula clau i gravi la nostra pregunta/ordre i després se'l mani a un Rhasspy central que serà la que el processi i el mani a Home Assistant. La idea d'aquest client/servidor és per tenir diversos satèl·lits amb micròfons i una configuració única central (i no cada Raspberry Pi amb una configuració diferent). I en el meu cas particular el Rhasspy central, en ser important (té la configuració i fa el còmput) corre en una màquina virtual, al no necessitar micròfon… I per últimíssim, per si a algú li interessa, es podria instal·lar directament sobre Home Assistant
Bo, crec que amb això ens situem i agafem la idea, doncs Rhasspy corre en un contenidor, així que trigarem 2 minuts a tenir-lo desplegat on necessitem. Vaig segregar el post en diferents situacions perquè cadascú esculli el seu escenari ideal.
Rhasspy solitari
Aquest escenari és el de tenir 1 sola Raspberry Pi, que s' encarregui ella de tot el procés; ideal potser si anem a fer un robot o similar, que atengui la paraula d'activació 'Bender’ per exemple. Comencem, necessitem tenir Docker instal·lat, si no el tenim, li donem:
curl -sSL https://get.docker.com | sh
Hem de crear un fitxer de configuració perquè funcioni la targeta de so de la Raspberry Pi a Docker, li podem anomenar '/home/pi/asound.conf.txt’ i li fiquem aquest contingut:
pcm.!default { type hw card 1 } ctl.!default { type hw card 1 }
I res, aixequem el contenidor amb la imatge de Rhasspy, indicant en el perfil l' idioma amb el qual treballarem:
sudo docker run -d -p 12101:12101 \ --restart unless-stopped \ -v "$HOME/.config/rhasspy/profiles:/profils" \ -v "/home/pi/asound.conf.txt:/etc/asound.conf" \ --device /dev/snd:/dev/snd \ synesthesiam/rhasspy-server:latest \ --user-profiles /profiles \ --profile és
Un cop el contenidor de Rhasspy estigui iniciat, podrem provar que el contenidor accedeix correctament al micròfon, que és funcional i grava. Obrim un bash i provem:
sudo docker exec -it ID_CONTENEDOR_RHASSPY bash arecord -r 16000 -c 1 -f S16_LE test.wav
Podrem ja obrir la gestió de Rhasspy, mitjançant un navegador web ens connectem a: http://DIRECCION_IP_RHASSPYl:12101
En el menú superior, podrem veure els serveis que corren en aquest Rhasspy i en haver dit que és un Rhasspy solitari hauran de córrer tots ells. En el cas que després veurem, d'una instal·lació en xarxa amb diversos micròfons, els rols seran diferents.
També des d'aquesta interfície inicial podrem fer proves de reconeixement de veu, a veure si ens entén bé…
La primera opció de gravació de so o Audio Recording serà bàsicament la targeta de so que farem servir per gravar.
A Wake word seleccionarem l'opció que ens interessi per a reconeixement de la paraula clau, o d' activació; us recomano anar provant tots per veure quin us reconeix millor, o depenent de les paraules claus que ja existeixin o ens agradin, així com podrem crear una pròpia. En l'exemple de la imatge sense complicació, la paraula clau seria 'Alexa'.
A Speech to Text indicarem el model de recooniment, per defecte Kaldi funciona sense més complicació.
Intent Recognition el farem servir per treballar amb el fitxer de sentències personalitzades que després crearem.
Després a Text to Speech serà on converteixi el text a àudio, NanoTTS igualment funciona a les mil maravelles, i a Language verificarem que tenim el que ens interessi.
A Audio Playing indicarem quin és el nostre dispositiu de so per reproduir pels altaveus, en cas que hagi de tirar sons que ens entén o no, així com alguna frase…
A Dialogue Management deixarem Rhasspy.
I per últim, a Intent Handling serà on podrem manejar les sortides de Rhasspy, en aquest cas que es connecti a un Home Assistant i li mani esdeveniments. Després tindrem automatitzacions a Home Assistant escoltant i esperant esdeveniments per activar-se i realitzar la tasca que ens interessi.
Rhasspy en xarxa (client)
Aquest altre escenari seria si volem tenir diversos micròfons repartits per la llar, no només un. La idea és que a cada Raspberry Pi amb un micròfon li fem la mateixa instal·lació i configuració mínima.
Bo, doncs la instal·lació seria exactament igual que el Rhasspy solitari; simplement que portarà menys serveis aixecats en local. Haurem d'indicar que els següents serveis corren al Rhasspy servidor/central:
- Intent recognition, indicant Remote HTTP i com a URL: 'http://DIRECCION_IP_RHASSPY_SERVIDOR:12101/api/text-to-intent’
- Text to Speech, indicant Remote HTTP i com a URL: 'http://192.168.1.216:12101/api/text-to-speech’
Rhasspy en xarxa (servidor)
En aquest cas, aquesta màquina no caldria que tingui targeta de so, ja que ni gravarà ni reproduirà res, així que pots instal·lar-lo on vulguis, una altra Raspberry Pi, o si pots en una màquina virtual, o on vulguis, total, és un contenidor de Docker… La instal·lació seria més simple ja que:
docker run -d -p 12101:12101 \ --restart unless-stopped \ -v "$HOME/.config/rhasspy/profiles:/profils" \ synesthesiam/rhasspy-server:latest \ --user-profiles /profiles \ --profile és
I la part de configuració del servidor doncs la inversa del client, no tindrem Audio Recording, ni Wake Word, ni farà la conversió de Text to Speech ni l'Audio Playing.
Sentències
Un cop tinguem el sistema en funcionament, ens reconegui la paraula clau, les frases de prova, doncs toca alimentar un fitxer de sentències o frases a Rhasspy (en el cas de xarxa, això només es faria al costat del servidor).
Des de la segona icona podrem crear els nostres fitxers amb les frases que volem que intercepti després d'escoltar la paraula clau. El bloc entre corxets serà l'Esdeveniment que generarà, i podrem crear variables que manarem dins de les dades de l'esdeveniment, com pugui ser una acció (encendre o apagar) i recollir-lo com a state (per exemple), i després el nom de l'objecte o lloc i el recollim com a 'name'. Us pego uns exemples que així ho enteneu millor, explico fatal:
EstatLuz] (encén | apaga){state} la (làmpada de la sala){name} (encén | apaga){state} la (llum de la cuina){name} ... [PujaBajaPersianes] (baixa | puja){state} les (persianes de la sala){name} (baixa | puja){state} la (persiana del despatx){name} ... [TempState] que temperatura fa en (casa){name} que temperatura fa a la (carrer){name} que temperatura fa a la (cuina){name} ... [PreguntesVàries] hi ha (cartes){name} a la búsia mira si hi ha (cartes){name} on aquesta (Héctor){name} ...
Crear un Token a Home Assistant
Com segur que us heu fixat, a Rhasspy, per enviar les sortides a Home Assistant ho fem des d'Intent Handling, a banda d'indicar la URL de Home Assistant, també haurem d'indicar un Token d'accés. Per generar aquest Token, podràs seguir aquests passos.
Dins de Home Assistant, des de les opcions de l'usuari amb privilegis d'admin, podrem crear Tokens d'accés de llarga durada, posem en “Crear Token”,
Li indiquem un nom descriptiu per a en un futur ens acordem de què i per a què tenim això,
I copiam i guardem en lloc segur aquest Token, que serà el que li indiquem a Rhasspy.
Integració de Rhasspy a Home Assistant
I res, si volem que Home Assistant reculli els missatges de Rhasspy i els tracti, ho farem de manera senzilla, mitjançant automatitzacions.
Crearem una automatització d'escolta per cada acció que vulguem realitzar, l'únic a tenir en compte és que el desencadenant de l'automatització serà un 'Esdeveniment', i en 'Tipus d'esdeveniment’ recollirem l'Esdeveniment que va generar gràcies al fitxer de sentències (amb el prefix rhasspy_ ). I com a dades de l'esdeveniment filtrem què escoltem en particular. Així que si volem que s'encengui la calefacció, espero aquest esdeveniment amb els atributs corresponents a 'calefacció’ i com a acció 'encén', i després les accions al gust, cadascú teniu molta imaginació i coses que podeu trastejar amb Rhasspy.
Total, que post llarg, però que espero que a molts us pugui orientar sempre que us agradi parlar amb la casa i amb l'objecte de securitzar-lo. Que els micròfons o res es connecti a Internet, que ningú ens esperi de manera gratuïta… I puguem personalitzar la paraula d'activació a una cosa més propera, i sobretot que té tantes possibilitats com idees tinguem.
Us mando una abraçada a tots i totes, ser felices, gràcies a tots els que mogueu aquest tipus de continguts en xarxes socials.