Couac.tv

Smart home, épisode 3, entrainer un "Wake-word" avec Mycroft-precise

Posted on in Iot by Tom Darboux .

Chez moi, j'ai installé Rhasspy, un assistant vocal opensource et modulaire.
L'un de ces modules est le "wake-word" ou mot-clé, ce mot que l'on prononce pour réveiller l'assistant avant de dire une commande;

"dis siri"

"ok google"

"hey mycroft"

Dans cet article de blog je vais résumer comment j'ai entraîné mon mot-clé personnalisé "maitre_yoda". Ce n'est qu'un article de blog qui n'a peu de valeur scientifique. Mon mot-clé fonctionne mais il est très imparfait.

"Maitre Yoda ... allume la lampe du salon"

Il y a plusieurs étapes:

  • Préparer les données
    I - Récupérer tout un tas de sons bruyants, de sons d'ambiances susceptible d'être entendu par l'assistant
    II - Enregistrer ce fameux mot-clé
    III - Nettoyer les enregistrement
    IV - Convertir, formater, et découper nos sons d'ambiances
    V - Fusionner les sons d'ambiance avec nos enregistrements
  • Entraîner le modèle
    VI - Installer Mycroft-precise
    VII - Lancer l’entraînement

I - Récupérer des sons bruyants

Extraire des bandes-sons de film:

Une source de bruit importante sont les bandes sons des films. C'est généralement très varié (si on choisis des films variés), et quand il n'y a pas de musique, assez représentatif des sons dans le monde réel.

En plus, grâce à ces enregistrements, le mot clé fonctionnera mieux pendant vos soirées ciné.

Pour extraire la bande son d'un film:

ffmpeg -i /chemin/vers/le/film -acodec pcm_s16le -ar 16000 -ac 1 -f wav bandesondufilm.wav

Chez moi j'en ai pris une dizaine, et ça donne ça:

ffmpeg -i /data/films/La\ grande\ vadrouille.avi -acodec pcm_s16le -ar 16000 -ac 1 -f wav la-grande-vadrouille.wav
ffmpeg -i /data/films/Kill\ Bill\ Vol\ 1\ \[1080p\]\ MULTi\ 2003\ BluRay\ x264-Pop\ .mkv -acodec pcm_s16le -ar 16000 -ac 1 -f wav kill-bill.wav
ffmpeg -i /data/films/Harry\ Potter\ 4\ Et\ La\ Coupe\ De\ Feu\ 2005\ \[1080p\]\ MULTI\ 2004\ Bluray\ X264\ lorraines.mkv -acodec pcm_s16le -ar 16000 -ac 1 -f wav hp-4.wav
ffmpeg -i /data/films/Harry\ Potter\ 1\ A\ L\'Ecole\ Des\ Sorciers\ \[1080p\]\ MULTI\ 2001\ Bluray\ X264\ lorraines.mkv -acodec pcm_s16le -ar 16000 -ac 1 -f wav hp-1.wav
ffmpeg -i /data/films/Hunger\ Games\ 1.mkv -acodec pcm_s16le -ar 16000 -ac 1 -f wav hunger-games-1.wav
ffmpeg -i /data/films/Pulp\ Fiction.avi -acodec pcm_s16le -ar 16000 -ac 1 -f wav pulp-fiction.wav
ffmpeg -i /data/films/DRAGONS\ \(2010\).avi -acodec pcm_s16le -ar 16000 -ac 1 -f wav dragon.wav
ffmpeg -i /data/films/Gladiator\ 2000\ 10th\ Anniversary\ Edition\ MULTi\ TrueFrench\ 1080p\ HDLight\ x265\ HEVC.GHT.mkv -acodec pcm_s16le -ar 16000 -ac 1 -f wav galdiator.wav
ffmpeg -i /data/films/Alice\ au\ pays\ des\ merveilles.avi -acodec pcm_s16le -ar 16000 -ac 1 -f wav alice.wav

Télécharger des sons de pluie, et de bruit exterieur depuis Youtube:

Une 2ème source de bruits sont les vidéos Youtube avec des heures de pluie, de vents, ou de bruit blanc. Ce serait dommage que tout le mois de mars, votre reconnaissance vocal ne fonctionne plus à cause de la pluie.

youtube-dl -x "https://www.youtube.com/watch?v=mPZkdNFkNps"
youtube-dl -x "https://www.youtube.com/watch?v=xNN7iTA57jM"
youtube-dl -x "https://www.youtube.com/watch?v=BOdLmxy06H0"
youtube-dl -x "https://www.youtube.com/watch?v=BOdLmxy06H0"
youtube-dl -x "https://www.youtube.com/watch?v=cO_IFJaWmhA"

Télécharger des sons de pubs et de voiture depuis soundarchive

Des sons très intéressants peuvent être récupérés sur SoundArchive. Comme des bruits de voiture, ou de vielles pubs audio.

Télécharger des podcasts

Une source de dialogue très importante, la radio/les podcasts. J'ai donc téléchargé tout un tas d'émissions radios, avec des animateurs et des invités différents

J'ai utilisé l'appli de podcast de mon téléphone: AntennaPod.

  • Télécharger le podcast
  • Appui long sur la piste -> partager -> envoi avec kde connect

