Rhasspy et node-red

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 :

MethodPOST
URL/gestionIntent
Nameecoute 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.

9 Comments

  1. 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

  2. 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

  3. 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

  4. 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

Poster un Commentaire

Votre adresse de messagerie ne sera pas publiée.


*


Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.