Projet: reaspeaker core v2 + rhasspy

Hello à tous,

Je début avec les assistants vocaux et je suis tombé sur les projets Rhasspy et le plugin JeeThasspy.

Mon objectif est assez simple: créer un système me permettant de piloter Jeedom à la voix depuis n’importe quelle pièce chez moi.

Actuellement j’utilise principalement mon portable et l’app Vocaldom pour faire le lien avec les interactions Jeedom.
J’ai appris au fur et à mesure et ça m’a permit de me faire la main avec le moteur d’interaction et le déclenchement de scénariis.

Maintenant j’aimerai aller plus loin pour me rapprocher de mon objectif.

Ce que j’ai cru comprendre jusque là:

  • Rhasspy est une alternative Open Source aux assistants vocaux propriétaires tels que Echo, Google home, etc… Il est capable de comprendre ce que je lui dit et transmets les ordres qu’il interprète
  • JeeRhaspy est un plugin Jeedom qui permet de recevoir les commandes envoyées par Rhasspy et fait le lien vers Jeedom (scénarios, interractions, etc…)
  • Respeaker core v2 est une plateforme Open Source sur laquelle on peut installer une Debian et qui est capable de capter les sons avec des fonctionnalités avancées de gestion du son (suppression du bruit, direction du con, etc…)
  • On peut installer des satellites dans différentes pièces, qui vont relayer ce qu’ils entendent au serveur maître

Donc en gros, j’ai pensé que je pourrais acheter un respeaker core 2 pour capter ma voix, transmettre mes ordres à Rhasspy, qui transmets le tout à Jeerhaspy afin que ça permette de piloter Jeedom.
Est-ce que j’ai bon ?

J’en suis là:

  • Jeedom installé avec des équipements, scénarios, etc… sur un serveur en amd64 sous Debian
  • Rhasspy installé en docker sur ce même serveur en version 2.5.0-pre
  • JeeRhaspy installé, configuré pour discuter avec Rhasspy (configuration OK, tests TTS ok, installation automatique du profile Rhasspy OK)
  • Respeaker core v2 flashé sur la EMMC. Configuration réseau OK. Accesible en SSH

Mes questions:

  • Comment faire en sorte que ce que « capte » le respeaker soit envoyé à Rhasspy ? (je trouve beaucoup d’infos sur l’intégration avec Alexa, etc…, mais pas pour le respeaker. Je fais fausse route ?)
  • Comment simuler l’interprétation d’une commande depuis Rhasspy pour qu’il envoie l’ordre à JeeRhasspy et que ça déclenche un cénario Jeedom ? (avant de connecter le Respeaker à Rhasspy j’aimerai déjà être capable de vérrifier que Rhasspy et Jeedom communiquent et que l’interprétation des ordres fonctionne)

Je sais que je mélange plusieurs techno et que ce n’est pas forcément le domaine de responsabilité de l’auteur d’un plugin de fournir du support sur toutes les technos qui peuvent s’interfacer avec.
Mais si quelqu’un a réalisé une implémentation similaire, je suis preneur du retour d’expérience.

Sinon un simple tuto qui répond à certaines de mes questions serait très bien aussi. J’ai pu passer à coté :wink:

Enfin: j’éspère que ce post pourra être utile pour d’autres.

Merci d’avance pour votre aide.

le respeaker se branche sur le Raspberry pi (c’est le micro). c’est correct, il remplace les solutions comme Alexa…L’Interaction se fera via le plugin sur jeedom

1 « J'aime »

J’ai la même configuration que toi.

Ce qu’il faut retenir, c’est que rhasspy doit être installé sur le respeaker core (en docker ou venv). C’est Rhasspy qui va directement accéder au micro et à la sortie son (voir le menu de configuration). Ton install rhasspy sur le serveur jeedom ne fonctionnera pas du coup.
Pour ta seconde question, lorsque tu configure jeeRhasspy, tu vas indiquer l’IP de ton Rhasspy (ton respeaker core). Clic ensuite sur l’icône dans jeerhasspy pour faire la config automatique, ca indiquera au Rhasspy que le traitement des intents doit être envoyé au plugin sur Jeedom.
Il faut ensuite lire la doc Rhasspy pour configurer les intents, les slots, les sentences, etc…