J'ai 20 fichiers qui font chacun entre 30 minutes et 1h30 de long.

Récupérer de la musique:

Si vous voulez que votre mot-clé ne se déclenche pas quand vous mettez de la musique, ajoutez des pistes de musique variés, représentatif de votre style d'écoute.

J'ai copié 140 pistes de différents style d'albums (j'ai mis une grosse part de chanson française).

Récupérer des mot-clé opensource:

Enfin, vous pouvez télécharger des mot-clé qui ressemble au votre, sur le github de mycroft. Ce sera un bon début de faux positif.

https://github.com/MycroftAI/precise-community-data

j'ai pris ceux qui ressemblent "maître Yoda", à savoir:

  • Athena
  • Amelia

II - Enregistrer plein de mot-clés

on a du bruit. Il nous manque les enregistrements du mot clé "maitre yoda".

  • J'en ai enregistré une centaine via le micro de la reconnaissance vocal en me mettant à plein d'endroit dans ma chambre, avec precise-collect
  • J'en ai enregistré ensuite 10 par personnes volontaire via le micro de mon pc, plus il y a de diversité mieux c'est. Chez moi, le modèle s'est habitué à ma voix, et c'est dommage quand vous invitez des amis pour leur faire essayer.
  • Ma famille (6 personnes)
  • Des amis (3 personnes)
  • J'en ai enregistré une bonne 50aine, avec les micros de différents ordinateurs, pour essayer de ne pas habituer le modèle au micro de ma reconnaissance vocal.

III - Nettoyer les enregistrements de mot-clé

J'ai utilisé Audacity, et je l'ai fait à la main (il y aurait sûrement moyen d'automatiser ça).

J'ai vérifié qu'il n'y ai que le mot-clé dans chaque enregistrement, et j'ai coupé si il y avait trop de silence au début ou à la fin.

Ça me fait des enregistrements qui font entre 0.8s et 2s, avec un peu de blanc au début et à la fin.

je ne sais pas si il vaut mieux que des fichiers audio de même longueur ou pas. Si il faut laisser du blanc au début ou pas. Et si il faut du blanc à la fin ou pas. Je l'ai fait au pifomètre.

IV - Convertir et découper les source de bruit

Convertir en wav:

SOURCE_DIR=music
DEST_DIR=music-wav/
# selon les extensions de fichier, changez *.mp3 par *.<extension> (youtube-dl télécharge en m4a)
for i in $SOURCE_DIR/*.mp3; do echo "Converting $i..."; fn=${i##*/}; ffmpeg -i "$i" -acodec pcm_s16le -ar 16000 -ac 1 -f wav "$DEST_DIR/${fn%.*}.wav"; done
for i in $SOURCE_DIR/*.flac; do echo "Converting $i..."; fn=${i##*/}; ffmpeg -i "$i" -acodec pcm_s16le -ar 16000 -ac 1 -f wav "$DEST_DIR/${fn%.*}.wav"; done

Découper par tranche de 30s:

for f in *.wav; do sox "$f" "split.$f" trim 0 30 : newfile : restart ; done

V - Augmenter artificiellement vos mots-clés:

On va sélectionner certains bruits pour les ajouter par dessus nos enregistrement de mots-clé. Ca va augmenter notre dataset, et le rendra plus robuste.

J'ai pris:

  • Les videos youtubes
  • Les sons de soundarchive
  • Et des morceaux de classique

Pour être tranquille, on les normalise avec sox:

SOURCE_DIR=noise-short/
DEST_DIR=noise-norm/
for i in $SOURCE_DIR/*.wav; do echo "Converting $i..."; fn=${i##*/}; sox --norm "$i" "$DEST_DIR/${fn%.*}.wav"; done

Puis pour chaque groupe, on va les appliquer sur le mot-clé avec ce script (vous pouvez changer le coeff 0.1 par 0.05 ou 0.2 ou 0.3 selon vos enregistrement):

#!/bin/bash

NOISEDIR=$1

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"

for f in *.wav
do
    NOISEFILE=$(find ${NOISEDIR} -type f | shuf -n 1)

    sox -m -v 0.9 $f -v 0.1 ${NOISEFILE} noise.$f trim 0 `soxi -D $f`
done

Normalement après ça on a triplé nos enregistrement de mot-clé.

VI - Installer Mycroft precise:

https://github.com/MycroftAI/mycroft-precise#source-install

  1. il faut python 3.6 (pour pas se prendre la tète installer ubuntu 18.04)
  2. il y a un bug dans le requirements.txt, après l'installation: pip install h5py<3.0.0

VII - Entrainement:

  • Mettre 80/90% de vos enregistrements de mot-clé dans le dossier wake-word et le reste dans test/wake-word
  • precise-train yoda1.net maitre_yoda/ -e 100 -s 0.5
  • Faire un dossier avec tout le bruit puis precise-train-incremental yoda1.net maitre_yoda/ -r path/to/noise-folder -e 50 -th 0.4 -s 0.5
  • Attendre une bonne heure avec un pc de gamer de l'an 2019

IIX - Profitez !