Installation de satellites snips

Configuration de type A

alors la configuration de type A, c’est simple. Le flux audio est capturé et envoyé en continu au snips-maitre, et c’est lui qui se charge de faire tout le travail. Donc, nous allons simplement configurer notre satellite pour que tous les composants – nécessaires – snips se connectent sur le serveur MQTT de notre snips-maitre. Nous arrêterons ensuite tous les composants inutiles.

Modification du fichier snips.toml du snips satellite (snips-bureau)

Tout snips se configure dans ce fichier. Simple. Ouvrons-le et regardons ce qu’il y a dedans. Sur le snips-bureau :

sudo nano /etc/snips.toml

On peut voir qu’il est divisé en plusieurs parties :

  • snips-common
  • snips-analytics
  • snips-asr
  • snips-audio-server
  • snips-dialogue
  • snips-hotword
  • snips-injection
  • snips-nlu
  • snips-tts

Les seules parties qui vont nous intéresser dans tout cet article sont : snips-common, snips-audio-server et snips-hotword.

dans le cas de la configuration de type A, nous allons modifier dans un premier temps la partie snips-common. La voici au départ :

[snips-common]
# bus = "mqtt"
# mqtt = "localhost:1883"
# audio = ["+@mqtt"]
# assistant = "/usr/share/snips/assistant"
# user_dir = "/var/lib/snips"

Nous allons modifier la ligne

# mqtt = "localhost:1883"

par

mqtt = "snips-maitre:1883"

N’oublie pas d’enlever le # au début.

Voilà, maintenant, notre snips satellite va discuter sur le réseau MQTT de notre snips-maitre.

mais ce n’est pas suffisant. Il faut que le snips-bureau soit reconnu en tant que satellite du site bureau. Pour cela, nous allons aller dans la partie « snips-audio-server ». voici la config avant modification :

[snips-audio-server]
# frame = 256
# bind = "default@mqtt"
# mike = "Built-in Microphone"
# disable_playback = false
# disable_capture = false

et remplacer cette ligne

# bind = "default@mqtt"

par

bind = "bureau@mqtt"

Tu remarqueras que j’ai fait exprès de remplacer « default » par « bureau » et non par « snips-bureau ». C’est pour t’expliquer que « bureau » est le siteId, l’identifiant du site de notre snips satellite. Et ce siteId est indépendant du nom réseau de notre snips. Après, rien ne t’empêche que les 2 noms soient identiques. Mais il n y a pas de corrélation entre les 2.
Un petit CTRL+O pour sauvegarder et un petit CTRL+X pour quitter nano

on ne touche pas au service ni rien pour le moment, on va aller configurer notre snips-maitre et on reviendra sur notre snips-bureau pour finaliser la config.

Modification du snips.toml du snips-maitre

Allons maintenant sur notre snips-maitre et ouvrons notre fichier /etc/snips.toml :

sudo nano /etc/snips.toml

On ne touche à rien dans la partie « snips-common » puisque c’est lui notre chef MQTT. Par contre, on va aller modifier la partie « snips-audio-server » pour identifier le siteId de notre snips-maitre.

Donc voici la configuration avant modif :

[snips-audio-server]
# frame = 256
# bind = "default@mqtt"
# mike = "Built-in Microphone"
# disable_playback = false
# disable_capture = false

Et on va modifier la ligne :

# bind = "default@mqtt"

par

bind = "salon@mqtt"

Évidemment, tu mets le bon nom de la pièce :D. Si c’est un snips sur une VM qui n’a pas de carte son, tu peux mettre « snips-maitre » au lieu de « salon »

Mais ce n’est pas terminé. En effet, il faut aussi que notre snips-maitre puisse réagir au mot clé de notre site bureau en plus de son site à lui. Pour cela, on va aller dans la partie « snips-hotword » et apporter une modification.
Voici la config d’origine :

[snips-hotword]
# model = "/usr/share/snips/hotword"
# hotword_id = "default"
# sensitivity = "0.5"
# audio = ["+@mqtt"]
# no_vad_inhibitor = false
# vad_messages = false

Nous allons remplacer la ligne

# audio = ["+@mqtt"]

par

audio = ["salon@mqtt", "bureau@mqtt"]

Là encore, tu remplaces le mot salon par la bonne pièce. Et toujours si tu as une VM sans carte son, remplace « salon » par « snips-maitre »

Une fois les modifications apportées, on fait un petit CTRL+O pour sauvegarder et un CTRL+X pour quitter.

Si on ne veut pas s’embêter, on redémarre le tout :

sudo init 6

Sinon, on peut aussi essayer de ne redémarrer que les services snips :

sudo systemctl restart snips-*

Si le snips-maitre est sur une VM sans carte son

Bon vient désormais le moment où je dois te parler d’un petit hack pas très beau.

J’avais remarqué qu’après chaque reboot, il fallait que je redémarre le service « snips-skill-server » car celui-ci n’arrivait pas à bosser correctement du premier coup. J’ai rapidement vu que le problème pouvait venir du fait que le service « snips-audio-server » ne démarrait pas sur la VM. Ce qui est logique puisque je n’ai pas de carte son.

