Rhasspy : sentences.ini

Bonjour,

Quelqu’un a un exemple de sentences avec un ET (optionnel) du genre ?
« Allume la lumière et la télévision du salon »
intent qui marche donc aussi pour
« Allume la lumière du salon »
« Allume la télévision du salon »
Le mien ne prend que le 2 ième objet :

[OnOff]
action = ( allume | éteint | mets | arrête | ouvre | ferme)
object = ( lampe | lumière| tv | télé | télévision | ventilation | radiateur | chauffage | mibox | mediacenter | matrix | tout )
room = ( cuisine | salon | salle de bain | salle de bains | garage |)
(<action>){action} [ le | la ]  (<object>){object} [ et [ le | la ] (<object>){object} ] [ du | de la | dans la | dans le | au ] (<room>){room}

Bonjour à tous
Ci-dessous, ma sentence volet et mes slots pour ce que cela vaut.
Ma logique a été d’en mettre un maximum possible dans Rhasspy sur RPI dédié pour simplifier mes scenarios dans mon jeedom sur un autre RPI et de ne pas trop le surcharger…
Je ne sais si pas si c’est très très clean, d’autant que je n’avais pas vu ce post auparavant avec de bons exemples, notamment ceux de Raqpub.

Je suis parti sur une logique d’une sentence par type d’équipements et un scénario associé. Ceci pour affiner au mieux les phrases aux différentes variations d’une personne à l’autre.
Ma sentence pour les volets
[VoletsJeedom]
($action_volets) {action_rhas} [$nbdevolets_rhas] {nb_de_volet_rhas} [(volet | volets | fenêtres | fenêtre)] {objet_rhas} [ (de: | la: | du: | de l: | de la: | d en) ] [ ($pieces) ] {piece_rhas} [à: | à la] [(0…100 | $position)] {position_rhas} [pourcent]

Cela permet d’être assez flexible dans la manière de demander les mêmes actions avec ou sans indication de % d’ouverture.
Dans le scenario, s’il est détecté qu’une position est donnée alors les actions up ou down sont ignorées. Cela peut amener à des bizarreries du style : le volet est à 10%, la phrase = descend le volet à 50%, et bien le volet va monter.
Si pas de position, alors on regarde l’action up ou down et j’associe une position de 0 ou 100 en fonction. Derrière des scenarios sont appelés pour positionner les volets en passant un tag position. Cela permet d’avoir un script Jeerhasspy pas trop usine à gaz.

Pour les slots d’action:
(baisse | baisser | ferme | fermer | descends | descendre):down
(met | mettre | positionne | positionner | règle | régler):set
(monte | monter | ouvre | ouvrir ):up:
Cela doit permettre d’adresser pas mal de cas d’usage.

Pour les pièces, avec plusieurs volets roulants dans la même pièce, cela peut -être tordus.
La définition de la pièce cible est en partie définit dans Rhasspy grace aux synonymes et en partie dans le scenario Jeerhasspy s’il subsiste un doute.

(salon | séjour):salon_volet1et2et3
(entrée | devant):salon_volet3
(cuisine):cuisine_volet4
(salle à manger | table):salon_volet2
(chambre | chambre une | chambre des parents):ch1_volet1
(chambre 2 | chambre 2 | chambre de Louise):ch2_volet4
(rez de chaussée | bas):rdc_volet1et2et3et4
(premier | premier étage | étage | haut):etage_volet1et2et3et4
(maison):touslesvolets
(chambre 3 | chambre trois | bureau |chambre d’ami):ch3_volet2et3
(télévision | télé | tv | canapé):salon_volet1
(terasse):salon_volet1et2

Pour la position des volets, comme on ne va pas positionner au volet près, j’ai créés les slots suivants
(moitié | mi hauteur):50
(trois quart):75
(deux tiers):66
(quart):25
(tiers):33
A toutes fins utiles.

