190 lines
8.4 KiB
Markdown
190 lines
8.4 KiB
Markdown
Title: Smart home, épisode 3, entrainer un "Wake-word" avec Mycroft-precise
|
||
Date: 2021-12-12 00:00
|
||
Category: Iot
|
||
|
||
Chez moi, j'ai installé [Rhasspy](https://rhasspy.readthedocs.io/en/latest/), 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 enregistrements
|
||
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 choisi 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:
|
||
```bash
|
||
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:
|
||
|
||
```bash
|
||
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.
|
||
|
||
```bash
|
||
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](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 vocale en me mettant à plein d'endroit dans ma chambre, avec `precise-collect`
|
||
* J'en ai enregistré ensuite 10 par personnes volontaires 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 vocale.
|
||
|
||
## 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:**
|
||
```bash
|
||
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 enregistrements 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:
|
||
|
||
```bash
|
||
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 enregistrements):
|
||
```bash
|
||
#!/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 enregistrements 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 !
|