j’ai donc tout simplement ajouté un petit délai avant le démarrage du service « snips-skill-server ». pour faire la modif, je t’invite à aller lire cette partie dans l’article de l’installation de snips dans une VM . C’est tout en bas de l’article.

Finition sur le satellite snips-bureau

On retourne maintenant sur notre snips bureau pour arrêter tout ce qui ne va pas nous servir :

sudo systemctl disable snips-analytics
sudo systemctl disable snips-asr
sudo systemctl disable snips-dialogue
sudo systemctl disable snips-hotword
sudo systemctl disable snips-nlu
sudo systemctl disable snips-skill-server
sudo systemctl disable snips-tts
sudo systemctl disable mosquitto
sudo systemctl stop snips-analytics
sudo systemctl stop snips-asr
sudo systemctl stop snips-dialogue
sudo systemctl stop snips-hotword
sudo systemctl stop snips-nlu
sudo systemctl stop snips-skill-server
sudo systemctl stop snips-tts
sudo systemctl stop mosquitto

Ce que l’on vient de faire par ces commandes c’est d’arrêter les services inutiles et les empêcher de redémarrer automatiquement au redémarrage du raspberry

Voici ce que nous donne désormais le « sam status »

pi@snips-bureau:~ $ sam status

Connected to device localhost

OS version ................... Raspbian GNU/Linux 9 (stretch)
Installed assistant .......... coxprod_diy
Language ..................... fr
Hotword ...................... hey_snips
ASR engine ................... snips
Status ....................... Live

Service status:

snips-analytics .............. 0.60.10 (not running)
snips-asr .................... 0.60.10 (not running)
snips-audio-server ........... 0.60.10 (running)
snips-dialogue ............... 0.60.10 (not running)
snips-hotword ................ 0.60.10 (not running)
snips-nlu .................... 0.60.10 (not running)
snips-skill-server ........... 0.60.10 (not running)
snips-tts .................... 0.60.10 (not running)

ensuite on redémarre notre « snips-audio-server » pour la prise en compte des modifs

sudo systemctl restart snips-audio-server

Vérification de bon fonctionnement

Il nous reste plus qu’à vérifier que tout fonctionne. Pour cela, on va faire un « sam watch » et demander l’heure (puisque c’est l’app qu’on a installé dans l’article de l’installation de snips ).

pi@snips-bureau:~ $ sam watch
[18:55:59] Watching on snips-maitre:1883 (MQTT)
[18:56:01] [Hotword] detected on site bureau, for model hey_snips
[18:56:01] [Asr] was asked to stop listening on site bureau
[18:56:02] [Hotword] was asked to toggle itself 'off' on site bureau
[18:56:02] [Dialogue] session with id '59486e55-ad0a-4e46-ad25-369324b5f56b' was started on site bureau
[18:56:02] [AudioServer] was asked to play a wav of 41.1 kB with id '70dda7dc-5945-4f59-9be9-96cf8a90fbb9' on site bureau
[18:56:02] [AudioServer] finished playing wav with id '70dda7dc-5945-4f59-9be9-96cf8a90fbb9'
[18:56:02] [Asr] was asked to listen on site bureau
[18:56:05] [Asr] captured text "quelle heure est il" in 2.0s
[18:56:05] [Asr] was asked to stop listening on site bureau
[18:56:05] [AudioServer] was asked to play a wav of 93.1 kB with id 'f3f72176-8766-4fa7-8c59-cf92fad5b2ab' on site bureau
[18:56:06] [AudioServer] finished playing wav with id 'f3f72176-8766-4fa7-8c59-cf92fad5b2ab'
[18:56:06] [Nlu] was asked to parse input "quelle heure est il"
[18:56:06] [Nlu] detected intent Joseph:askTime with probability 1.000 for input "quelle heure est il"
[18:56:06] [Dialogue] New intent detected Joseph:askTime with probability 1.000
[18:56:06] [Dialogue] was ask to end session with id 59486e55-ad0a-4e46-ad25-369324b5f56b by saying 'Il est 18 heures 56'
[18:56:06] [Tts] was asked to say "Il est 18 heures 56"
[18:56:06] [AudioServer] was asked to play a wav of 71.4 kB with id 'e1949c2c-b379-4ac2-bf47-1f219eb14c67' on site bureau
[18:56:09] [AudioServer] finished playing wav with id 'e1949c2c-b379-4ac2-bf47-1f219eb14c67'
[18:56:09] [Tts] finished speaking with id '29304d73-6fd3-4865-a9d4-3e606d77ef66'
[18:56:09] [Dialogue] session with id '59486e55-ad0a-4e46-ad25-369324b5f56b' was ended on site bureau. The session ended as expected
[18:56:09] [Asr] was asked to stop listening on site bureau
[18:56:09] [Hotword] was asked to toggle itself 'on' on site bureau


On va faire un rapide debriefing de ce que l’on voit :

[18:55:59] Watching on snips-maitre:1883 (MQTT)
[18:56:01] [Hotword] detected on site bureau, for model hey_snips