Une dernière chose, cette config permet l’ajout d’un unique assistant. Si tu prévois d’en faire plusieurs, dans ce cas il faut faire une install master/slave où plusieurs assistants slave se connecterons au rhasspy master. Il y a une section dans la doc là dessus. Pour ma part, c’est ma config (et dans ce cas tu pourrais avoir rhasspy master sur ton serveur jeedom + rhasspy slave sur ton respeaker core)

1 « J'aime »

Salut,

Merci beaucoup pour vos retours :slight_smile:

Je comprends mieux maintenant.

Je vais donc laisser mon Rhasspy master sur le même serveur que Jeedom et installer Rhasspy sur le respeaker core pour en faire un slave.

J’imagine qu’ensuite il faut déclarer dans le plugin JeeRhasspy:

  • Le Rhasspy master (installé sur le même serveur que Jeedom)
  • Les Rhasspy slaves (installé sur mon respeaker core) e tant que satellites

Pour ajouter d’autres slaves et couvrir plus de pièces, j’imagine que je dois:

  • Acheter des Raspberry
  • Y ajouter des modules type ReSpeaker 2* - *Mics Pi HAT
  • Les déclarrer en tant que slaves dans JeeRhasspy

J’ai bon ?

2 petites questions SVP:

  • Quand on parle d’assistants supplémentaires, on parle en fait de slaves/satellites n’est-ce pas ?
  • Pour déclarer un slave et le connecte au master, est-ce que l’ajout en tant que satellite est suffisant ou bien une configuration additionnelle est-elle à fair ecoté master et/ou slave ? (pour les synchroniser en quelque sorte)

Merci encore pour vos retours et votre aide.

Bon Lundi à tous !

Petit update du journal de bord de mes aventures:

La déclaration de mon master (Rhasspy en docker sur le seveur Jeedom) et du slave (Rhasspy en docker sur le respeaker) sont faits.

  • Les deux types de devices sont bien visibles dans JeeRhasspy, respecitivement en tant que « Master » et « Satellite »
  • Importation des assistants depuis JeeRhasspy → OK
  • Configuration automatique du profil depuis JeeRhasspy → OK

Là j’ai un problème: depuis JeeRhasspy je ne vois aucune intention remonter dans le plugin. La liste est vide.
Pourtant dans les deux instances de Rhasspy j’ai bien des intents de tests qui sont visibles:

Exemple:

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

Comment faire pour que mes intents remontent dans JeeRhasspy ?

Autre problème:

Lorsque j’utilise la fonction « Recognize » de Rhasspy et que je tape « heure » Rhasspy reconnait l’intent concerné et indique bien « GetTime »

J’imagine qu’il est censé envoyer l’ordre à JeeRhasspy avec le profil « Intent handling = remote » configuré automatique par le plugin sur les instances Rhasspy ?

La config est ainsi sur les deux Rhasspy:

http://IP_DE_MON_JEEDOM/core/api/jeeApi.php?plugin=jeerhasspy&apikey=CLEF_API&plugin=jeerhasspy&type=jeerhasspy

Pourtant ça ne donne rien.
Dans le slogs JeeRhasspy (passés en info) je ne vois rien lorsque je simule l’intent coté Rhasspy (en cochant la case « Handle »)

J’ai esayé de créer un scénario GetTime dans Jeedom dans le groupe « Rhasspy-Intents » et il ne démarre pas lorsque je simle l’intent coté Rhasspy. (le scénario est bien activé et si le l’execute manuellement depuis Jeedom, on voit des logs aparaitre dans le scénario)

3ème problème:

Lorsque depuis JeeRhasspy j’essaie de faire un « Test TTS » sur mes instances Rhasspy:

  • Sur le master ça marche. (je n’entends rien parce que c’est celui qui est sur le serveur Jeedom sans sortie son configuré. Test TTS est censé faire prononcer quelque chose sur le Rhasspy cible si il a une sortie son n’est-ce pas ?)
  • Sur le satellite la commande est envoyée mais j’ai un retour de JeeRhasspy de ce type:

[2020-06-01 15:51:20][ERROR] : [RhasspyUtils] jeeRhasspy:textToSpeech error → 0

Désolé pour toutes ces questions, mais je suis décidé à le faire marcher ce truc ! :smiley: (et je suis plus têtu que lui ^^)
Quelqu’un a-t-il une idée ?

