Gestionnaire d’exécution de l’intention avec node-red
Et c’est là qu’on commence à s’amuser. On ouvre son navigateur internet et on entre l’adresse “http://rhasspy-master:1880”. Bien évidemment, tu remplaces rhasspy-master par le nom de la machine sur laquelle tu as installé node-red. Moi dans mon cas, j’ai installé node-red sur la machine Rhasspy pour le TP. Toi, à toi de voir ce que tu préfères.
Voilà donc ce que ça devrait donner.
Pour rappel, notre objectif pour cette intent, c’est lorsque l’intent “disBonjour” est détectée, Rhasspy réponde “Bonjour le monde”.
Création de notre écouteur d’intent disBonjour
Port http en écoute
Donc, on sait qu’on veut un port HTTP en écoute de commande de type POST. Et le contenu sera du json.
Hé bien dans node-red, c’est tout simple, j’ai un composant tout prêt pour ça. Le composant http in
. Je vais donc faire défiler ma liste de composant à gauche jusqu’à la section “network
” puis le composant http_in
.
Là, tu cliques dessus et sans lâcher le clic de souris, tu vas venir déposer le composant sur la fenêtre du flow. Et tu relâches.
Ensuite tu double cliques dessus
On configure comme ceci :
Method | POST |
URL | /gestionIntent |
Name | ecoute intent |
On clique sur le gros bouton rouge “Done”.
Composant debug
Maintenant, ce serait intéressant de voir en direct ce que nous envoi Rhasspy. Pour ça, on va utiliser un composant qui s’appelle “debug”. Il permet d’afficher dans la fenêtre debug
la valeur de la variable qui nous intéresse. Dans notre cas, le payload de msg.
Pour ça, dans la partie “common” des composants, tu trouveras un composant vert “debug”. Tu le prends, tu le colles à droite de “ecoute internet” et tu relies les 2. Pour relier les 2, tu cliques sur le petit carré gris à droite du composant “ecoute internet” et sans relâcher, tu vas sur le bouton gris à gauche du composant “debug”.
On clique sur le bouton “Deploy” tout en haut à droite
Voilà, dès qu’on va dire “Dis bonjour” à notre assistant, Rhasspy enverra via un http POST toutes les informations concernant notre intent pour pouvoir la traiter.
Du côté de node-red tout ce que Rhasspy va nous envoyer, on va le logger pour aller voir ce qu’il y a dedans.
Lecture de ce qui est envoyé par Rhasspy
On va sur notre Rhasspy, sur sa page d’accueil et comme tout à l’heure, on va faire une détection d’intent sauf que cette fois ci, en plus d’écrire “dis bonjour”, on va cocher la case “Handle” avec le petit éclair
Et on clique sur le gros bouton bleu Recognize.
Si tu retournes dans node-red, clique en haut à droite sur le petit scarabé.
Dans la fenêtre en dessous, tu devrais avoir ça
Ce que nous a envoyé Rhasspy est donc ce qui est dans “payload
” au format json. On peut y voir l’intent
(que l’on peut déplier avec la petite flèche noire) mais aussi le site_id
, une autre donnée qui va nous intéresser.
Reconnaissance de l’intent
Maintenant qu’on a le format, on va mettre un composant qui permet d’avoir une sortie de composant par intent potentielle ! Pratique 🙂 Ça va être un peu comme notre centre de triage.
Pour cela, on cherche le composant switch
On le met sur le flow et on double clique dessus. On le configure comme ci-dessous :
Pour créer la 2eme ligne, on clique sur le petit bouton “+ add” en bas. On en profite pour mettre dans la liste déroulante “stopping after first match”.
Une fois tout ça fait, on clique sur le bouton rouge “Done”.
Donc là, notre centre de triage a 2 sorties. Soit c’est intent “disBonjour” qui est reconnu, soit c’est n’importe quelle autre intent.
Sur le flow, tu devrais à peu près être comme ça :
Pour supprimer un lien, cliquer dessus pour le sélectionner puis appuyer sur “Suppr”.
Envoi de la demande de text to speech
Pour ça, si on se réfère à cette page, il suffit de renvoyer un texte à lire sous la forme :
{
"speech": {
"text": "Texte à lire."
}
}
Je vais même rajouter le site_id
pour la forme mais ça va être facile à faire.
Pour cela, on va utiliser un composant qui s’appelle function
. En fait ce composant, on va pouvoir faire ce qu’on veut dedans puisqu’il attend du code. Et nous on utilisera ce composant pour affecter la partie speech demandée au payload de la réponse renvoyée à Rhasspy.
Comme pour les autres, on le prend, on le met sur le flow et on double clique dessus. Et on en profite pour lui coller ceci :
msg.payload = "{\"speech\":{\"text\":\"Bonjour le monde.\"},\"site_id\": \"" + msg.payload.site_id + "\"}"
return msg;
On en profite pour lui donner un petit nom
Dans mon cas, je l’ai appelé “preparation reponse”. Tu remarqueras que j’évite soigneusement de mettre des accents 🙂
On clique sur le bouton rouge “Done”.
Revois un peu les liaisons pour obtenir ceci
Il nous reste un dernier problème. Ce que l’on vient d’affecter au payload est au format chaine de caractère. Et notre rhasspy en retour attend quelque chose formater en json. Hé bien dans node red, il y a un composant qui permet de transformer les payloads string en payloads json ! Vraiment pratique cet outil non ? 🙂
Et pour cela on utilisera un composant qui porte bien son nom puisque c’est le composant json. Tu le trouveras à gauche, dans la liste des composants, dans la rubrique “parser”.
On le met sur le flow, on double clique dessus et, oh ! il est déjà configuré; Parfait. On clique sur le bouton rouge “Done”.
On revoit un peu les liaisons et on a désormais ceci :
Il ne nous reste plus qu’une chose à faire, renvoyer notre payload modifié en réponse à la commande POST http posté par Rhasspy à node-red.
Pour cela, on utilise un dernier composant, le composant “http response”.
On le met et on relie le tout. Il n’y a rien à configurer. Voilà ce que tu devrais avoir.
Oui oui, à la sortie du composant json, il y a bien 2 liens. C’est encore un côté pratique de node red.
Si tu as exactement la même chose que l’image ci dessus, alors tu peux cliquer sur le bouton rouge “Deploy” en haut à droite.
salut,
j’ai suivi ton tuto et lu pas mal d’articles, bravo.
par contre j’ai un pb que je n’arrive pas à resoudre, j’utilise remote HTTP pour envoyer une commande a Jeedom et malheureusement elle n’est envoyé que si la case Handle est coché, a coté de l’eclair, mais comment faire pour regler le pb définitivement dans le soft? Version 2.5.11
merci a toi
Hello David,
Alors la case “Handle” n’est utilisée dans mes souvenirs que lors des tests via l’interface Web.
Par exemple, si on souhaite juste voir l’interprétation de Rhasspy sans pour autant exécuter la commande, on ne coche pas handle.
Si on souhaite voir si l’interprétation est OK et que l’action est bien exécutée, alors on coche “handle”.
Mais pour moi, c’est juste pour les tests manuels via l’interface.
Donc si ça marche ne cochant “handle”, ça voudrait dire que Rhasspy sait exécuter la commande à partir du moment ou le Speech To Text a renvoyé la bonne phrase.
Du coup, je pense que ton problème se passe plutôt du côté de la reconnaissance de la phrase par la voix. N’hésite pas à utiliser rhasspy-watch : https://www.coxprod.org/domotique/rhasspy-watch/
Ced
Salut,
merci de ta réponse , ellas ce n’est pas un pb de reconnaissance de la voix car je vois bien passer l’info en mqtt.
J’arrive à communiquer avec mon jeedom en mqtt et lancer des scenarios… mais je suis pas assé qualifié pour faire tout ce que je souhaite via mqtt c’est pour ça.
Je susi un peu déçu car j’aime bien l’asssitance vocale pour des commandes simples baisser les volets, l’heure, la météo, mais j’aurai voulu pouvoir dialoguer avec par la fonction ask de jeedom mais je ne sais pas quel est le Topic ni meme comment le lancer vers Rhasspy pour pouvoir par exemple démarrer la capture audio sur le satellite du salon…
merci
Hello
Tout d’abord, je tiens sincèrement à te féliciter pour l’ensemble de tes tutos. Ils sont didactiques, fun et très bien détaillés. Pour le coup j’étais un peu hésitant à me lancer dans Rhasspy et des satellites (alexa c’est pas très flex mais faut l’avouer méga simple 😀 ) mais en tombant sur ton tuto je me suis dis “boah allez pourquoi pas” !
Du coup montage d’un pizero avec respeaker et tout le tralala. Resultat j’ai mon jarvis qui me fait des bip de joie 😀 bref merci à toi !
En creusant un peu plus, et c’est aussi pour ça qu’alexa me chonchonne un peu, impossible de mettre plusieurs intent dans une même phrase prononcée, Rhasspy idem de ce que je peux lire un peu partout.
La solution serait de faire des intent pour chaque cas de figure, on imagine bien le nombre astronomique d’intent à créer 😀 😀
ET LA je lis cette phrase dans la page dans la page 5 du tuto nodered (que j’utilise)
“En soi, ce n’est pas grave car ça fait exactement ce qu’on lui demande. C’est juste qu’il faudrait qu’on regarde comment faire pour un dialogue. Très bonne idée pour un prochain article.”
Donc pour faire un dialogue cela implique un échange de plusieurs amabilités entre Rhasspy et nodered. C’est grosso modo un workaround qui pourrait m’interesser
“- Jarvis, allume la lumière de la cuisine.
– c’est fait, autre chose ?
– éteins les chambres
– ok, autre chose ?
– Non
– Allright mon maître (oui bon on peut se faire kiffer aussi hein :D) ”
Tu évoques un article à écrite, mes excuses je n’ai pas eu le temps de tout parcourir mais as-tu peu écrire l’article en question ?
Encore une fois merci et bravo pour cette fabuleuse mine d’infos
Bonjour Olivier,
Déjà, merci pour ces compliments 🙂 .
Effectivement, l’article n’a pas encore été écrit car je manque de temps. Comme tu pourras le constater, je fais un max d’article par période (quand j’ai un creux).
Pour le dialogue, ce que tu dis est effectivement faisable en utilisant le “continue”.
Je peux te donner quelques pistes :
https://docs.snips.ai/reference/dialogue#continue-session
https://community.rhasspy.org/t/how-to-enable-continuous-mode/2277/5
En espérant que cela t’aidera !
Si tu as des questions, n’hésite pas
Ced
Merci pour cette réponse super rapide Ced 😉
Je vais creuser les pistes que tu m’as indiqué. Je te tiens au courant 🙂
Hello,
Comme promis, je viens faire un petit update de là où j’en suis.
J’ai laissé tomber la piste du continue session qui depuis nodered est possible mais impose une gymnastique de cerveau (et de nodes) assez importante et surtout on est condamné à utiliser Rhasspy en dialogue manager (oui je n’aime pas être lié 😀 )
Du coup j’ai pris le parti radical de reconstruire un dialogue manager dans mon nodered en m’appuyant sur mqtt et de configurer la partie dialogue management dans rhasspy sur “hermes mqtt”.
Le coté qui me plait c’est que du coup je manipule les sessions comme je le souhaite via des variable “flow” dans nodered, je peux créer des dialogues ‘intéractifs’, adapter des node en fonction des intent bref je trouve cela un peu plus interessant pour mon usage.
En gros, je me suis basé sur le schema du dialogue management de snip :
https://snips.gitbook.io/tutorials/t/technical-guides/listening-to-intents-over-mqtt-using-python
puis ciblé les topics mqtt à utiliser :
wake : hermes/hotword/jarvis/detected
desactivation / activation du hotword:
hermes/hotword/toggleOff
hermes/hotword/toggleOn
activation / desactivation de la capture de son
hermes/asr/stopListening
hermes/asr/startListening
récupération de la capture audio en texte
hermes/asr/textCaptured
envoi de la query pour parsing
hermes/nlu/query
recupération de l’intent parsé
hermes/nlu/intentParsed
voila j’espère que ça pourra aider des gens 🙂
Oliv
Edit : J’ai oublié de préciser que le format à utiliser pour envoyer de la data via mqtt c’est du json et que j’ai trouvé les key:value à passer dans la doc rhasspy depuis mon serveur maitre : http://IP_ADDRESS:12101/docs/services/#dialogue-manager
🙂
Bonjour,
Je souhaite monter un (petit?) projet qui permettrait depuis le RPi de :
– gérer du matériel dans la maison (lumière, température…);
– fournir des infos en ligne (météo,…);
– permettre des rappels (mémo vocal dans X minutes);
– diffuser de la musique;
– faire des réponses ;
– agir sur le RPi (“wake word” : sudo halt).
Pas d’interface graphique n’est nécessaire.
Si j’ai compris, Rhasspy n’autorise qu’une solution entre Node-Red, les logiciels de domotique (home assistant), et les scripts python…
Donc quelle est selon ton expérience celle qui serait la plus appropriée ?
Merci !
Bonjour Damien,
Non non, il est tout à fait possible de mélanger les technos 🙂 Et cela grâce à MQTT et le système de message qui est utilisé par Rhasspy.
Dans mon cas, j’ai du Node-red pour certaines choses (volets,lumières), du python pour d’autres (télé, network…). Il faut juste être sûr que chaque intent est gérée par une seule techno. Par exemple, il ne faut pas que tu es un workflow node-red qui gère directement le pont hue et home assistant qui pilote les lumières. Sinon, ça va faire des chocapics 🙂
Donc, tout dépend de ton niveau dans ces technos. Si tu es débutant et que tu ne connais pas trop python, je te conseille effectivement de passer par node-red pour commencer quelques tâches d’automatisation 🙂
Si tu es habitué à python, il y a sur le forum Rhasspy des librairies type “Store d’application” qui permettent de standardiser un peu les différents modules que tu pourrais être amené à développer.
En espérant que ça réponde à ta question !
Ced
Merci pour ta réponse (et disponibilité) !
Pourquoi faut-il alors renseigner le “Intent handling” dans la config si tous les systèmes sont possibles ?
Comment as-tu fait : installation paho-mqtt et abonnement au MQTT Broker de Rhasspy ? Et ensuite gérer avec les scripts python les données récupérées (intent?) dans le JSON (si je ne mélange pas tout 🙂 ) ?
Pour faire suite au commentaire de Pascal, est-ce que lancer docker avec -p 12183:12183 ne réglerait pas le problème (https://rhasspy.readthedocs.io/en/latest/services/#internal-vs-external-mqtt) ?
Pour le Python, je bidouille (c’est pour ça que je suis sur ton site 🙂 ), comme pour RPi… Mon niveau : je me suis fait un petit programme avec tkinter+opencv pour de la reconnaissance d’image/calibration… l’étape d’après était d’envoyer les coordonnées sur les GPIOs pour commander un moteur.
Penses-tu qu’avec les tuto et librairies ce soit accessible pour moi ? Je ferai qqch de probablement pas très propre…
Merci et désolé avec toutes ces questions de débutant…
Si tu utilises MQTT, pas besoin de passer par l”intent handling”. Il faut juste que tu maitrise un peu hermes-MQTT (les messages MQTT et leurs formats pour Rhasspy) : https://rhasspy.readthedocs.io/en/latest/services/#dialogue-manager .
Pour python, oui paho-mqtt et abonnement au broker MQTT sur lequel il ‘a aussi Rhasspy. Dans mon cas, le serveur MQTT est externalisé et sers à aussi à autre chose 🙂 . Ensuite, il faut traiter les messages qui sont effectivement au format json. Ne pas oublier d’envoyer une réponse si Rhasspy doit répondre quelque chose…
Tu peux t’inspirer de rhasspy-watch (https://github.com/cedcox/rhasspy-watch) qui est un petit tool que j’ai fait en python.
Pour commencer, essaye de faire un truc simple comme le fameux “Quelle heure est il ?” et en python et en node-red. Tu verras ce qui te plait le plus 🙂
Ced
bonjour! merci pour ce travail !
bien sûr, j’ai une question sans trouver de réponse?
exemple: “blueberry” allume le cadre…
réponse: “j’ai allumé le cadre”
et je voudrais lui répondre “merci”…suivi d’une réponse “de rien”
ça ne marche pas bien, on dirait que rhasspy est sourd pendant un long moment, donc trop tard !
y aurait il un truc ?
merci
Bonjour Cocq,
En fait, il faut passer par un continueSession au lieu du endSession suivi de la détection d’un autre intent etc.
Ce genre de chose est évidemment possible.
Mais dans un environnement avec du bruit, cela augmente statistiquement le risque d’échec, du coup, je n’ai pas mis ce genre de chose en place.
Peut être un jour un article sur e sujet 😉
Ced
Alors, suite de mon commentaire
Mon pi4 est instable bien que refroidi, j’ai basculé le tout dans quelques dockers de mon nas.
– Le problème avec node-red était une peccadille qui m’a coûté un temps fou… problème quand on croit se relire en négligeant certaines options clé (ici c’était très stupidement la méthode http du connecteur de node-red qui était mise sur GET au lieu de POST)
– j’ai buté sur des problèmes de compatibilité entre les deux versions de rhasspy qui tournaient respectivement sur le serveur et le satellite. j’ai fini par utiliser le dépôt rhasspy/rhasspy sur les deux avec succès.
– j’ai tourné un peu sur la question des sited qui faisaient que l’intent n’était pas reconnu convenablement c’est réglé et le reste devrait s’éclaircir au prochain satellite déployé.
– j’ai obtenu une diminution significative de la latence en basculant l’intent recognition et le speech-to-text en MQTT. Cela a nécessité un remaniage / triturage de messages, et a constitué un exercice intéressant pour node-red (ce truc est juste fantastique)
Pour l’instant mon installation est encore muette, j’hésite encore à la faire parler.
Un des points gênants est le délai entre la détection du mot-clé et le début de l’enregistrement. Augmenter la priorité du processus aide un peu, un poil d’overclock aiderait sans doute aussi mais il me répugne de diminuer la durée de vie de l’appareil.
Tu as avais raison sur le réglage de la sensibilité du mot-clé, le moindre dixième compte.
Tout en bidouillant, j’avais noté que le mot-clé se déclenchait souvent pour rien à cause de la série qui passait dans le fond. J’ai utilisé cela comme bruit aléatoire pour m’aider à régler ce seuil et j’ai pu par la suite le confirmer en laissant tourner des médias durant 3 heures.
Ravi que cet article ait pu t’aider 😉
En tout cas sacré boulot et, oui, cela prend un peu de temps pour avoir un réglage qui fonctionne, mais après, c’est quand même un sacré plaisir !
Bien joué
Cédric
Bonjour,
eh bien j’ai du potasser un peu les principes des “Dockers” car j’ai effectivement mon Rhasspy sous docker et Node-RED sous l’environnement classique car livré avec mon Raspberry Pi OS FULL (32Bits) – bref le réseau coté Docker n’est pas tout à fait ce que je pensais .
après moult péripéties, finalement, ma soluce à été de créer un macvlan afin que mon Rhasspy[Docké] puisse joindre le réseau local (eth0)
$ docker network create -d macvlan \
–subnet=192.168.1.0/24 \
–gateway=192.168.1.1 \
-o parent=eth0 my-macvlan-net
ce qui donne :
docker network ls
NETWORK ID NAME DRIVER SCOPE
4cb908bd20ea bridge bridge local
fafc959be3eb host host local
0709ee34b3ad my-macvlan-net macvlan local
9f87a5a688ff none null local
J’ai donc modifié le remote URL de l’Intent Handling par “http://192.168.16:1880/GestionIntent” et j’ai pu enfin voir mon objet dans la fenêtre debug de Node-RED …
Merci pour la piste 😉
Pascal
Bonjour,
J’ai quelques soucis de communication entre Rhasspy 2.5.0-pre et Node-RED
le coté Rhasspy me semble correct voici le log (le fin)
[DEBUG:2020-06-02 15:30:02,220] rhasspyserver_hermes: Sent 331 char(s) to websocket
[DEBUG:2020-06-02 15:30:02,214] rhasspyserver_hermes: Handling NluIntent (topic=hermes/intent/disBonjour, id=7d377247-031a-4549-8a78-cbfc3743fb69)
Mais le silence dans le log de Node-RED déployé …
ma config Remote URL de Rhasspy -> http://127.0.0.1:1880/endpoint/GestionIntent
(j’ai bien nommé le node ainsi maj/min)
Je vais essayer de tester autrement le Node-RED pour valider celui-ci …
Merci,
Au fait “Ce site est vraiment formidable !”
Pascal
Je vias continuer à chercher mais si vous avez une idée …
Bonjour Pascal,
Comme ça, pas simple de voir ce qui cloche mais ce que j’essaierai dans un premier temps c’est juste de mettre le composant HTTP (ecoute intent) et juste derrière, le composant debug (msg.payload).
Cela permettra juste de savoir si Rhasspy a bien envoyé quelque chose.
Une autre chose aussi qui peut être tenter c’est d’accéder à l’URL depuis un navigateur (Internet explorer, chrome, edge ou firefox).
Si il n y a toujours rien qui apparait dans la console de debug, alors cela serait plus “réseau” (firewall etc.)
Autre point, si tu es avec Docker pour Rhasspy, il y a peut être une config réseau à configurer. Mais comme je n’utilise pas Docker…
Voilà quelques pistes à étudier 🙂
Ced
Bonjour, vraiment super boulot j’adore !
Je tente le coup avec node red et je n’arrive pas à connecter rhasspy à celui-ci.
J’ai un pi4 maître basé sur hassio (hass + rhasspy + node red) et un satellite pi0 basé raspbian buster avec juste rhasspy.
Bon an mal an, j’arrive à progresser un peu même si certaines choses restent floues dans ma tête sur qu’est-ce qui gère quoi et comment…
Dans la section “Use a remote HTTP server to handle intents” je peux y mettre l’url
Dans tout ça je bute sur un méchant problème : node-red ferme la porte à rhasspy d’un “401 Client Error: Unauthorized for url: http://jarvis.lan:1880/gestionIntent“.
En joignant directement cette adresse avec un browser j’obtiens toujours un écran de login.
J’ai tenté le coup avec localhost à la place de jarvis.lan et j’obtiens ceci : HTTPConnectionPool(host=’localhost’, port=1880): Max retries exceeded with url: /gestionIntent (Caused by NewConnectionError(‘: Failed to establish a new connection: [Errno 111] Connection refused’))
Ce qui paraît pire. Ce message mène à d’autres fils de discussions relatifs à des BDD
Mon google-fu ne m’a été d’aucune aide.
J’ai vu que Frenck (le dev de l’addon) a prévu une option “leave_front_door_open” mais ça ne me plaît que modérément.
En activant cette option, le problème d’accès est (temporairement) réglé.
J’ai vu ensuite qu’il avait prévu le préfixe /endpoint, avec localhost j’ai toujours le message “Max retries”, avec jarvis.lan j’obtiens un 404 -_-
Je suis évidemment une bille avec node-red, mais vu le morceau j’ignore si je dois chercher dans node red, ou bien dans le module supervisor, dans une option docker ou dans les intégrations hassio
Je précise que je ne manque pas de redémarrer les plugins après modif et que je n’ai pas oublié de cliquer sur “deploy”.
Pierre
Bonjour Pierre,
Alors comme ça, je ne vais pas t’être d’une grande aide. Le fait que node-red demande un login est étrange. Es-tu sûr du composant utilisé ? Est ce que tu fais exactement comme dans l’article ?
Comme ça, tout ce qu’on voit c’est le refus. Si tu as un autre pi sous la main (toujours utile au cas où 🙂 ), fais une install vierge de rhasspy et de node-red. Et regardes si tu as toujours le problème avec un flow simple.
Cédric
Bonjour,
avant tout super tuto.
Pierre pour ton problème tu dois mettre dans le settings de rhasspy
http://:1880/endpoint/gestionIntent
dans ton cas: http://jarvis.lan:1880/endpoint/gestionIntent
Bonjour bravo pour la qualité de votre site et merci pour le partage….
Après une lecture rapide de l’ensemble des tuto sur Rhasspy , je vais reprendre depuis le début ….
Une question : avez vous déjà testé rhasspy sur raspberry pi4 ?
merci d’avance
Bonjour,
Moi, non, mais d’autres personnes oui et elles n’ont pas eu de soucis. Et il y a beaucoup de monde aujourd’hui teste rhasspy avec le pi 4.
Ced
Bonjour,
J’ai testé Rhasspy sur RPi4 et c’est super ! 🙂
Vu la date de ton post du devrais être sur la V2.5.10, il y a qqs changements par rapport aux tutos de Ced, mais c’est dans le sens de la simplicité (le wakeword Raven personnalisable est simplissime, le TTS Larynx et nettement meilleur que nanoTTS…).
Bonne installation !