Nous sommes bien sur le réseau MQTT de notre snips-maitre et le mot clé a bien été identifié sur le site bureau

[18:56:02] [Asr] was asked to listen on site bureau
[18:56:05] [Asr] captured text "quelle heure est il" in 2.0s

La reconnaissance vocale, qui ne tourne que sur notre snips-maitre je le rappelle, a bien compris que je demandais « Quelle heure est il » depuis notre satellite du site bureau.

Si ton second snips est un snips dans une pièce, alors tu peux aller dans cette pièce et faire le test. Voilà ce que ça donne pour moi avec le snips dans le salon :

pi@snips-salon:~ $ sam watch
[21:13:34] Watching on localhost:1883 (MQTT)
[21:15:05] [Hotword] detected on site salon, for model hey_snips
[21:15:05] [Asr] was asked to stop listening on site salon
[21:15:05] [Hotword] was asked to toggle itself 'off' on site salon
[21:15:05] [Dialogue] session with id 'cabe1b5a-5dbb-4970-9dd8-21de774b1444' was started on site salon
[21:15:05] [AudioServer] was asked to play a wav of 41.1 kB with id 'd7a7befe-1263-40cb-a2b1-6fa99a49263e' on site salon
[21:15:06] [AudioServer] finished playing wav with id 'd7a7befe-1263-40cb-a2b1-6fa99a49263e'
[21:15:06] [Asr] was asked to listen on site salon
[21:15:08] [Asr] captured text "quelle heure est il" in 2.0s
[21:15:08] [Asr] was asked to stop listening on site salon
[21:15:08] [AudioServer] was asked to play a wav of 93.1 kB with id '4cb81312-78c1-4444-be45-1121c467fc1d' on site salon
[21:15:10] [AudioServer] finished playing wav with id '4cb81312-78c1-4444-be45-1121c467fc1d'
[21:15:10] [Nlu] was asked to parse input "quelle heure est il"
[21:15:10] [Nlu] detected intent Joseph:askTime with probability 1.000 for input "quelle heure est il"
[21:15:10] [Dialogue] New intent detected Joseph:askTime with probability 1.000
[21:15:10] [Dialogue] was ask to end session with id cabe1b5a-5dbb-4970-9dd8-21de774b1444 by saying 'Il est vingt et une heures 15'
[21:15:10] [Tts] was asked to say "Il est vingt et une heures 15"
[21:15:10] [AudioServer] was asked to play a wav of 60.8 kB with id '679c2b97-a27f-4e3f-a7e3-de04a8b10d9a' on site salon
[21:15:12] [AudioServer] finished playing wav with id '679c2b97-a27f-4e3f-a7e3-de04a8b10d9a'
[21:15:12] [Tts] finished speaking with id '3716a511-ed56-4e03-82ae-b5fa60d98cbb'
[21:15:12] [Dialogue] session with id 'cabe1b5a-5dbb-4970-9dd8-21de774b1444' was ended on site salon. The session ended as expected
[21:15:12] [Asr] was asked to stop listening on site salon

J’ai donc bien 1 snips-maitre dans le salon et 1 snips-satellite dans le bureau et tout fonctionne ! \o/

Tout est ok après reboot

on redémarre notre snips-maitre puis notre snips-bureau. On redemande l’heure et normalement, si tu as bien travaillé, ça marche toujours \o/

6 Comments

  1. Bonjour
    Bonjour
    Comment avez vous resolu l envoi constant du son entre le satellite et le master ?
    Y a t il une config pour envoyer l audio qu une fous le hotword detecte ?
    Lionrl

    • Bonjour,

      Pour le moment, officiellement, il n’y a pas de solution. La solution dont je parle est une bidouille. Elle est composée de 2 snips full avec une configuration particulière de mosquitto qui retransfert certains messages sur le mosquitto du snips maître.
      Si j’ai le temps, je ferai un article là dessus, mais ça reste une bidouille avec comme principale contrainte de ne pas avoir d’actions sur les apps…

      Ced

  2. Salut Ced,
    j’ai décidément pas de bol, j’ai reçu mon pi0w, mais à chaque install il me plante tous les services ….je te bip sur Dscd

    Bien vu le tuto 😉

  3. Bonjour Cedcox,
    Super tuto, très bien détaillé. Je découvre ton site suite au post sur SNIPS pour Jeedom.

    De mon côté j’avais 1 VM OK et un rpi3 OK en mode autonome chacun.
    J’ai suivi ton tuto à la lettre et je ne sais pas pourquoi après le redémarrage j’ai quelques soucis :
    – Le fichier asound est vide à chaque redémarrage
    – Du coup logiquen: server-audio : en Not running
    – Malgré la remise en état après chaque redémarrage : pas de déclenchement après prononciation de Jarvis et donc rien dans sam watch

    J’ai mis à jour le post sur le forum jeedom pour pouvoir mettre des captures d’écrans.

    Merci 😉

Poster un Commentaire

Votre adresse de messagerie ne sera pas publiée.


*


Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.