Merci d’avance :slight_smile:

Petit update pour faire un état des lieux et donner plus d’éléments:

3ème problème:

J’ai toujours la même erreur depuis JeeRhasspy lorsque je fais un « test TTS »

[2020-06-01 15:51:20][ERROR] : [RhasspyUtils] jeeRhasspy:textToSpeech error → 0

Entre temps j’ai installé et configuré Mary TTS sur mon serveur Jeedom (pour ne pas surcharger mon Respeaker core avec le traitement TTS)

Cela fonctionne et quand j’écris une phrase coté Rhasspy, il l’envoi pour traitement à Mary TTS, puis le résultat est lu sur mon respeaker.

Malheureusement, contrairement à ce que je pensais cela ne résoud par le problème 3.

Si quelqu’un a le temps à l’occasion de me filer un coup de main sur ces 3 problèmes que je rencontre, ça sera pas de refus :wink:

Bonsoir à tous,

Après une bataille acharnée avec JeeRhasspy, le respeaker et le moissonage litéral de divers forum; j’ai fini par arriver à quelque chose de pas mal :slight_smile:

Problèmes 1 & 2: – reglé

Tout venait des intentions qui ne remontaient pas dans JeeRhasspy parce que je sais pas lire ^^

Il suffisait de décocher la case « Filtrer les Intents Jeedom » du menu de configuration de JeeRhasspy pour que tous les intents de Rhasspy remontent et soient exploitables.

On n’est pas forcé de décocher la case en realité (là encore j’au lu trop en diagonale) car comme le dit très bien l’auteur du plugin:

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

Maintenant si je fais reconnaitre un mot clef qui déclenche un intent depuis Rhasspy (bouton Recognize), celui-ci va déclencher l’exécution du scénario configuré dans JeeRhasspy et celui-ci sera donc executé !

Il me reste le problème 3 à régler:
J’ai toujours l’erreur suivante lorsque je fais un « Test TTS » sur le Rhasspy satellite (le respeaker):

[2020-06-01 15:51:20][ERROR] : [RhasspyUtils] jeeRhasspy:textToSpeech error → 0

Là je sèche :confused:

J’ai également deux autres soucis:

  • Problème 4: Les logs Rhasspy sur le respeaker sont blindés de messages de ce type depuis que j’ai tenté de configurer le « wake word » avec Porcupine:
2020-06-01 20:50:59,690 INFO success: wake_word entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2020-06-01 20:51:00,021 INFO exited: wake_word (exit status 1; not expected)
2020-06-01 20:51:01,040 INFO spawned: 'wake_word' with pid 30370
2020-06-01 20:51:02,048 INFO success: wake_word entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2020-06-01 20:51:02,404 INFO exited: wake_word (exit status 1; not expected)

Je pense que c’est le process qui reste en écoute du wake word qui essaie de démarrer et n’y arrive pas.
Cela explique certainement pourquoi la reconnaissance du wake word ne marche pas pour l’instant sur mon installation.

J’ai essayé de configurer le wake word ainsi sur Rhasspy:

  • wake word → Porcupine
  • key word file → americano_raspberry-pi.ppn
  • UDP audio input → IP_RESPEAKER:PORT_LIBRE:ID_DU_SITE_DU_RESPEAKER
  • Available Keywords: → je me prends un timeout quand j’essaie de faire un refresh. Je ne peux rien selectionner :confused:

Après le timeout suite au refresh, je vois ça dans le slogs Rhasspy:

[ERROR:2020-06-01 21:15:02,165] rhasspyserver_hermes: 
Traceback (most recent call last):
  File "/usr/lib/rhasspy/lib/python3.7/site-packages/quart/app.py", line 1821, in full_dispatch_request
    result = await self.dispatch_request(request_context)
  File "/usr/lib/rhasspy/lib/python3.7/site-packages/quart/app.py", line 1869, in dispatch_request
    return await handler(**request_.view_args)
  File "/usr/lib/rhasspy/lib/python3.7/site-packages/rhasspyserver_hermes/__main__.py", line 728, in api_wake_words
    hotwords = await core.get_hotwords()
  File "/usr/lib/rhasspy/lib/python3.7/site-packages/rhasspyserver_hermes/__init__.py", line 814, in get_hotwords
    handle_finished(), messages, message_types
  File "/usr/lib/rhasspy/lib/python3.7/site-packages/rhasspyserver_hermes/__init__.py", line 898, in publish_wait
    result_awaitable, timeout=timeout_seconds
  File "/usr/lib/python3.7/asyncio/tasks.py", line 449, in wait_for
    raise futures.TimeoutError()
