Reconnaissance vocale ne fonctionne pas après wake word

Bonjour,

Voulant tester la commande vocale, j’ai installé Jeerhasspy sur un PI3 couplé à un respeaker 4-mic et sous Jeedom 4.0.35.

J’ai suivi les procédures décrites ici et mais cela ne fonctionne pas.

Voici ma configuration:
MQTT DISABLED
Intent Handling remote
Wake Word snowboy
Voice Detection webrtcvad
Speech to Text kaldi
Intent Recognition fsticuffs
Text to Speech picotts
Microphone arecord
Sounds aplay

Depuis Rhasspy, lorsque je dicte « allume la lumière du salon » via « Hold to record », les mots sont bien entendus et je vois des logs dans Jeedom.

Voici les logs de rhasspy :

[INFO:26718252] quart.serving: 10.10.10.2:60212 POST /api/stop-recording 1.1 200 22 15914654
[DEBUG:26718239] InboxActor: -> stopped
[DEBUG:26718230] RemoteIntentHandler: {'speech': {'text': ''}}
[DEBUG:26718223] urllib3.connectionpool: http://10.10.10.1:80 "POST /core/api/jeeApi.php?plugin=jeerhasspy&apikey=12345654321azertyuiopoiuytreza&plugin=jeerhasspy&type=jeerhasspy HTTP/1.1" 200 22
[INFO:26718194] quart.serving: 10.10.10.2:60206 GET /api/events/intent 1.1 101 - 91555955
[DEBUG:26718186] urllib3.connectionpool: Starting new HTTP connection (1): 10.10.10.1:80
[DEBUG:26718164] __main__: {"intent": {"name": "OnOffJeedom", "confidence": 1.0}, "entities": [{"entity": "action", "value": "allume", "raw_value": "allume", "start": 0, "raw_start": 0, "end": 6, "raw_end": 6, "tokens": ["allume"], "raw_tokens": ["allume"]}, {"entity": "object", "value": "lumi\u00e8re", "raw_value": "lumi\u00e8re", "start": 10, "raw_start": 10, "end": 17, "raw_end": 17, "tokens": ["lumi\u00e8re"], "raw_tokens": ["lumi\u00e8re"]}, {"entity": "room", "value": "salon", "raw_value": "salon", "start": 21, "raw_start": 21, "end": 26, "raw_end": 26, "tokens": ["salon"], "raw_tokens": ["salon"]}], "text": "allume la lumi\u00e8re du salon", "raw_text": "allume la lumi\u00e8re du salon", "recognize_seconds": 0.003979811001045164, "tokens": ["allume", "la", "lumi\u00e8re", "du", "salon"], "raw_tokens": ["allume", "la", "lumi\u00e8re", "du", "salon"], "wav_seconds": 0.0, "transcribe_seconds": 0.0, "speech_confidence": 1, "slots": {"action": "allume", "object": "lumi\u00e8re", "room": "salon"}, "wakeId": "", "siteId": "default"}
[DEBUG:26718162] InboxActor: -> stopped
[DEBUG:26718143] __main__: allume la lumière du salon
[DEBUG:26718141] InboxActor: -> stopped
[DEBUG:26718136] KaldiDecoder: allume la lumière du salon
[DEBUG:26702416] KaldiDecoder: ['bash', '/profiles/fr/kaldi/model/decode.sh', '/opt/kaldi', '/profiles/fr/kaldi/model', '/profiles/fr/kaldi/model/graph', '/tmp/tmpceg5a_53.wav']
[DEBUG:26702345] __main__: Recorded 96044 byte(s) of audio data
[DEBUG:26702343] InboxActor: -> stopped
[INFO:26699496] quart.serving: 10.10.10.2:60212 POST /api/start-recording 1.1 200 2 12300

Et ceux de Jeedom via Jeerhasspy (remplacer cuisine par salon mais le problème n’est pas situé là) :

