Installation de satellites snips

Configuration de type B

Alors la seule différence avec la configuration de type A, c’est qu’avec la configuration de type B, le hotword est géré par le satellite. Cela permet par exemple d’avoir un mot clé différent pour chaque pièce. Quelle utilité ? Je ne sais pas, mais on ne sait jamais, ça pourrait t’intéresser 😀 .

Sache que même en type B, le flux audio est envoyé en continu sur ton réseau.


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

Comme on vient de le voir dans la configuration de type A, toute la configuration de snips est dans ce fichier

sudo nano /etc/snips.toml

dans le cas de la configuration de type B, 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.

Maintenant, nous allons définir le siteId de notre snips satellite. 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"

Comme expliqué dans la partie configuration de type A, il n y a pas de lien entre le hostname du raspberry et le siteId. Donc mon site s’appelle bureau, même si le hostname est snips-bureau. 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

Vu que dans la configuration de type B, le hotword est aussi géré par le satellite, nous allons modifier la partie « snips-hotword » en conséquence. La voici au départ :

[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 = ["bureau@mqtt"]

Et nous allons aussi supprimer le # devant la ligne model, c’est à dire, remplacer la ligne

# model = "/usr/share/snips/hotword"

par

model = "/usr/share/snips/hotword"

Notre partie « snips-hotword » devrait donc ressembler à peu près à ça :

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

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 va donc 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 »

Maintenant, nous allons faire en sorte que le snips-maitre ne réagisse qu’au mot clé entendu par lui-même. Admettons que le snips-maitre soit dans le salon, voici le fichier 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"]

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

Par rapport à la configuration de type A, tu remarqueras qu’on laisse tourner le service « snips-hotword » sur le satellite.

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 (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 » et « snips-hotword » pour la prise en compte des modifs

sudo systemctl restart snips-audio-server
sudo systemctl restart snips-hotword

Vérification de bon fonctionnement

Pour être sûr que le snips satellite utilise bien le hotword local, nous allons utiliser une petite astuce. Nous allons modifier le hotword de notre assistant et le pousser sur notre satellite. Comme ça, nous avons le hotword unniversel sur notre snips-maitre et on aura « Jarvis » sur le satellite.

On se connecte sur la console de snips et on modifie le hotword :

hotword jarvis
hotword jarvis

Et on exécute sur notre satellite :

sam install assistant

Ce qui nous donne :

pi@snips-bureau:~ $ sam install assistant
Fetching assistants done
Found 1 assistant named coxprod_diy
Downloading assistant
Fetching assistants done
NLU training done
ASR training done
v Deploying assistant to localhost...
Checking for actions
Cloning skill Joseph.Heure from url: https://github.com/JDureau/snips-skill-heure
Déjà à jour.

v Generating virtual environment for snips-skill-heure

Checking actions for end-user parameters
Relaunching snips-skill-server
v Snips assistant is now running. Say jarvis to start!
i Run sam watch to see the logs
pi@snips-bureau:~ $

On peut constater qu’il a bien pris en compte notre mot clé « Jarvis »

Tu peux faire le test. Désormais, si tu dis « Hey ! snips », il n y aura pas de détection. le snips du satellite répondra désormais à Jarvis.

Voici le résultat sur le snips satellite :

[01:05:47] [Hotword] detected on site bureau, for model default
[01:05:47] [Asr] was asked to stop listening on site bureau
[01:05:47] [Hotword] was asked to toggle itself 'off' on site bureau
[...]

Et voici le résultat sur le snips-maitre dans le salon :

[01:05:59] [Hotword] detected on site salon, for model hey_snips
[01:05:59] [Asr] was asked to stop listening on site salon
[01:05:59] [Hotword] was asked to toggle itself 'off' on site salon
[...]

On peut constater que pour le satellite il voit le modèle « default » qui est Jarvis alors que sur le snips du salon, il voit le modèle « hey_snips ».

Ce n’est donc bien pas le même hotword sur les 2 snips.

8 Comments

  1. Bonjour Ced,
    Tout d’abord, super travail que ces tutos pour la mise en place de Snips, je me suis appuyé à 99% sur tes écrits pour mettre en place mon installation (encore en phase de test pour le moment).

    En bref je dispose de :
    1 Serveur Snips master tournant sur une VM Debian 9.8
    1 Serveur Jeedom sur VM Debian 8.7
    1 Satellite Snips tournant sur un Pi Zero WH + Respeaker 2Mic + HP Mono Adafruit 3351

    Ce qui fonctionne :
    Hotword OK
    App snips Timer, Heure, Jeedom (avec config Jeedom) OK
    Réponse sur le satellite OK

    On pourrait croire que tout fonctionne, hors le soucis que j’ai est que, pour mes tests, dans une pièce au calme, sans bruit dominant (musique, ventilateurs, …) j’interpelle le satellite avec mon « Hey Snips », il réagit, mais une fois sur deux il ne va pas récupérer mon instruction.

    Un SAM WATCH n’indique rien de spécial :

    ##
    SAM WATCH qui indique que tout va bien, match sur le hotword, récupération de l’instruction, analyse et envoi des données pour traitement et réponse TTS si nécessaire
    A la fin du traitement remise en état d’attente du hotword
    ##
    [22:43:11] [Hotword] detected on site SAT01, for model hey_snips
    [22:43:11] [Asr] was asked to stop listening on site SAT01
    [22:43:11] [Hotword] was asked to toggle itself ‘off’ on site SAT01
    [22:43:11] [Dialogue] session with id ‘1fb8dab8-92df-4977-a41f-e669dcd60aa6’ was started on site SAT01
    [22:43:11] [AudioServer] was asked to play a wav of 41.1 kB with id ‘4f29f241-8721-40f9-a976-605240304eb0’ on site SAT01
    [22:43:11] [AudioServer] finished playing wav with id ‘4f29f241-8721-40f9-a976-605240304eb0’
    [22:43:11] [Asr] was asked to listen on site SAT01
    [22:43:27] [Dialogue] session with id ‘1fb8dab8-92df-4977-a41f-e669dcd60aa6’ was ended on site SAT01. The session was ended because one of the component didn’t respond in a timely manner
    [22:43:27] [Asr] was asked to stop listening on site SAT01
    [22:43:27] [Hotword] was asked to toggle itself ‘on’ on site SAT01

    Quelques secondes avant, j’ai pu appelé mon Sat, qui a réagit et a allumé mon bandeau LED « Allume le tableau ».
    Je le ré-interpelle pour cette fois lui demander de l’éteindre, le hotword match, mais aucun enregistrement n’est fait sur la commande dictée ensuite « Eteinds le tableau ». Obligé d’attendre 15 secondes de timeout pour retenter. En règle générale, ça me fait ça quasi une fois sur deux.
    Je n’ai aucune idée de la raison de cette non reconnaissance pseudo aléatoire.

    Aurais-tu une idée? Augmenter / améliorer la qualité du micro ? Lorsque je fait un arecord pour tester la qualité du micro, puis un aplay pour écouter le résultat, je trouve qu’il y a beaucoup de bruit parasite (j’ai conscience du prix réduit du respeaker, et par conséquent, des concessions qui ont dut être faites pour la fabrication).

    Merci par avance pour ton aide Ced, ou à quiquonque a déjà rencontré le problème et réussi à le corriger.

    Pesty.

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

  3. 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 😉

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