J’ai encore un peu d’optimisation à faire + exploiter des tags que j’ai prévu mais pas encore exploités dans mes scenarii.
Et puis, faut que je regarde « match » et « ask »

Merci pour le partage.

Bon je viens de commencer ma migration de snips a rhasspy ca promet de bien belle chose.

Donc pour ma part j’ai commencé a mettre ça en place

Des slots :

rooms

jardin
bureau
salle de bain
entrée
(chambre | chambre d'ami)
salon
cuisine

states

(éteins | arrête):off
(allumes | démarre | lance | joue):on

Et en sentences :

[lightsTurnOnOffJeedom]

states = ($states){state}
light_name = (la lumière){name}
rooms=($rooms){house_room} 
<states> <light_name> [<rooms>]

Ce qui me permet quelque chose d’assez générique, qui me permet de préciser une pièce ou non. je penses rajouter un slot pour avoir une liste d’appareil et ensuite tout sera gérer dans un seul scénario pour allumer éteindre en fonction de la pièce et de l’appareil, augmenter d’iminuer les intensité lumineuse etc…

Je suis très content de cette découverte de rhasspy et merci @kiboost pour le boulot sur le plugin

Merci pour le partage.
Du coup tu me donnes l’envie de simplifier le mien avec les slots (que je n’avais mis que pour le ask)

Je penses que les slots peuvent être très utiles, reste a voir comment bien les utiliser, je pensais pas exemple faire un slot de tout les films que je possède afin de pouvoir rien qu’a la voix dire a kodi de mettre tel ou tel film

Autre avantage des slots ce sont des sentences comme les autres au final

Salut à tous,

j’ai le sentiment de faire la brebis galeuse, mais en faisant un copier coller de vos sentences.ini et du slot YesNo proposé, j’ai cette erreur sur rhasspy :

FileExistsError: [Errno 17] File exists: ‹ /profiles/fr/slots ›
une idée de ce que cela pourrait être ?

Bon, je m’auto-réponds, j’ai supprimé le fichier slots et recréé le slot YesNo, cette fois-ci c’est passé… N’empêche ça me parait un peu ésotérique, cette histoire :slight_smile:

Pour aider ceux uqi auront le même problème :
J’ai eu le même soucis, alors je ne sais pas si c’est à cause d’une vielle install d’essai ou si c’est un bug à la première utilisation des slots mais j’avais un fichier slots dans le répertoire /profiles/fr/ alors que Rhasspy 2.5 attend un répertoire slots dans lequel il mettra un fichier par slot. J’ai donc fait comme toi, effacé le fichier slots, enregistré ma config dans Rhasspy et il a créé le répertoire et ses sous fichiers sans problème.

1 « J'aime »

bonjour à tous,

je prend le train en marche et j’essaie de m’y mettre également, j’ai mis un docker rhasspy sur raspbian côte à côte avec jeedom

j’ai réussi également à importer l’assistant sans problème via le plugin dans jeedom, le micro et mes enceintes sont fonctionnelles également sur le raspberry

j’ai configuré les paramètres (j’ai pris ceux par défaut dans la doc) via la page web d’administration rhasspy, jusque là ca as l’air pas trop mal

En revanche, j’ai toujours pas pigé la philosophie d’interactions entre rhasspy et jeedom, est-ce que quelqu’un peut me « dégrossir » les étapes essentielles pour lancer des commandes à la voix ?

typiquement, j’aimerai juste commencer à allumer/éteindre mon poele de cette manière pour tester, voir si j’arrive un peu a quelque chose :sweat_smile:

Bonjour,

Il faut que ailles voir les infos et la doc du plugin jeeRhasspy de @kiboost

cf Lien sur 1er post

Je suis désolé, j’ai beau parcourir la doc de long en large, je dois sûrement être débile, mais je ne comprend pas tout

je vais tout simplement abandonner, cela ne doit pas être pour moi

En quelques mots :
Rhasspy reconnait des mots clef appelés SLOTS
Les INTENTS sont des actions.

Le site Coxprod DIY - Bidouilles et découvertes et pis c'est tout :) est bien documenté en complément de la doc

Perso, un truc à côté duquel j’étais complètement passé à côté, c’est la configuration des équipements (master, satellites) depuis le plugin rhasspy. C’est documenté pourtant, mais cette partie est pas ultra intuitive car je m’attendais à ce que ça roule tout seul lors de l’importation de l’assistant. Il suffit de cliquer pourtant sur un bouton et le tour est joué ^^ à partir de là mes scénarios jeedom ont bien été exécuté suite à la reconnaissance de l’intention dans rhasspy. Mais on s’éloigne un peu du sujet de ce topic qui est les sentences et les slots. Si tu veux, rejoins un des discords parmi nextdom, domotech ou communauté domotique DIY, y a plein de gens de bonnes volontés pour aider :slight_smile:

Bonjour,

As-tu réussi. Besoin d’aide ?

erreur désolé

Je vous propose un module à adjoindre à sentences.ini
à l’heure actuelle la dernière version (2.5.8) utilise Kaldi FST et permet d’avoir des intents avec des plages de nombres
tel que
<[testnombre]
test (1…10) {value}

Mais j’ai remarqué que si on as besoin d’une plage assez large … l’entrainement prends énormément de temps et le fichier /profiles/fr/kaldi/language_model.txt gonfle de manière exponentielle.
j’ai donc cherché une solution qui soit plus rapide et moins gourmande en utilisant les nombres sous forme texte
je me suis inspiré d’autres posts et voici le résultat pour 1 à 9999 (modifiable à millions etc …) :
new sentences files → nom Chiffres

[strchiffres]
deux_a_neuf = ( deux | trois | quatre | cinq | six | sept | huit | neuf )
un_a_neuf = ( (un | et un) | (une | et une) | <deux_a_neuf> )
dix_dixneuf = ( dix | onze | douze | treize | quatorze | quinze | seize | dix sept | dix huit | dix neuf )
diz_simple = ( vingt | trente | quarante | cinquante | soixante )
diz_double = ( soixante dix | quatre vingt )
un_a_cent = ( <un_a_neuf> | <dix_dixneuf> | <diz_simple> [ <un_a_neuf> ] | <diz_double> [ ( <un_a_neuf> | <dix_dixneuf> ) ] )
cent = ( cent | cents )
mille = mille
#pour million
#million = (million | millions)
#nombre = [ [ <un_a_neuf> ] ] [ [ <un_a_cent> ] ] [ [ <deux_a_neuf> ] ] [ [ <un_a_cent> ] ] [ [ <deux_a_neuf> ] ] [ <un_a_cent> ]
#sans million
nombre = [ [ <deux_a_neuf> ] ] [ [ <un_a_cent> ] ] [ [ <deux_a_neuf> ] ] [ <un_a_cent>

la sentence :

[testChiffre]
voir <strchiffres.nombre> {value}

c’est beaucoup plus rapide et suffit de passer par text2num pour avoir la valeur numérique

Arpagor

Faites ce test et vous comprendrez !!!

[testChiffre]
voir <strchiffres.nombre> {value}

[testNum]
affiche (1…100000) {value}

déja la durée du trainning du (1…100000) vous verrez

et les tempes de réponse à
voir 99000 (instantané)
affiche 99000 !!! > 13 secondes

Arpagor

1 « J'aime »

Bonjour,

Je vois que tu es en 2.5.8 est-ce que tu es sur pi3B et si oui est-ce que c’est suffisamment performant et est-ce que la reco vocale marche bien ?
(Je suis resté en 2.4.19 )

Effectivement je me suis mis en 2.5.8 mais en version environnement virtuel (pas docker)
aucun soucis depuis le passage en FST de Kaldi

Cordialement
Arpagor