[2020-02-28 22:24:43][DEBUG] : [jeerhasspy] <event> Event received: {"intent":{"name":"OnOffJeedom","confidence":1},"entities":[{"entity":"action","value":"allume","raw_value":"allume","start":0,"raw_start":0,"end":6,"raw_end":6,"tokens":["allume"],"raw_tokens":["allume"]},{"entity":"object","value":"lumi\u00e8re","raw_value":"lumi\u00e8re","start":10,"raw_start":10,"end":17,"raw_end":17,"tokens":["lumi\u00e8re"],"raw_tokens":["lumi\u00e8re"]},{"entity":"room","value":"cuisine","raw_value":"cuisine","start":24,"raw_start":24,"end":31,"raw_end":31,"tokens":["cuisine"],"raw_tokens":["cuisine"]}],"text":"allume la lumi\u00e8re de la cuisine","raw_text":"allume la lumi\u00e8re de la cuisine","recognize_seconds":0.0055666379921604,"tokens":["allume","la","lumi\u00e8re","de","la","cuisine"],"raw_tokens":["allume","la","lumi\u00e8re","de","la","cuisine"],"wav_seconds":0,"transcribe_seconds":0,"speech_confidence":1,"slots":{"action":"allume","object":"lumi\u00e8re","room":"cuisine"},"wakeId":"","siteId":"default"}
[2020-02-28 22:24:43][DEBUG] : [jeerhasspy] <exec_callback_scenario> callback_settings: ""

Voici une partie des logs Rhasspy lorsque je dicte (après avoir cliqué sur « Wake ») :

[INFO:29163733] quart.serving: 10.10.10.2:60362 POST /api/listen-for-command 1.1 200 22 12303703
[DEBUG:29163715] InboxActor: -> stopped
[DEBUG:29163706] SnowboyWakeListener: loaded -> listening
[DEBUG:29163704] DialogueManager: ready -> asleep
[INFO:29163703] DialogueManager: Automatically listening for wake word
[DEBUG:29163700] DialogueManager: handling -> ready
[DEBUG:29163698] RemoteIntentHandler: {'speech': {'text': ''}}
[DEBUG:29163693] urllib3.connectionpool: http://10.10.10.1:80 "POST /core/api/jeeApi.php?plugin=jeerhasspy&apikey=12345654321azertyuiopoiuytreza&plugin=jeerhasspy&type=jeerhasspy HTTP/1.1" 200 22
[DEBUG:29163678] urllib3.connectionpool: Starting new HTTP connection (1): 10.10.10.1:80
[DEBUG:29163648] DialogueManager: recognizing -> handling
[DEBUG:29163652] WebSocketObserver: {"text": "", "intent": {"name": "", "confidence": 0}, "entities": [], "raw_text": "", "speech_confidence": 1, "wakeId": "", "siteId": "default", "slots": {}}
[DEBUG:29163622] APlayAudioPlayer: ['aplay', '-q', '-D', 'default:CARD=AUDIO', '/usr/share/rhasspy/etc/wav/beep_error.wav']
[DEBUG:29163618] DialogueManager: {'text': '', 'intent': {'name': '', 'confidence': 0}, 'entities': [], 'raw_text': '', 'speech_confidence': 1, 'wakeId': '', 'siteId': 'default'}
[ERROR:29163609] FsticuffsRecognizer: in_loaded
Traceback (most recent call last):
File "/usr/share/rhasspy/rhasspy/intent.py", line 183, in in_loaded
**assert recognitions, "No intent recognized"**
**AssertionError: No intent recognized**
[DEBUG:29163604] DialogueManager: decoding -> recognizing
[DEBUG:29163602] DialogueManager: (confidence=1)
[DEBUG:29163598] KaldiDecoder:
[DEBUG:29153374] KaldiDecoder: ['bash', '/profiles/fr/kaldi/model/decode.sh', '/opt/kaldi', '/profiles/fr/kaldi/model', '/profiles/fr/kaldi/model/graph', '/tmp/tmp6xu4ey4f.wav']
[DEBUG:29153289] APlayAudioPlayer: ['aplay', '-q', '-D', 'default:CARD=AUDIO', '/usr/share/rhasspy/etc/wav/beep_lo.wav']
[DEBUG:29153283] DialogueManager: awake -> decoding
[DEBUG:29153280] WebrtcvadCommandListener: listening -> loaded
[DEBUG:29153278] WebrtcvadCommandListener: Voice command finished
[DEBUG:29151779] WebrtcvadCommandListener: Voice command started
[ERROR:29151611] __main__: api_websocket

