Rhasspy : sentences.ini

Tags: #<Tag:0x00007f283052bbb0>

Bonjour,

Sujet ouvert pour partager les sentences.ini contenant les intent de l’assistant vocal local Rhasspy qui semble pouvoir remplacer Snips et pour lequel @kiboost a déjà un plugin ([Plugin Tiers][Sujet Principal] JeeRhasspy) en cours.

Donc voici mon premier sentences.ini :

[OnOffJeedom]
# Number
two_to_nine = ( deux | trois | quatre | cinq | six | sept | huit | neuf )
one_to_nine = ( un | une | <two_to_nine> )
teens = ( dix | onze | douze | treize | quatorze | quinze | seize | dix sept | dix huit | dix neuf )
tens = ( vingt | trente | quarante | cinquante | soixante )
tens2 = ( soixante | quatre vingt )
one_to_hundred = ( <one_to_nine> | <teens> | <tens> [ <one_to_nine> ] | <tens2> [ ( <one_to_nine> | <teens> ) ] )
hundreds = cent
thousands = mille
number = [ [ <two_to_nine> ] <thousands> ] [ [ <two_to_nine> ] <hundreds> ] [ <one_to_hundred> ]


# Date
weekdays = ( lundi | mardi | mercredi | jeudi | vendredi | samedi | dimanche )
months = ( janvier | février | mars | avril | mai | juin | juillet | août | septembre | octobre | novembre | décembre )
monthdays = ( premier | <one_to_nine> | <teens> | vingt [ et ] [ <one_to_nine> ] | trente [ et un ] )
date = ( <weekdays> | le ) <monthdays> <months>
relative_date = ( ( demain | hier ) [ ( matin | midi | soir ) ] | <weekdays> [ ( dernier | prochain | matin | midi | soir ) ] )

# Time
hour = ( <one_to_nine> | <teens> | vingt [ et ] ( une | deux | trois ) ) heure
one_to_sixty = ( <one_to_nine> | <teens> | ( dix | vingt | trente | quarante | cinquante ) [ et ] [ <one_to_nine> ] )
minute = <one_to_sixty> [ minutes ]
time = ( minuit | <hour> ) [ <minute> ]

# Datetime
datetime = [ ( <relative_date> | <date> ) ] à <time>

# Duration
duration_seconds = <number> secondes
duration_minutes = <number> minutes
duration_hours = <number> heures
duration_days = <number> jours
duration_weeks = <number> semaines
duration_months = <number> mois
duration_years = <number> années
duration = ( <duration_years> | <duration_months> | <duration_weeks> | <duration_days> | <duration_hours> | <duration_minutes> | <duration_seconds> )

# Percent
percent = <number> pourcent

# Temperature
temperature = <number> degrés [ celcius ]

# File: slots/time
# This is rules used by the slot and shared with other slots like all rules
hour = ( <one_to_nine> | <teens> | vingt [ et ] ( une | deux | trois ) ) heure
one_to_sixty = ( <one_to_nine> | <teens> | ( dix | vingt | trente | quarante | cinquante ) [ et ] [ <one_to_nine> ] )
minute = <one_to_sixty> [ minutes ]
time = ( minuit | <hour> ) [ <minute> ]
# This is a value used for the slot
<time>

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

qui me permet de piloter pas mal d’objets dans diverses pièces (ou pas) avec ou sans durées (les tags avec un pipe ‘|’ sans rien derrière).

