Rhasspy-satellite
Alors, comme on en a pris l’habitude, on fait les tests de bon fonctionnement. Normalement on a mis à jour raspbian, installé les drivers comme les respeakers, tester un enregistrement et une lecture via arecord
et aplay
. Si tout ça est ok, c’est bon, on peut passer à la suite.
Les prérequis
On installe les packages nécessaires
sudo apt-get install supervisor mosquitto sox alsa-utils espeak flite curl patchelf ca-certificates python3 python3-dev python3-setuptools python3-pip python3-venv build-essential libatlas-base-dev swig portaudio19-dev
Petite méthode alternative (surtout pour les pi zeros) pour l’installation d’un picoTTS qui marche bien
wget http://archive.raspberrypi.org/debian/pool/main/s/svox/libttspico-utils_1.0+git20130326-3+rpi1_armhf.deb
wget http://archive.raspberrypi.org/debian/pool/main/s/svox/libttspico0_1.0+git20130326-3+rpi1_armhf.deb
sudo apt-get install -f ./libttspico0_1.0+git20130326-3+rpi1_armhf.deb
sudo apt-get install -f ./libttspico-utils_1.0+git20130326-3+rpi1_armhf.deb
L’installation
Et on lance la récupération des sources
git clone --recursive https://github.com/rhasspy/rhasspy-satellite.git
cd rhasspy-satellite
Et on lance l’installation
make
Alors de façon générale, mais surtout si tu es sur un pi zero, va boire un café, va faire un tour parce que ça va durer.
voilà ce que tu devrais obtenir si tu ne rencontres pas d’erreur
OK
scripts/build-docs.sh
Using virtual environment at /home/pi/rhasspy-satellite/.venv
INFO - Cleaning site directory
INFO - Building documentation to directory: /home/pi/rhasspy-satellite/rhasspy-server-hermes/web/docs
OK
Voilà la première bidouille. Si jamais ton make
échoue sur le module rapidfuzzy. Ce qui est mon cas à l’instant t avec la version proposée.
Ouvre le fichier requirements.txt
nano requirements.txt
et tu remplaces
rapidfuzz==0.7.6
par
rapidfuzz==0.7.8
Et tu relances le make
d’installation.
Cette fois-ci, la commande doit se terminer par
OK
scripts/build-docs.sh
Using virtual environment at /home/pi/rhasspy-satellite/.venv
INFO - Cleaning site directory
INFO - Building documentation to directory: /home/pi/rhasspy-satellite/rhasspy-server-hermes/web/docs
OK
Le démarrage de rhasspy-satellite
Il n y a plus qu’à le lancer et regarder les logs au cas où
bin/rhasspy-satellite --profile fr
Et notre rhasspy démarre. Si on va dans la partie configuration, tout est désactivé.
La configuration de rhasspy-satellite
Toujours dans le but de se connecter à un réseau snips, on va donc activer que ce qui nous intéresse. Voilà ce qu’on aura au bout
Le siteId
Vu que c’est un satellite, n’oublie pas de le remplir. Moi, ce sera le snips dans mon bureau.
MQTT
On se connecte au serveur MQTT de snips. Moi, dans mon cas mon snips maître s’appelle snips-master
Audio recording
On configure pyaudio. Au passage, on n’oublie pas d’entrer les valeurs pour le host et le port UDP Audio. Cela permet de faire passer le son capturé en continue au module de wake word en passant par une connexion UDP. Et il vaut mieux que ça passe par udp sur localhost que sur le réseau MQTT . Parce que si chaque satellite envoie en MQTT le son capturé en continu, ça me gêne à plusieurs niveaux.
Si tu n’enregistres pas de son, tu peux essayer d’aller sélectionner directement le périphérique d’entrée depuis la liste déroulante “Default device”
Wake word
On configure notre snowboy. Si on ne sait pas, ou si une couche de rappel est nécessaire, c’est dans cet article que ça se passe. C’est aussi là qu’on peut apprendre à créer son propre “Hey, snips” personnalisé par personne. Ce qui peut être utile dans certains scénarios de migration.
Là encore, on n’oublie pas de configurer l’UDP audio afin d’éviter que le flux audio capté en continu soit diffusé sur MQTT.
Speech To Text et Intent Recognition
Ce sont les modules chargés de reconnaitre le texte de la voix et d’en sortir les intents. Ce sont 2 tâches très lourdes et qui sont donc réservées à notre serveur maitre. On les bascule donc en “Hermes MQTT” pour que ce soit l’assistant maitre qui fasse cette partie du travail
Text to Speech
Là, c’est la seconde bidouille. Dans mon cas, mon réseau MQTT snips, le pico2wave
fonctionne avec langue de défini à fr
. Or la commande pico2wave
de rhasspy ne reconnait que fr-FR
. Du coup, j’ai repris le script qui était utilisé par rhasspy et je l’ai cloné pour forcer la langue à fr-FR.
sudo nano /usr/bin/mypicotts.sh
et on y colle ceci
#!/usr/bin/env bash
temp_wav="$(mktemp --suffix=.wav)"
function finish {
rm -rf "${temp_wav}"
}
trap finish EXIT
pico2wave -w "${temp_wav}" -l "fr-FR" "$@"
cat "${temp_wav}"
On le rend exécutable évidemment
sudo chmod +x /usr/bin/mypicotts.sh
Il nous reste plus qu’à définir notre script comme nouvelle commande de TTS
On bascule en “Local Command” et on entre le chemin vers notre script.
Audio playing
Rien de particulier par rapport à un rhasspy standard. Si tu n’as pas de son qui sort par exemple de ton respeaker, sélectionne le dans la liste déroulante des périphériques disponibles.
Test de bon fonctionnement
Après avoir cliqué sur le bouton bleu, il ne te reste plus qu’à essayer ton nouveau satellite,normalement, il est opérationnel 🙂
Voici ce que tu dois trouver dans les logs si ton hot word est entendu
[DEBUG:2020-04-24 01:13:39,540] rhasspywake_snowboy_hermes: Wake word detected: jarvis (site_id=bureau)
[DEBUG:2020-04-24 01:13:39,548] rhasspywake_snowboy_hermes: -> HotwordDetected(model_id='jarvis', model_version='', model_type='personal', current_sensitivity=0.5, site_id='bureau', session_id=None, send_audio_captured=None)
[DEBUG:2020-04-24 01:13:39,549] rhasspywake_snowboy_hermes: Publishing 159 bytes(s) to hermes/hotword/jarvis/detected
Toujours dans les logs, le résultat du Speech To Text fait par notre maitre snips
[DEBUG:2020-04-24 07:45:11,324] rhasspyserver_hermes: <- NluIntent(input='éteins la lumière', intent=Intent(intent_name='cedcox:eteindreLumiere', confidence_score=1.0), site_id='bureau', id=None, slots=[Slot(entity='custom_lights_device', value={'kind': 'Custom', 'value': 'Lumière'}, slot_name='lights_device', [blablabla ]
et le Text To Speech
[DEBUG:2020-04-24 07:45:11,286] rhasspytts_cli_hermes: <- TtsSay(text='je le fais de suite', site_id='bureau', lang='fr', id='ab1458ad-ae2a-46fa-b404-b8d42bf5cca2', session_id='07c8eae5-d1f5-48de-90e0-35b92ad5cd8b')
Si tu veux aller un peu plus loin
Je te propose le petit script ci-dessous qui est un script python. Il se connecte sur le réseau MQTT et t’affiche ce qui s’y passe.
#!/usr/bin/env python3
import paho.mqtt.client as mqtt
import json
def on_connect(client, userdata, flags, rc):
print('Connected')
mqtt.subscribe("hermes/tts/#")
mqtt.subscribe("hermes/dialogueManager/#")
mqtt.subscribe("hermes/asr/#")
mqtt.subscribe("hermes/intent/#")
mqtt.subscribe("hermes/nlu/#")
def on_message(client, userdata, msg):
print("Msg rcv on topic {0}: {1}".format(msg.topic, msg.payload))
mqtt = mqtt.Client()
mqtt.on_connect = on_connect
mqtt.on_message = on_message
mqtt.connect('snips-master', 1883)
mqtt.loop_forever()
N’oublie pas de changer snips-master
qui est le nom de mon snips maitre.
Le but du jeu est de prononcé la même sur un satellite snips et sur un satellite rhasspy et de voir s’il y a des différences.
Bonjour,
Avant de me lancer en aveugle et tester, aurais-tu qqs conseils pour une installation domotique dans laquelle tout doit tenir sur un Rpi4, avec une certaine réactivité ?
Je pensais utiliser Raspberry Pi OS Lite, Rhasspy, le broker intégré de Rhasspy pour récupérer les intents et gérer l’interface vocale (pourquoi as-tu un broker externe?), et ensuite … je ne sais pas : je n’ai que 4 volets roulants, deux circuits lumières à gérer.
Faut-il passer par une solution domotique (HA/openhab…) mais je craint que ce ne soit une solution lourde (ton expérience?) ?
La solution zigbee2mqtt semble permettre de faire l’impasse sur une solution domotique…
Quel est ton avis ?
Merci
Damien
Bonjour Damien,
Que tu n’es que quelques composants ou beaucoup plus, l’avantage de passer par Home Assistant / OpenHab (encore que OpenHab n’est pas simple à prendre en main) ou tout autre logiciel domotique, c’est que c’est généralement user friendly avec une grosse communauté en cas de pépin. Je dirai donc que si ton besoin c’est l’efficacité, la stabilité et la rapidité de mise en oeuvre, alors oui, mieux vaut passer par un outil domotique.
Surtout que la plupart tiennent sur un RPI.
Après, si il n y pas trop de chose à gérer, une nodered avec quelques API voir quelques scripts pythons et le tour est joué. Mais il faut avoir le temps.
Pour ce qui est de zigbee2pqtt, j’ai commencé à jouer avec il y a quelque temps et attention, ce n’est pas d’une stabilité extraordinaire… Si tu ne veux pas que madame râle parce que les volets ne s’ouvrent plus… Je te conseille de bien prendre le temps pour la mise en place 🙂 Perso, j’ai mis de côté pour le moment par manque de temps.
Cédric
Merci Cédric,
Je vais donc suivre ton conseil et me lancer tranquillement avec HA. En attendant, je tente de me dépatouiller avec un bug que je n’arrive pas à résoudre (l’accès à Rhasspy depuis le navigateur ne fonctionne plus). J’ai ouvert un post sur le site Rhasspy (https://community.rhasspy.org/t/firefox-cannot-establish-connection-with-192-168-1-7-12101/2879/5).
Question complémentaire : pourquoi prendre un broker externe sachant que Rhasspy en a un (j’ai tenté, sans succès, de m’y connecter avec un script python 🙂 )?
Bon dimanche et merci pour tes réponses !
Hello Damien,
Pour le choix de choisir un broker externe, c’est juste que c’est beaucoup plus simple à configurer que celui dans l’image Docker. Ca permet de mettre en place facilement , authentification, certificat etc…
Pour ton problème, je vérifierai ta config MQTT 🙂
Ced
Bonjour ! J’ai configuré ma base et mon satellite quasiment correctement 😉
Pour résumer j’ai ma base RPi 4 avec sortie audio, aucun micro
et mon satellite RPi 3 avec micro et sans sortie audio.
Tout semble configuré correctement, mon wake word et mes sentences sont détectés.
Seulement je n’ai aucun retour audio.
Mon audio playing du satellite est configuré sur “Hermes MQTT” et celui de ma base est sur aplay. Lorsque je fais un essai de TTS avec le champ “Text to Speak” sur la page d’acceuil de la base, j’ai bien le message audio.
As-tu une idée, j’ai fais le tour du forum rhasspy, sans réponse de leurs part.
Merci d’avance !
Bonjour Charly,
Je pense que le message MQTT renvoyé pour la sentence a un problème. Essaye Rhasspy-Watch pour observer la trace MQTT. C’est un petit outil que j’ai développé et il y a un article sur le blog : https://www.coxprod.org/domotique/rhasspy-watch/
Cédric
Bonjour Cédric.
Rien ne semble sortir de l’ordinaire avec le rhasspy-watch.
J’avais déjà regardé. J’ai l’impression que ce n’est pas fait pour car il y a dans les docs un diagramme qui montre comment se font les échanges entre le satellite et la base. C’est dans la section MQTT et il la sortie audio est faite par le satellite lui même. C’est logique dans le sens ou il y a un satellite par pièce.
Confirmes tu mon raisonnement ?
Du coup je vais me faire un petit script pour réceptionner les données envoyées automatiquement sur le broker MQTT et jouer moi même les sons, voir des réponses verbal.
De toute façon je voulais développer un petit script pour gérer domoticz avev rhasspy.
Si cela t’intéresse je te passerai le code. Je compte faire un script qui ainune gestion dynamique. C’est à dire que si j’ajoute un interrupteur dans domoticz pas besoin d’aller le coder en dur dans le script.
De plus je suis aussi sur un projet de vision computer. J’ai vue que tu avais quelques tuto. Et je pourrais partager aussi mon projet. Si cela t’intéresse il me faudrait un moyen de te contacter autre que par les commentaires du blog 🙂
Je trouve tes tutos vraiment bien fait et sympa !
Bonjour,
Je m’intéresse à faire un assistant, rhasspy sur un orange pi 2 déjà en place dans mon réseau et un satellite dans le salon avec un pi zero.
Mon idée est bonne? Si j’ai mon serveur rhasspy sur mon orange pi et un pi zero avec la carte ReSpeaker 2-Mics Pi HAT, cela devrait fonctionner?
Si l’on peut continuer par mail, merci
Hello Garfi,
Oui ça fonctionnera mais attention, il faudra bien configuré le pi 0 pour qu’il ne soit que “relais” et que tout soit fait au niveau de ton serveur rhasspy 🙂
Ced