Traceback (most recent call last):
File "app.py", line 1232, in wrapper
return await func(queue, *_args, **kwargs)
File "app.py", line 1267, in api_events_wake
message_type, text = await queue.get()
File "/usr/lib/python3.6/asyncio/queues.py", line 167, in get
yield from getter
concurrent.futures._base.CancelledError
[ERROR:29151609] __main__: api_websocket
Traceback (most recent call last):
File "app.py", line 1232, in wrapper
return await func(queue, *_args, **kwargs)
File "app.py", line 1267, in api_events_wake
message_type, text = await queue.get()

L’erreur ci-dessous m’interpelle mais je n’ai pas trouvé de solution…

**assert recognitions, "No intent recognized"**
**AssertionError: No intent recognized**

Avez-vous une piste ?

Merci par avance et félicitations à Kiboost pour le développement du plugin.
Franck

Hello,

Visiblement, dans le plugin sur ton intent OnOffJeedom tu n’a pas renseigné de scénario callback
Jeedom | Plugin JeeRhasspy | Jeedom by KiboOst

Pour le No intent recognized c’est simplement que rhasspy n’a pas reconnu intent par rapport à ce que tu a dit, tout est normal.

Merci pour la réponse mais sauf erreur de ma part, j’ai bien renseigné le scénario callback:
image

J’avais oublié de joindre une capture au clique sur « Wake » suivi de la diction:

Bon alors, je ne sais pas comment exprimer combien je suis confus… Kiboost, je t’ai fait perdre du temps à répondre parce que cela fonctionne et fonctionnait déjà probablement depuis plusieurs jours.

L’explication est « bête », au déclenchement du wake word (que j’avais personnalisé grâce à ton tuto), on entend 3 sons. Je pensais que:
-le 1er voulait dire qu’il avait entendu l’appel
-le 2ème qu’il écoutait la requête
-3ème dans le cas où il n’avait pas compris

Or cela se passe comme ci-dessous:
-le 1er indique qu’il a entendu l’appel et c’est maintenant qu’il faut donner les ordres
-le 2ème pour dire qu’il a entendu la requête
-déclenchement du scénario donc pas de 3ème son…!
Et là, tout est OK…! :confused:
Tant pis si j’ai l’air encore plus bête mais c’est indiqué quelque part? :thinking:

Je m’en suis plus ou moins rendu compte parce que mon système s’est un peu emballé lorsque j’ai augmenté volontairement la sensibilité. Alors que la télé était allumée, j’ai vu des ordres être interprétés suivi des actions. Certes, ce n’était pas cohérent (ex: allume la télé du toilettes…) mais ça fonctionnait:
image

C’est bluffant d’efficacité car ça fonctionne même s’il y a une pollution sonore (ex: télé)!

2 problèmes malgré tout:
J’ai un délai de ±8 secondes entre le 2ème son et le déclenchement du scénario…Il me semble avoir vu un sujet sur le forum.

Autre problème plus conséquent, la mise en place des scénarios et j’ai pas encore tout saisi pour intégrer « allumer » et « éteindre » dans le même scénario. Est-ce possible? Je sèche…

YAPUKA éplucher le forum et les différents tutos à disposition.!
Merci encore Kiboost! :wink:

Bonjour Cyberfrk,
Je rencontre exactement le problème que tu avais au départ. Les ordres passent très bien en cliquant sur le bouton « wake up » et en dictant la cde, mais pas par le « wake word », pourtant il est bien reconnu lorsque je regarde le log.
Apparemment tu aurais trouvé…
Tu parles de trois sons au déclenchement du wake word. De mon coté je ne les ais pas.
Comment as tu fais pour les installer ? et ou les as tu trouvé ?
Merci d’avance

Bonjour,

Les sons sont présents dans les dossiers suivants :
Capture d’écran de 2020-10-24 08-14-07

Oups, désolé Maxland et merci à Chris77c. J’étais pris dans un projet multiroom avec des rpis où je galère à coupler rhasspy et squeezelite sur un unique rpi par pièce (le son est monopolisé par LMS, bref je m’écarte du sujet initial…).

Hello,
J’avais réussi à faire cohabité Squeezelite et Snips en utilisant la sortie audio DMIX (et en bricolant la config son du pi). Mais j’ai laissé tombé car il y avait un décalage en synchro multiroom avec un client PC Squeezelite. Mais si tu n’as que des pi, ca devrait le faire.