La partie avant action est issue d’un groupe de discussion rhasspy ( [https://community.rhasspy.org/t/support-grammar-based-slots/51/5 ]) et devrait disparaitre avec la dernière version de rhasspy Version 2.4.16 Released mentionnée par @kiboost sur le sujet de son plugin.

1 J'aime

Update :

Je suis passé à la 2.4.16 et maintenant la 2.4.17.
Mon sentences.ini du moment est :

[GetTempJeedom]
action = (quelle est la |donne moi la )
room = ( cuisine | salle de bain | salle de bains | extérieur |)
(<action>) la température [ du | de la |dans le| dans la| ] (<room>){room}

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

[OnOffTimerJeedom]
action = ( allume | éteint | mets | arrête )
object = ( ventilation | radiateur | chauffage )
room = ( salle de bain | salle de bains |)
(<action>){action} [ le | la ] (<object>){object} [ de la | dans la ] (<room>){room} ([ pendant | durant ] (0..120){duration} |) minutes
1 J'aime

Bonsoir, merci pour le partage!

J’ai ajouté ceci en début de sentence.ini:

[GetAskResponseJeedom]
oui{YesNo:oui}
non{YesNo:non}
annuler{YesNo:non}

et ceci dans les slots:

"YesNo": [
        "non",
        "oui"
    ],

pour me permettre de gérer les demandes de confirmation avec la fonction ask de Jeedom.

Je ne sais pas si c’est la meilleure façon de faire mais ça à l’aire de fonctionner pour l’instant.
Si ça peut servir…

Bonjour,

Tout peut servir à tous ou donner des idées. C’est le but du partage.
Merci.

Hello, du coup avec un cas comme ton On/Off derrière tu filtres dans ton scénario si c’est on ou si c’est off ? tu es obligé de mettre des || avec toute tes actions on ou toute tes actions off ?
Perso j’ai fait deux intent différents On/Off qui sont balancés sur 2 scénarios bien distincts côté jeedom. Je trouve plus facile à maintenir

Bonjour,

Effectivement je n’ai qu’un scénario ONOFF qui gère les onoff et les les onofftimer des différents équipements dans les différentes pièces. Le tout avec des blocs SI/ALORS/SINON du genre :

tag(intent)=='OnOffJeedom' ET tag(room) == 'salon' ET tag(object) matches '/mibox|mediacenter/'

ou

tag(intent)=='OnOffTimerJeedom' ET tag(room) matches '/bain|bains/' ET tag(object) matches '/radiateur/'

Je me pose à chaque fois la question si je le split en +s scénarios pour des questions de vitesse, de lisibilité de précision d’execution ou si je laisse. Pas non plus énormément d’équipement donc sauf si le maître @kiboost préconise un best howto je laisse en l’état.
Mais là il me semble qu’il est pas mal occupé avec la 2.5.

Perso j’ai un scenario on/off et je filtre par equipement.
J’ai beaucoup d’équipements, et l’autre logique voudrait dire une vingtaine de scenarios. Plus ch… à maintenir et plus long pour le core à vérifier en cas de déclenchement.

J’ai gardé la meme méthode décrite ici : Plugin SNIPS : Scénarios Callback

:wink:

@kiboost dispo, ça sent la 2.5 stable :rofl:

Actuellement tout marche parfaitement avec master pi4 + satellite pi0 en docker, sauf la fonction ask.

Perso je fais pas grand chose, à part énormément de tests pour être sur d’avoir tout ce dont on a besoin pour Jeedom, adapter le plugin bien sûr, et donc beaucoup de parlotte avec le dev donc. Mais avec 8h de décalage horaire c’est plus long :joy:

Tout est prêt pour le plugin et la doc, donc çà ira très vite derrière pour avoir le plugin stable.
J’essayerai ensuite de faire qql articles explicatifs en plus de la doc du plugin.

Et on a déjà pleins d’idées pour la suite, mais :shushing_face:

1 J'aime

Mais du coup ? comment tu sais si tu dois faire on ou off ? Tu fais l’inverse de l’état actuel ?

Exemple :
Capture d’écran du 2020-04-08 18-55-06

Dis moi si tu veux plus d’explication.

non très bien je vois, merci
Je maintiens ma préférence pour le filtre au niveau de l’intent :smiley:

Pour revenir dans l’idée du post je repartage mon sentences.ini du moment (+ slots)
GetAskResponseJeedom nouveau depuis que je me suis mis au ask.
YesNo récupéré je ne sais plus où et pas complètement testé

N’hésitez pas à faire pareil il y a des subtilités qui peuvent profiter aux autres :wink:

[GetTempJeedom]
action = (quelle est |donne moi |qu'elle est)
room = ( cuisine | salle de bain | salle de bains | extérieur | intérieur | exterieur | interieur | exterieur )
(<action>) la température [ du | de la |dans le| dans la| ] (<room>){room}

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

[OnOffTimerJeedom]
action = ( allume | éteint | mets | arrête )
object = ( ventilation | radiateur | chauffage )
room = ( salle de bain | salle de bains |)
(<action>){action} [ le | la ] (<object>){object} [ de la | dans la ] (<room>){room} ([ pendant | durant ] (0..120){duration} |) minutes

[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}
(1..31){Jours}

Mon seul Slot :

{
    "YesNo": [
        "( oui | ouais | yes | yep | bien sûr ):oui",
        "( non | pas | surtout pas | nan ):non"
    ]
}

Il est pas dans la doc du plugin celui la ? :thinking:

Ben voilà !
Merci pour ta doc :rofl:

Merci pour ces exemples. Je viens de découvrir la fonction « matches ». Ça va simplifier mes scénarios…

Voici ma participation. Rien de transcendant ni révolutionnaire mais ça peut peut-être donner des idées à certains…

[GetTime]
quelle heure est-il
il est quelle heure
quelle heure il est

[GetTemperature]
quelle est la température [dans (le | la)] $house_room{house_room}
quelle est la température (du | de la) $house_room{house_room}
quelle température il fait [dans (le | la)] $house_room{house_room}
quelle est la température (du | dans le) frigo{house_room}
temperature $house_room{house_room}

[ChangeLightState]
light_name = [toutes] (la | les) (lampe | lumière){light} [(du | de la | dans le | dans la) $house_room{house_room}]
(allume | éteins){state} <light_name>

[SetTimer]
(mets | règle) le (chronomètre | minuteur) sur (1..60){number} (minutes | heures){duration}
chronomètres (1..60){number} (minutes | heures){duration}
(mets | règle) l'alarme pour dans (1..60){number} (minutes | heures){duration}

[SetAmbiance]
mets (l'ambiance | une ambiance | l'éclairage | un éclairage) [pour (le | la | un)] (puissant | apéro | film | doux | détente){ambiance}

[CallJennifer]
(demande | dis) à Jennifer de descendre
appelle Jennifer

[SetRadio]
(lance | mets | je veux écouter) $stationRadio{radio} [(dans le | dans la) $house_room{house_room}]

[TurnOnOff]
$OnOff{state} (le | la) $device{device} [(du | de la | dans le | dans la) $house_room{house_room}]

[PlaySpotifyPlaylist]
(mets | lance |  joue | je veux écouter) (une | de la) (playlist | musique) $playlist_category{genre} [(dans le | dans la) $house_room{house_room}]
1 J'aime

Tout peut servir et inspirer :+1:
Par contre tu n’es pas lié au plugin jeerhasspy de @kiboost ?

Qu’entends-tu par lié ? J’utilise bien le plugin de @kiboost qui est vraiment bien fait mais c’est tout.

Il n’y a plus besoin d’avoir le mot Jeedom dans les sentences ?

Non, il n’est pas nécessaire de mettre Jeedom dans le nom de ses Intents. Par contre, si on le fait, il me semble que le plugin JeeRhasspy permet de filtrer les Intents sur ce critère .