Rhasspy : le wake word (le mot de réveil) snowboy

Snowboy-CustomMaker

Les prérequis

Normalement, tout devrait être là, mais au cas où

sudo apt-get install python3-numpy python3-pyaudio python3-soundfile python3-requests

Ensuite on récupère la liste des fichiers dont on va avoir besoin

wget https://raw.githubusercontent.com/KiboOst/jeedom_docs/master/other/Rhasspy/SnowboyCustomMaker/snowboyCustomMaker-list.txt

Et on lance le téléchargement de tous les fichiers présent dans le fichier texte téléchargé.

wget -P /home/pi/SnowboyCustomMaker -i snowboyCustomMaker-list.txt

On rentre dans le répertoire :

cd SnowboyCustomMaker/

Il y a 2 fichiers qui vont réellement nous intéresser

  • snowboyRecord.py
  • snowboyTrain.py

J’ai le script python snowboyRecord.py afin de me permettre d’enregistrer 3 fois le wake word en format wav. Ensuite, j’optimise mes 3 fichiers wav si je le souhaite. Puis je génère la création de mon modèle personnalisé grâce à snowboyTrain.py.

Ca à l’air simple comme ça. Mettons en pratique pour voir.

snowboyRecord.py

C’est l’outil qui va nous permettre de créer nos 3 fichiers wav. Il a été transformé à parti du fichier que fournissait snips pour là aussi créer un wake word customisé. Parfaite conversion d’outil !

On va donc lancer la commande

python3 snowboyRecord.py --wakeword hey_snips

Alors, comme je vais essayer de générer un modèle “hey, snips”, j’ai appelé le wake word hey_snips

Et on suit ce qui est demandé

pi@raspberrypi:~/SnowboyCustomMaker $ python3 snowboyRecord.py --wakeword hey_snips
You will record 3 samples for your wakeword. Be sure to be in a quiet environment. Press enter once you are ready

Donc, on nous dit qu’on va enregistrer 3 echantillons de notre wake word et qu’il faut être dans un endroit très silencieux. Pas de bruit de ventilo de pc ou autre. Rien, il faut que ce soit le plus silencieux possible. On appuie sur “enter”.

Là, il nous dit qu’il va enregistrer l’échantillon 0. Une fois qu’on est prêt, on tape sur la touche “enter” et dès que le mot recording s’affiche, tu dis bien au haut et distinctement ton wake word. Le silence devrait arrêter l’enregistrement.

Press enter to record sample 0, say your wakeword when "recording..." shows up
recording...
finished recording

WARNING: there seems to be too much noise in your environment.

Si tu as ce message “WARNING : There seems to be too much noise in your environment“, c’est qu’il y a trop de bruit d’ambiance.

Si tu arrives à faire 3 enregistrements satisfaisants, le script te dit ceci :

Press enter to record sample 2, say your wakeword when "recording..." shows up
recording...
finished recording

Your samples have been saved in /home/pi/SnowboyCustomMaker/hey_snips
pi@raspberrypi:~/SnowboyCustomMaker $ 

Bonne nouvelle, j’ai mes 3 fichiers wav dans /home/pi/SnowboyCustomMaker/hey_snips. Allons voir ça

ls -lsa /home/pi/SnowboyCustomMaker/hey_snips/

voilà le résultat

total 252
 4 drwxr-xr-x 2 pi pi  4096 avril 21 12:48 .
 4 drwxr-xr-x 4 pi pi  4096 avril 21 12:46 ..
40 -rw-r--r-- 1 pi pi 39980 avril 21 12:48 0_uncut.wav
40 -rw-r--r-- 1 pi pi 38956 avril 21 12:48 0.wav
48 -rw-r--r-- 1 pi pi 46124 avril 21 12:48 1_uncut.wav
20 -rw-r--r-- 1 pi pi 16428 avril 21 12:48 1.wav
48 -rw-r--r-- 1 pi pi 47148 avril 21 12:48 2_uncut.wav
48 -rw-r--r-- 1 pi pi 45100 avril 21 12:48 2.wav
pi@raspberrypi:~/SnowboyCustomMaker $ 

Il semblerait que j’ai une version “uncut” et une version standard qui semble être la version “cut”.

Ouvrons ça dans audacity

Alors, j’ai superposé le fichier 0.wav et 0_uncut.wav. Comme ça, pas simple de distinguer la version cut de la version uncut. Et le wake word aurait pu être un peu amplifié.

Ok, maintenant qu’on a vu ce que générait l’outil SnowboyRecord.py, voyons une seconde solution. Le tout fait main 🙂

