Intent avec slots
Bon, je ne vais pas te laisser comme ça. On va faire un dernier exemple mais avec une nouvelle intent dont il faudra récupérer la valeur des slots. Les étapes seront moins détaillées pour gagner du temps mais rien de plus que ce que tu as déjà avant.
Cette seconde intent va s’appeler « AllumerLumiere » et elle permettra en option de sélectionner une couleur
Création du slot et des sentences
Pour cela, on va en pré-créer 2 : piece et color
Si tu ne sais pas pré-créer 2 slots, alors il faut aller lire cet article sur les slots.
Et maintenant, dans la partie sentence, nous allons mettre ceci :
[AllumerLumiere]
Allume la lumière [(du | de | de la | des | dans l| dans la | dans le )]($piece){piece} [en ($color){couleur}]
Là, on souhaite une intent qui allume la lumière d’une pièce avec en option une couleur spécifiée. On va donc avoir 2 types de phrases possibles :
- Allume la lumière […] <piece>
- Allume la lumière […] <piece> en <couleur>
Là encore, si tu veux plus d’information sur la création des intents et des sentences, c’est dans cet article que ça se passe.
On sauvegarde donc avec le bouton bleu « Save Sentences » et normalement, notre Rhasspy s’entraine à détecter notre nouvelle intent AllumerLumiere
.
On le tente sur la page d’accueil.

C’est nickel, on a plus qu’à aller s’occuper de node-red
Gestionnaire d’exécution de l’intention avec node-red
On retourne sur notre flow et la première chose qu’on va faire c’est ajouter la gestion d’une intent à notre trieur. Pour ça, on double clique sur notre composant switch « Intent name » et on le remplit de cette façon :

Notre trieur d’intent a désormais la seconde sortie comme sortie pour l’intent AllumerLumiere
. La 3eme sortie devient la sortie par défaut.
On a vu plus haut qu’on allait avoir 2 types de phrases possibles. Une avec la couleur et une autre sans. Du coup, on ajoute un composant de type switch qui nous permettra avec ces 2 sorties, 2 phrases de retour possibles.
On configure notre nouveau composant switch comme ceci :

Et on oublie pas d’arrêter le test si une condition vraie est rencontrée

Normalement, tu devrais être ici :

Il ne nous reste plus qu’à mettre les 2 phrases possibles dans un composant function. On crée donc 2 composants function.
Le premier s’appellera « Avec couleur »
var text = "La lumière de la pièce " + msg.payload.slots.piece + " est allumée en " + msg.payload.slots.couleur
msg.payload.speech = {"text": text }
return msg;
Le second s’appellera « Sans couleur »
var text = "La lumière de la pièce " + msg.payload.slots.piece + " est allumée."
msg.payload.speech = {"text": text }
return msg;
Il ne nous reste plus qu’à relier tout ça correctement et tu obtiens ça :

Il ne te reste plus qu’à déployer ce nouveau flow et de demander à ton assistant : « Allume la lumière du salon en rouge ».
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