concurrent.futures._base.TimeoutError
[DEBUG:2020-06-01 21:14:32,160] rhasspyserver_hermes: Publishing 71 bytes(s) to rhasspy/hotword/getHotwords
[DEBUG:2020-06-01 21:14:32,158] rhasspyserver_hermes: -> GetHotwords(site_id='séjour', id='f3ea0c29-4909-4391-b32f-c575bee457e7')
[DEBUG:2020-06-01 21:14:32,153] rhasspyserver_hermes: Subscribed to rhasspy/hotword/hotwords
  • Profile Rhasspy (extrait de la section « wake » du profile.json ci-dessous):
    "wake": {
        "porcupine": {
            "keyword_path": "americano_raspberry-pi.ppn",
            "udp_audio": "IP_RESPEAKER:PORT_LIBRE:ID_DU_SITE_DU_RESPEAKER"
        },
        "satellite_site_ids": "ID_DU_SITE_DU_RESPEAKER",
        "system": "porcupine"
    },

J’essaie de dire « americano » (je suppose que c’est ça le wake word ?) Et Rhasspy ne réagit pas.

Une idée là-dessus quelqu’un ?

- Problème 5:

Lorsque je fais lire un texte à Rhasspy (bouton Speak), celui-ci le lit bien mais systématiquement 2 fois.

J’ai l’impression que c’est depuis que j’ai installé un broker MQTT externe en docker sur mon serveur Jeedom et que j’ai configuré mes Rhasspy pour pointer dessus.

Pourquoi un MQTT externe ?

  • Je me suis dit que ça déchargerait un peu le respeaker (limité en ressources)
  • J’ai rencontré ce problème:
[ERROR:2020-06-01 20:57:10,988] rhasspyserver_hermes: mqtt connect
Traceback (most recent call last):
  File "/usr/lib/rhasspy/lib/python3.7/site-packages/rhasspyserver_hermes/__init__.py", line 223, in start
    self.client.connect(self.host, self.port)
  File "/usr/lib/rhasspy/lib/python3.7/site-packages/paho/mqtt/client.py", line 937, in connect
    return self.reconnect()
  File "/usr/lib/rhasspy/lib/python3.7/site-packages/paho/mqtt/client.py", line 1071, in reconnect
    sock = self._create_socket_connection()
  File "/usr/lib/rhasspy/lib/python3.7/site-packages/paho/mqtt/client.py", line 3522, in _create_socket_connection
    return socket.create_connection(addr, source_address=source, timeout=self._keepalive)
  File "/usr/lib/python3.7/socket.py", line 727, in create_connection
    raise err
  File "/usr/lib/python3.7/socket.py", line 716, in create_connection
    sock.connect(sa)
**OSError: [Errno 99] Cannot assign requested address**

J’ai l’impression que le broker MQTT embarqué dans Rhasspy ne réussit pas à démarrer.
On dirait que le port sur lequel il essaie d’écouter (1183) ne lui est pas accessible.

J’avoue ne pas avoir cherché à comprendre pourquoi car la solution d’un MQTT déporté sur le serveur Jeedom (plus puissant) me paraissait ne pas être une si mauvaise solution.

Quelqu’un a-t-il un avis ? Bonne/mauvaise idée ?

Merci d’avance pour vos lumières.

Probléme 4 : as tu essayé avec un autre wakeword, pour ma part snowboy fonctionne plutôt bien

Hello
Pour le problème 4: j’ai essayé avec snowboy et ça fonctionne en 2.5-pre, mais la même config ne fonctionne plus avec la 2.5 malheureusement

Quelqu’un a-t-il la possibilité de me partager sa config 2.5 en mode satellite avec un wakeword snowboy ?

Typiquement : j’ai beaucoup de mal à comprendre le fonctionnement des ids de sites dans la config ainsi que la config « udp audio output »
Si quelqu’un a lire temps de démystifier je suis preneur ^^

Merci d’avance

Un message a été scindé en un nouveau sujet : Comment configurer un satellite respeaker vers rhasspy