Enregistrement avec arecord

L’autre solution est de faire 3 enregistrements avec arecord et de les optimiser avec audacity.

Supprimons tous les fichiers wav précédemment créés.

rm -fr /home/pi/SnowboyCustomMaker/hey_snips/*.wav
cd /home/pi/SnowboyCustomMaker/hey_snips/

Là encore, KiboOst nous fournit la ligne de commande arecord toute prête :

arecord -D 'sysdefault:CARD=seeed2micvoicec' -r 16000 -f S16_LE -c 1 -t wav > 0.wav

Dès que tu as appuyé sur “enter” tu dis bien haut et bien distinctement ton wake word, et aussitôt tu appuies sur CTRL+C pour arrêter l’enregistrement.

Voici ce que donne mon fichier wav dans audacity.

Je vais déjà dans un premier temps faire un petit coup de réduction de bruit (noise reduction) . Pour avoir plus d’info sur ce que fait généralement un filtre de réduction de bruit, tu auras quelques réponses ici.

On fait CTRL+A pour sélectionner toute la piste. Ensuite, on va dans “Effect” puis “Noise reduction”

Alors, si vraiment cela t’intéresse, je t’invite à te renseigner ce que fait chaque réglage.

En attendant, on va garder les réglages qu’il nous propose par défaut et cliquer sur “OK”

Voici le résultat pour moi

Il me reste plus qu’à couper les blancs et on obtient ceci :

Pour sauvegarder, on va dans “File” puis “Export” puis “Export as WAV”

On laisse 0.WAV et on clique sur “Save”

Alors évidemment, il va nous dire que le fichier existe, donc pas de souci pour l’écraser

Il nous propose ensuite la possibilité d’ajouter des méta-data. Si ça ne t’intéresse pas, cliques directement sur “OK”

Voilà, on répète tout ça 3 fois pour avoir 3 fichiers WAV et on va pouvoir passer à la génération de notre modèle wake word.

SnowboyTrain.py

Je retourne dans mon dossier SnowboyCutsomMaster

cd /home/pi/SnowboyCutsomMaster

Je revérifie vite fait que j’ai bien mes 3 fichiers WAV

pi@raspberrypi:~/SnowboyCustomMaker $ ls -lsa /home/pi/SnowboyCustomMaker/hey_snips/
total 80
 4 drwxr-xr-x 2 pi pi  4096 avril 21 15:43 .
 4 drwxr-xr-x 4 pi pi  4096 avril 21 12:46 ..
24 -rw-r--r-- 1 pi pi 24162 avril 21 15:05 0.wav
24 -rw-r--r-- 1 pi pi 24064 avril 21 15:38 1.wav
24 -rw-r--r-- 1 pi pi 21612 avril 21 15:39 2.wav
pi@raspberrypi:~/SnowboyCustomMaker $ 

Alors pour exécuter la prochaine ligne de commande, il nous faut une clé API snowboy. En fait, cette clé nous permet d’utiliser la technologie snowboy depuis leurs serveurs. Grâce à cette clé, on va leur envoyer nos 3 fichiers audio, et eux en échange, vont nous générer notre modèle et le proposer en téléchargement.

Pour récupérer cette clé, il te faut retourner sur le site kitt-AI et aller en haut à droite dans ton profil

Et dans profile settings tu as :

Si tu n’as pas encore de “API token”, alors clique sur la double flèche bleue. N’oublie pas de mettre “French” dans la partie “Languages”. On copie-colle la clé dans un endroit très précautionneusement. Et on clique sur “Save changes”

ok, il nous reste plus qu’à exécuter cette ligne de commande :

python3 snowboyTrain.py --token <ma_cle_api!!!> --lang fr --gender M --age 30 --wakeword hey_snips

On remplace évidemment <ma_cle_api!!!> par la clé que tu as récupérée sur le site de snowboy.

Et voici le résultat que j’obtiens

Building model hey_snips with options fr | M | 30
Saved model to 'hey_snips/hey_snips.pmdl'.

Parfait, mon modèle est créé. Je n’ai plus qu’à le tester. J’espère que tu manipules aussi de ton côté hein 🙂

On copie notre modèle dans le répertoire à modèle :

cp hey_snips/hey_snips.pmdl /home/pi/.config/rhasspy/profiles/fr/snowboy/

Ensuite, je vais aller configurer mon snowboy pour qu’il détecte à la fois jarvis et à la fois “hey, snips” comme wake word.

Alors là, attention, il va falloir de la rigueur. On va aller éditer directement le profile.json pour aller configurer le multi wake word. Mais avant, on arrête rhasspy !

nano /home/pi/.config/rhasspy/profiles/fr/profile.json

Si tu as suivi le TP à l’identique, alors tu supprimes toute la partie “wake” et tu la remplaces par ceci :

    "wake": {
        "satellite_site_ids": "bureau",
        "snowboy": {
            "model": "snowboy/hey_snips.pmdl,snowboy/jarvis.pmdl",
            "model_settings": {
                "snowboy/hey_snips.pmdl": {
                    "sensitivity": "0.5",
                    "audio_gain": 1,
                    "apply_frontend": false
                },
                "snowboy/jarvis.pmdl": {
                    "sensitivity": "0.4",
                    "audio_gain": 1,
                    "apply_frontend": false
                }
            }
        },
        "system": "snowboy"
    }

Si tu n’as pas les mêmes noms de wake word, alors il te faudra modifier le contenu avant de la coller dans le fichier de profil.

Attention !!! S’il y a, ne serait ce qu’une erreur même de syntaxe, et rhasspy ne démarera plus. Donc, fais bien attention à ce que tu fais. Dans le doute, fais une copie.

cp /home/pi/.config/rhasspy/profiles/fr/profile.json /home/pi/.config/rhasspy/profiles/fr/profile.json.save

Test du wake word customisé

Une fois les modifications faites, tu peux redémarrer rhasspy et tester tes nouveaux wake words. Si tu regardes dans les logs de rhasspy, tu devrais voir l’équivalent des lignes ci dessous. C’est à dire le moment où il a détecté ton premier wake word, et l’autre moment où il a détecté ton second wake word.

[DEBUG:2020-04-21 16:26:30,034] rhasspywake_snowboy_hermes: Wake word detected: hey_snips (site_id=bureau)
[DEBUG:2020-04-21 16:27:53,311] rhasspywake_snowboy_hermes: Wake word detected: jarvis (site_id=bureau)

A partir de là, toutes les portes te sont ouvertes 🙂

19 Comments

    • Bonjour,
      Sur la 2.5.10 de Rhasspy il y a Raven, qui permet de proposer un mot clef simplement avec trois enregistrements (tu cliques directement dans Rhasspy, rien besoin de faire d’autre). Ca fonctionne très bien autant que j’ai pu le tester depuis… 24h. Donc à voir aussi si certains ont plus d’expérience.

    • Bonjour Didier et Damien,

      Effectivement, vous mettez le doigts sur ce que je trouve être le point faible de Rhasspy vs Feu Snips. Le mot clé. Le rhasspy dans le salon se trouve dans le meuble télé, sous la télé. Avec le mot clé de snips, ça marche à tous les coups et peu de faux positifs. Et surtout, il est suffisamment universel pour que madame le déclenche aussi proprement.

      Avec Rhasspy, je n’ai toujours pas réussi à avoir le mot clé qui fonctionne correctement là où il est placé. Il faut que je coupe le son de la télé, que je dise ce que j’ai à dire et que je remette la télé…

      J’ai aussi essayé Raven qui est effectivement un peu mieux mais qui n’est pas universel, donc il faut enregistrer le mot clé pour chaque personne et attention à l’intonation donnée…

      Bref, pour le moment, c’est le dernier point qui me chagrine pour être 100% rhasspy

      Ced

  1. Bonjour Ced et Hervé,

    Merci infiniment pour vos réponses aussi rapides.
    J’ai finalement refait une install sous Python en suivant ton excellent tuto Ced, parce que j’avais des soucis avec mon respeaker dans un environement Docker.
    En utilisant le logiciel WinSCP il m’a été plus facile de dérouler l’arborescence des dossiers de mon Raspberry pour trouver lequel contenait les models de Wake-word Snowboy: /home/pi/rhasspy-wake-snowboy-hermes/rhasspywake_snowboy_hermes/models/
    où j’ai pu envoyer mon fichier.pmdl créé sur le site Snowboy.

    Par ailleurs, j’ai également ajouté 3 fichiers.wav pour customiser les “beep” du Wake Wav, du Recorder Wav et du Error Wav. Ils sont dans le dossier: /home/pi/rhasspy/etc/wav/
    J’ai créé ses 3 fichiers.wav avec un générateur de voix off gratuit en ligne: https://www.voicebooking.com/fr/generateur-voix-off-gratuit
    Il propose de choisir la langue et aussi au choix, 3 voix masculines et 3 voix féminines.

    J’ai hâte de lire les prochains articles concernant Rhasspy et notamment, si c’est dans tes tuyaux Ced, quelque chose dédié au Dialogue Management Hermes MQTT.

    Michel

  2. Se mettre en sudo exp:

    sudo cp /home/home/pi/snips.pmdl /home/pi/.config/rhasspy/profiles/fr/snowboy/snips.pmdl

    snips.pmdl ton wakeword
    cp : copie
    mv : déplace

    Hervé

    • Merci Hervé pour ta réponse super rapide,

      j’ai posté une réponse globale sur cette page, en expliquant quelques modifs supplémentaires.

      Au plaisir,

      Michel

  3. Bonsoir Cédric,
    J’ai suivi vos tuto sur le Rhasspy et jusqu’au wake word tout fonctionne. Mon wake word à l’air d’être reconnu mais plus rien après, pas de son ni retour.Le wake up est ok le play ok le speak ok.
    Je n’ai qu’un wake word et pas deux comme ton exemple.
    J’ai comme code erreur :

    [DEBUG:2020-10-21 18:45:18,602] rhasspywake_snowboy_hermes: Wake word detected: jarvis (site_id=FreePiJDom_Rhasspy)
    [DEBUG:2020-10-21 18:45:18,607] rhasspywake_snowboy_hermes: -> HotwordDetected(model_id=’jarvis’, model_version=”, model_type=’personal’, current_sensitivity=0.4, site_id=’FreePiJDom_Rhasspy’, session_id=None, send_audio_captured=None, lang=None)
    [DEBUG:2020-10-21 18:45:18,608] rhasspywake_snowboy_hermes: Publishing 185 bytes(s) to hermes/hotword/jarvis/detected
    [DEBUG:2020-10-21 18:45:18,619] rhasspyserver_hermes: <- HotwordDetected(model_id='jarvis', model_version='', model_type='personal', current_sensitivity=0.4, site_id='FreePiJDom_Rhasspy', session_id=None, send_audio_captured=None, lang=None)

    Mon profiles :
    "wake": {
    "satellite_site_ids": "bureau",
    "snowboy": {
    "model": "snowboy/jarvis.pmdl",
    "model_settings": {
    "snowboy/jarvis.pmdl": {
    "apply_frontend": false,
    "audio_gain": 1,
    "sensitivity": "0.4"
    }
    }
    },
    "system": "snowboy"
    }

    Merci pour ton aide.
    Un site clair et bien pratique.

    • Bonjour Hervé,

      Effectivement, ton wake word “Jarvis” est bien détecté. Au vu des 2 sitesId “FreePiJDom_Rhasspy” et “Bureau”, je suppose donc que tu es en mode maitre/satellite. Néanmoins c’est bizarre car le profile que tu me montres parles du siteId “Bureau” et dans les logs, le siteId est “FreePiJDom_Rhasspy”.

      Du coup, je pense à un soucis de config au niveau des siteIds et/ou de la configuration du mode communication (MQTT/Rhasspy). Essaye de mettre en siteId “bureau” sur ton maitre en plus du siteId FreePijDom.

      Je suis en plein travaux en ce moment, mais dès que je peux, je ferai un tuto avec un mode full Rhasspy maitre/satellite.

      Désolé de ne pouvoir aider plus pour le moment.

      Ced

    • Bonjour,
      Je répond à mon problème :
      Le premier soucis venais d’un bug de la version 2.5.7 corrigé depuis
      Le deuxième une mauvaise configuration de mes settings. Etant sur sur mon Master mon Dialogue Management étais sur HERMES MQTT au lieu de Rhasspy.

      Maintenant Tout fonctionne.

    • Bonjour Daniel,

      Est ce que dans les logs de Rhasspy, tu vois que le wakeword est détecté ?
      Vu que tu utilises le plugin jeedom, peut-être que Kiboost sur le forum jeedom pourrait te donner un petit coup de main, c’est quelqu’un de très sympa. Là, je suis en plein travaux du coup, je ne peux pas faire de test pour vérifier l’article.
      La première chose c’est de voir ce qu’il y a dans les logs de Rhasspy. Tous les tests audio (lecture et enregistrement) sont ils OK ?
      Désolé de ne pouvoir t’aider plus actuellement.

      Ced

  4. Je complète ma réponse :
    J’ai bien suivi le tuto qui m’a permis de télécharger les modèles pmdl que j’ai transféré dans le rpi en cli par sftp.

    Mon ‘profile.json’ de la base rhasspy (Master) en ip 192.168.0.30 :

    :{
    "dialogue": {
    "system": "hermes"
    },
    "handle": {
    "remote": {
    "url": "http://192.168.0.30:1880/gestionIntent"
    },
    "system": "remote"
    },
    "intent": {
    "system": "fsticuffs"
    },
    "microphone": {
    "arecord": {
    "device": "sysdefault:CARD=seeed2micvoicec"
    },
    "system": "arecord"
    },
    "mqtt": {
    "site_id": "Master"
    },
    "sounds": {
    "aplay": {
    "device": "default:CARD=seeed2micvoicec"
    },
    "system": "aplay"
    },
    "speech_to_text": {
    "system": "picotts"
    },
    "wake": {
    "satellite_site_ids": "Master",
    "snowboy": {
    "model": "bonjour.pmdl",
    "sensitivity": "0.5"
    },
    "system": "snowboy"
    },
    "webhooks": {
    "awake": [
    "http://192.168.0.41/core/api/jeeApi.php?plugin=jeerhasspy&apikey=zzyfrmkyebbltkap9p6v1pjnwg9iacs8&plugin=jeerhasspy&typ$
    ]
    }
    }

    Remarque à propos du “webhooks” dans “awake”, l’ip 192.168.0.41 est un autre rpi qui ne contient pas de rhasspy. Est-ce correct ?
    Voyez-vous autre chose qui pourrait empêcher la reconnaissance vocal du mot de réveil ?

  5. Bonjour,
    Impossible de réveiller vocalement l’assistant avec un modèle snowboy ou autre.
    J’ai téléchargé 3 fichiers : “bonjour.pmdl, jarvis.pmdl, Gladys.pmdl” et aucun ne fonctionne même en jouant avec la sensibilité. Ces fichiers sont bien présents dans /home/pi/.config/rhasspy/profiles/fr/snowboy/ et quand je modifie une valeur de sensibilité sur un fichier depuis l’interface web rhasspy je vois bien la modification dans le fichier ‘profile.json’.

    J’ai 4 commandes de test (node-red) ‘Allumer/Fermer’ la lumière (salon) et ‘OuvrirFermer’ volet buanderie. Cela fonctionne uniquement en activant le bouton ‘point d’exclamation’ du service réveil rhasspy.
    Je n’ai pas de satellite pour l’instant.
    Matéreil : rpi 3b+, debian buster, pas de snips, Jeedom pour la domo.

    Pouvez-vous m’aider ?

    • Bonjour,

      Alors comme ça, difficile de deviner ce qui ne marche pas 🙂 . Avez vous suivi à la lettre le tuto ? Car celui-ci marche normalement. Que disent les logs de Rhasspy ?

      Cédric

    • Merci pour votre réponse.

      Voici le résultat dans le log rhasspy :

      [DEBUG:2020-10-18 19:04:48,945] rhasspyserver_hermes: <- HotwordDetected(model_id='bonjour', model_version='', model_type='personal', current_sensitivity=0.5, site_id='Master', session_id=None, send_audio_captured=None, lang=None)

      Actuellement j'essaie le réveil avec 'bonjour'. Je constate que cette ligne se répète indéfiniment dans la fenêtre du log. Est-ce normal ?

  6. Bonjour,
    ma config Pi4 raspbian buster
    rhasspy tourne sous docker , j’ai ce fichier .pmdl creer sur snowboy, par contre permission denied lorsque je le transfère dans le fichier /home/pi/.config/rhasspy/profile fr/snowboy.
    la commande “sudo cp” fait pareil.
    Si quelqu’un a une solution ?
    Merci d’avance

    • Bonjour Willow46,
      Avez-vous trouvé la solution pour copier le fichier .pmdl créé avec snowboy dans Rhasspy ? J’ai le même problème que vous, Rhasspy tourne sous Docker chez moi également.
      Merci de votre aide

    • Bonjour Michel,

      Hervé t’a correctement répondu 😉 . Ton profil Rhasspy n’est pas dans ton conteneur Docker mais dans ton home : /home/pi/.config/rhasspy/profiles/fr/.
      Il te faut donc aller dans ce répertoire de ton raspberry et y créer un dossier snowboy. Tu pourras ensuite lui mettre tes hotwords 🙂

      NB par contre, Rhasspy tournant en root dans le Docker, il te faut faire un sudo à chaque commande (création répertoire + copie hotword). au cas où, tu peux faire ensuite un chown root sur le fichier.

      Ced

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.