JeeRhasspy - Plugin pour Jeedom
→ Lien market
→ Rhasspy Assistant Tips n Tricks
Plugin pour le support de l’assistant vocal Rhasspy dans Jeedom. Vous devez au préalable avoir un assistant Rhasspy fonctionnel, en version 2.5 minimum.
Configuration du plugin JeeRhasspy
Utilisation
Configuration Rhasspy
Callback Scénario
Commandes
Scripting
Configuration du plugin JeeRhasspy
Après installation du plugin, il vous suffit de l’activer. Il apparaîtra alors dans le menu Plugins > Communication.
Vous devez alors renseigner, sur la page de configuration du plugin :
- Adresse : L’adresse IP de votre Rhasspy (comprenant http:// ou https://).
- Port : Le Port de votre Rhasspy (par défaut 12101).
- Feedback : Une phrase que Rhasspy dira si il ne trouve pas de scénario correspondant à l’Intent souhaité.
- Filtrer les Intents Jeedom : A l’importation de l’assistant, seuls les Itents donc le nom finit pas jeedom seront crées (TurnOnJeedom, LightSetJeedom, etc).
- Variables rhasspyWakeWord / rhasspyWakeSiteId : Quand le wakeword est détecté, le plugin renseigne ces deux variables avec le wakewordId et siteId. Vous pouvez alors déclencher un scénario sur
#variable(rhasspyWakeWord)#
pour par exemple couper la musique le temps de votre demande.
Utilisation
Une fois le plugin configuré, il faut une première fois importer l’assistant Rhasspy.
A l’importation, il y a trois options possible: Lors de la première importation, ces options n’ont pas d’incidence.
- Conserver toutes les Intentions : Ne supprime aucun Intent, et crée ceux non présent dans Jeedom.
- Supprimer les Intentions qui ne sont plus dans l’assistant : Supprime seulement les Intents de Jeedom qui ne sont plus dans Rhasspy.
- Supprimer et recréer toutes les Intentions : Supprime tous les Intents de Jeedom, avant de recréer les Intents présents sur Rhasspy.
L’importation de l’assistant va créer :
- Un Device : C’est votre machine Rhasspy.
- Vos Intentions : Chaque Intent présent sur votre assistant Rhasspy.
Tip
Vous pouvez supprimer des intentions de trois façons:
- En réimportant votre assistant, suivant l’option choisie (voir ci-dessus).
- En utilisant le bouton Supprimer les intentions, qui supprimera tous vos Intents actuels du plugin.
- Sur une intention, utilisez le bouton Supprimer.
Si vous avez également des satellites reliés à votre Rhasspy, créez les dans le plugin avec le bouton Ajouter un satellite. Vous devrez renseigner l’url complète du satellite.
Pour le maître (master) et chaque satellite, vous disposez sous son icône de plusieurs boutons:
- Supprimer le device Rhasspy : Présent uniquement sur les satellites, il permet de le supprimer du plugin.
- Configurer le profile Rhasspy : Permet de configurer automatiquement le profile Rhasspy du device. Voir ci-dessous.
- Test TTS sur ce device : Effectue un test TTS que vous entendrez sur le device sur lequel vous avez cliqué.
- Ouvrir l’interface de ce device : Ouvre l’interface Rhasspy du device dans un autre onglet.
Tip
Pour nommer votre device Rhasspy, vous devez :
- Sur l’interface de Rhasspy, aller sur l’onglet Settings
- Renseigner un nom dans le champ siteId
Configuration Rhasspy
Pour que Rhasspy envoie les événements souhaités à Jeedom, vous devez modifier son profile.
Si vous avez des satellites, il faudra le faire sur chacun d’entre eux.
Vous pouvez le faire:
- Automatiquement avec le bouton Configurer le profile Rhasspy sous le Device correspondant.
Si vous utilisez l’option permettant de renseigner les variables rhasspyWakeWord / rhasspyWakeSiteId sur détection du wakeword, cochez la case Configurer l’event Wakeword Detected.
- Manuellement :
Par l'interface de Rhasspy, ou directement en éditant le profile.json sur le Rhasspy
- Intent recognized : Par l'interface de Rhasspy, onglet *Settings*, puis *Intent Handling* : Use a remote HTTP server to handle intents : cochez l'option et renseignez l'url. En éditant `.config\rhasspy\profiles\fr\profile.json` : ```json "handle": { "system": "remote", "remote": { "url": "http://x.x.x.x:80/core/api/jeeApi.php?plugin=jeerhasspy&apikey=---apikey---&plugin=jeerhasspy&type=jeerhasspy" } }, ``` - Wakeword detected : Cette option n'est pas disponible par l'interface de Rhasspy. En éditant `.config\rhasspy\profiles\fr\profile.json` : ```json "webhooks": { "awake": ["http://x.x.x.x:80/core/api/jeeApi.php?plugin=jeerhasspy&apikey=---apikey---&plugin=jeerhasspy&type=jeerhasspy"] }, ```Callback Scénario
Pour chaque Intention (Intent), vous devez :
- Renseigner un scénario qui sera exécuté à la détection de cet Intent par Rhasspy.
- Renseigner l’action à réaliser sur le scénario (start, …).
- Cocher les informations comprises dans l’Intent, qui seront passées au scénario sous forme de tags.
- Renseigner une Confidence minimale pour l’exécution du scénario. Vous pouvez aussi la laisser à 0 et la vérifier dans le scénario avec un SI tag(confidence) > 0.
- Renseigner éventuellement d’autres tags spécifiques.
Tip
Vous pouvez aussi utiliser les interactions de Jeedom en cochant la case Interaction
Exemple de scénario
Voici un exemple de scénario.
Le premier bloc SI sera commun à la plupart de ce type de scénario : On veut savoir d’où vient la demande pour pouvoir la traiter correctement. house_room est un slot de rhasspy, par exemple, si on lui demande :
Allume la lumière de la cuisine
Voici ce que rhasspy va envoyer au plugin :
```json { "intent": { "name": "lightsTurnOnJeedom", "confidence": 1 }, "entities": [{ "entity": "house_room", "value": "cuisine", } ], "text": "allume les lumière de la cuisine", "wakeId": "someoneHere", "siteId": "salon" } ```Le plugin sait donc de quelle intention il s’agit, et lance alors le scénario correspondant avec les tags suivant :
Start : Lancement provoque. Tags : {"#intent#":"lightsTurnOnJeedom","#confidence#":"1","#wakeword#":"someoneHere","#query#":"allume les lumière de la cuisine","#siteId#":"salon","#house_room#":"cuisine"}
Donc si a on pas de tag(house_room), car on peut simplement lui demander d’allumer la lumière sans préciser où, on a deux solutions :
- Soit le siteId n’est pas renseigné dans Rhasspy, donc on donne le nom de notre device de base (maître) Rhasspy, ici dans le salon.
- Soit le siteId est renseigné, et on l’utilise. Et si on a le tag(house_room), on l’utilise. On a donc maintenant tag(rhasspy_room) qui correspond à la pièce souhaitée.
Le deuxième bloc SI n’est pas obligatoire. Vous pouvez lancer le même scénario pour plusieurs intents, et il sert donc à filtrer l’intent souhaité. Par exemple si on veux allumer ou éteindre une lumière.
Finalement, on vérifie de quelle lumière il s’agit : SI tag(rhasspy_room) matches "/cuisine|maison/"
En matchant cuisine ou maison, on pourra aussi demander :
Allume les lumières de la maison
On peut aussi différencier en bas, en haut pour pouvoir demander :
Allume les lumières en bas
Avec SI tag(rhasspy_room) matches "/cuisine|maison|en bas/"
Et ainsi de suite …
Commandes
Sur chaque device Rhasspy, il y a sept commandes:
- Speak : Permet d’énoncer un texte.
- dynamic Speak : Permet d’énoncer un texte construit dynamiquement.
- Ask : Permet d’utiliser la fonction Ask de Jeedom.
- setVolume : Permet de régler le volume de sortie (TTS) entre 0 et 1.
- repeatTTS : Répète la dernière phrase émise (TTS).
- ledOn : Permet d’allumer les LEDs.
- ledOff : Permet d’éteindre les LEDs.
Ces deux dernières commandes nécessitent HermesLedControl.
TTS
Les commandes Speak et dynamic Speak disponibles sur le Master possèdent un champ siteId:lang permettant de faire parler un satellite, et dans une langue au choix. Quelques exemples :
- salle, studio : Le texte sera prononcé simultanément par ces deux devices Rhasspy.
- :en : Le texte sera prononcé en anglais.
- studio:es : Le texte sera prononcé sur le satellite studio, en espagnol.
Commande dynamic Speak
Cette commande permet de construire un texte dynamique en fonction d’informations d’équipements dans Jeedom.
Par exemple, vous voulez demander à Rhasspy si le volet est ouvert. L’information dans Jeedom étant le pourcentage d’ouverture, ou 0 / 1, la réponse ne sera pas très waf (Wife Acceptance Factor).
Vous pourriez faire plusieurs blocs SI pour testant chaque possibilité et renvoyer le bon texte, mais çà complexifie énormément les scénarios.
La commande dynamic Speak va vous permettre de faire simplement :
Le volet de la salle est {#[Salon][Volet Terrasse][Etat]#|0:fermé|<99:ouvert à #[Salon][Volet Terrasse][Etat]# pourcent|99:ouvert}
Donc, on passe d’abord l’information dans un {} puis, séparés par des |, on passe les conditions si:alors avec le si comme valeur et le alors comme texte. Dès qu’une condition est trouvée, l’évaluation s’arrête. Si le volet est à 0 c’est bien ‘fermé’ qui sera énoncé, car <99 ne sera pas évalué.
Un autre exemple pour demander si une lumière est allumée ou éteinte :
La lumière est actuellement {#[Cuisine][Lumière][Etat]#|0:éteinte|1:allumée}
Commande Ask
Vous pouvez utiliser la commande interne de Jeedom Ask pour que votre Rhasspy vous pose une question, et attende votre réponse. Votre scénario pourra ensuite agir en fonction de votre réponse.
Pour cela vous devez indiquer :
- Dans le champ Réponse : Le nom du slot contenant la réponse, tel que définit dans Rhasspy.
Exemple
Dans le screen ci-dessous, j'utilise le slot YesNo dans le champ **Réponse**. Voici l'intent correspondant: ``` [GetAskResponseJeedom] bien sur que ($YesNo){YesNo} mais ($YesNo){YesNo} surtout pas (:){YesNo:non} bien sur (:){YesNo:oui} ($YesNo){YesNo} oui{YesNo:oui} non{YesNo:non} ``` Et le slot: ``` "YesNo": [ "( non | pas | surtout pas | nan ):non", "( oui | ouais | yes | yep | bien sûr ):oui" ] ```- Dans le champ Commandes : La commande Ask du device rhasspy.
Voici un exemple :
Si vous avez un maître et des satellites, la commande Ask devra correspondre au device d’où vient la demande.
Dans ce cas, créez un tag(profile) avec le siteId et écrivez la commande ask comme cela :
#[Rhasspy-Intents][TTS-#profile#][Ask]#
Jeedom changera alors automatiquement le nom de la commande avec le siteId, et la demande de confirmation Ask sera émise sur le bon device.
Les autres commandes sont des commandes simples qui ne nécessitent pas vraiment d’explications ;-)
Scripting
Si vous souhaitez retrouver un device Rhasspy avec un plugin script ou dans un bloc code de scénario, voici la manière la plus simple et sûr de le retrouver :
- Le device maître :
$eqLogic = eqLogic::byLogicalId('TTS-'.config::byKey('masterSiteId', 'jeerhasspy'), 'jeerhasspy');
- Un satellite (fonctionne aussi pour le maître) :
$_siteId = 'satName';
$eqLogic = eqLogic::byLogicalId('TTS-'.$_siteId, 'jeerhasspy');
Comme la commande speak du maître permet de faire parler un satellite, un petit exemple simple :
$eqLogic = eqLogic::byLogicalId('TTS-'.config::byKey('masterSiteId', 'jeerhasspy'), 'jeerhasspy');
$cmd = $eqLogic->getCmd('action', 'speak');
$options = array(
'title'=>'monSatellite:es',
'message'=>'Como esta ?'
);
$cmd->execCmd($options);