Calcifer/output/smart-home-episode-3-entrai...

191 lines
18 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title>Couac.tv - Smart home, épisode 3, entrainer un "Wake-word" avec Mycroft-precise</title>
<link rel="stylesheet" type="text/css" href="http://couac.tv/theme/css/main.css" />
<link rel="stylesheet" href="https://fonts.ppsfleet.navy/Josephin_sans/style.css" />
<link rel="stylesheet" href="https://fonts.ppsfleet.navy/arimo/arimo.css" />
<link rel="alternate" type="application/rss+xml" href="http://couac.tv/feeds/all.atom.xml" />
<meta property="og:site_name" content="Couac.tv">
<meta name="author" content="Tom Darboux">
<meta name="description" content="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é " />
<meta property="og:description" content="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é ">
<meta property="og:title" content="Smart home, épisode 3, entrainer un "Wake-word" avec Mycroft-precise">
</head>
<body>
<header>
<h1>
<a href="http://couac.tv/">Couac.tv</a>
</h1>
<aside>
</aside>
<nav>
<ul>
<li><a href="https://pixelfed.social/tjiho">Quelques Photos</a></li>
<li><a href="http://tom.darboux.me">A propos de moi</a></li>
</ul>
</nav>
</header>
<main>
<article class="post">
<div>
<h1><a href="http://couac.tv/smart-home-episode-3-entrainer-un-wake-word-avec-mycroft-precise.html" rel="bookmark">Smart home, épisode 3, entrainer un "Wake-word" avec Mycroft-precise</a></h1>
<div class="meta">
<p>
Posted on <time datetime="2021-12-12T00:00:00+01:00">dim. 12 décembre 2021</time> in <a href="http://couac.tv/category/iot.html">Iot</a> by <a class="url fn" href="http://couac.tv/author/tom-darboux.html">Tom Darboux</a>
. </p>
</div> </div>
<div>
<p>Chez moi, j'ai installé <a href="https://rhasspy.readthedocs.io/en/latest/">Rhasspy</a>, un assistant vocal opensource et modulaire.<br>
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;</p>
<blockquote>
<p>"dis siri" </p>
<p>"ok google"</p>
<p>"hey mycroft"</p>
</blockquote>
<p>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.</p>
<blockquote>
<p>"Maitre Yoda ... allume la lampe du salon"</p>
</blockquote>
<p>Il y a plusieurs étapes:</p>
<ul>
<li>Préparer les données<br>
I - Récupérer tout un tas de sons bruyants, de sons d'ambiances susceptible d'être entendu par l'assistant<br>
II - Enregistrer ce fameux mot-clé<br>
III - Nettoyer les enregistrements<br>
IV - Convertir, formater, et découper nos sons d'ambiances<br>
V - Fusionner les sons d'ambiance avec nos enregistrements </li>
<li>Entraîner le modèle<br>
VI - Installer Mycroft-precise<br>
VII - Lancer lentraînement </li>
</ul>
<h2>I - Récupérer des sons bruyants</h2>
<h3>Extraire des bandes-sons de film:</h3>
<p>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.</p>
<p>En plus, grâce à ces enregistrements, le mot clé fonctionnera mieux pendant vos soirées ciné.</p>
<p>Pour extraire la bande son d'un film:</p>
<div class="highlight"><pre><span></span><code>ffmpeg -i /chemin/vers/le/film -acodec pcm_s16le -ar <span class="m">16000</span> -ac <span class="m">1</span> -f wav bandesondufilm.wav
</code></pre></div>
<p>Chez moi j'en ai pris une dizaine, et ça donne ça:</p>
<div class="highlight"><pre><span></span><code>ffmpeg -i /data/films/La<span class="se">\ </span>grande<span class="se">\ </span>vadrouille.avi -acodec pcm_s16le -ar <span class="m">16000</span> -ac <span class="m">1</span> -f wav la-grande-vadrouille.wav
ffmpeg -i /data/films/Kill<span class="se">\ </span>Bill<span class="se">\ </span>Vol<span class="se">\ </span><span class="m">1</span><span class="se">\ \[</span>1080p<span class="se">\]\ </span>MULTi<span class="se">\ </span><span class="m">2003</span><span class="se">\ </span>BluRay<span class="se">\ </span>x264-Pop<span class="se">\ </span>.mkv -acodec pcm_s16le -ar <span class="m">16000</span> -ac <span class="m">1</span> -f wav kill-bill.wav
ffmpeg -i /data/films/Harry<span class="se">\ </span>Potter<span class="se">\ </span><span class="m">4</span><span class="se">\ </span>Et<span class="se">\ </span>La<span class="se">\ </span>Coupe<span class="se">\ </span>De<span class="se">\ </span>Feu<span class="se">\ </span><span class="m">2005</span><span class="se">\ \[</span>1080p<span class="se">\]\ </span>MULTI<span class="se">\ </span><span class="m">2004</span><span class="se">\ </span>Bluray<span class="se">\ </span>X264<span class="se">\ </span>lorraines.mkv -acodec pcm_s16le -ar <span class="m">16000</span> -ac <span class="m">1</span> -f wav hp-4.wav
ffmpeg -i /data/films/Harry<span class="se">\ </span>Potter<span class="se">\ </span><span class="m">1</span><span class="se">\ </span>A<span class="se">\ </span>L<span class="se">\&#39;</span>Ecole<span class="se">\ </span>Des<span class="se">\ </span>Sorciers<span class="se">\ \[</span>1080p<span class="se">\]\ </span>MULTI<span class="se">\ </span><span class="m">2001</span><span class="se">\ </span>Bluray<span class="se">\ </span>X264<span class="se">\ </span>lorraines.mkv -acodec pcm_s16le -ar <span class="m">16000</span> -ac <span class="m">1</span> -f wav hp-1.wav
ffmpeg -i /data/films/Hunger<span class="se">\ </span>Games<span class="se">\ </span><span class="m">1</span>.mkv -acodec pcm_s16le -ar <span class="m">16000</span> -ac <span class="m">1</span> -f wav hunger-games-1.wav
ffmpeg -i /data/films/Pulp<span class="se">\ </span>Fiction.avi -acodec pcm_s16le -ar <span class="m">16000</span> -ac <span class="m">1</span> -f wav pulp-fiction.wav
ffmpeg -i /data/films/DRAGONS<span class="se">\ \(</span><span class="m">2010</span><span class="se">\)</span>.avi -acodec pcm_s16le -ar <span class="m">16000</span> -ac <span class="m">1</span> -f wav dragon.wav
ffmpeg -i /data/films/Gladiator<span class="se">\ </span><span class="m">2000</span><span class="se">\ </span>10th<span class="se">\ </span>Anniversary<span class="se">\ </span>Edition<span class="se">\ </span>MULTi<span class="se">\ </span>TrueFrench<span class="se">\ </span>1080p<span class="se">\ </span>HDLight<span class="se">\ </span>x265<span class="se">\ </span>HEVC.GHT.mkv -acodec pcm_s16le -ar <span class="m">16000</span> -ac <span class="m">1</span> -f wav galdiator.wav
ffmpeg -i /data/films/Alice<span class="se">\ </span>au<span class="se">\ </span>pays<span class="se">\ </span>des<span class="se">\ </span>merveilles.avi -acodec pcm_s16le -ar <span class="m">16000</span> -ac <span class="m">1</span> -f wav alice.wav
</code></pre></div>
<h3>Télécharger des sons de pluie, et de bruit exterieur depuis Youtube:</h3>
<p>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.</p>
<div class="highlight"><pre><span></span><code>youtube-dl -x <span class="s2">&quot;https://www.youtube.com/watch?v=mPZkdNFkNps&quot;</span>
youtube-dl -x <span class="s2">&quot;https://www.youtube.com/watch?v=xNN7iTA57jM&quot;</span>
youtube-dl -x <span class="s2">&quot;https://www.youtube.com/watch?v=BOdLmxy06H0&quot;</span>
youtube-dl -x <span class="s2">&quot;https://www.youtube.com/watch?v=BOdLmxy06H0&quot;</span>
youtube-dl -x <span class="s2">&quot;https://www.youtube.com/watch?v=cO_IFJaWmhA&quot;</span>
</code></pre></div>
<h3>Télécharger des sons de pubs et de voiture depuis soundarchive</h3>
<p>Des sons très intéressants peuvent être récupérés sur SoundArchive. Comme des bruits de voiture, ou de vielles pubs audio.</p>
<h3>Télécharger des podcasts</h3>
<p>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</p>
<p>J'ai utilisé l'appli de podcast de mon téléphone: AntennaPod.</p>
<ul>
<li>Télécharger le podcast</li>
<li>Appui long sur la piste -&gt; partager -&gt; envoi avec kde connect</li>
</ul>
<p>J'ai 20 fichiers qui font chacun entre 30 minutes et 1h30 de long.</p>
<h3>Récupérer de la musique:</h3>
<p>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.</p>
<p>J'ai copié 140 pistes de différents style d'albums (j'ai mis une grosse part de chanson française).</p>
<h3>Récupérer des mot-clé opensource:</h3>
<p>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.</p>
<p><a href="https://github.com/MycroftAI/precise-community-data">https://github.com/MycroftAI/precise-community-data</a></p>
<p>j'ai pris ceux qui ressemblent "maître Yoda", à savoir:</p>
<ul>
<li>Athena</li>
<li>Amelia</li>
</ul>
<h2>II - Enregistrer plein de mot-clés</h2>
<p>on a du bruit. Il nous manque les enregistrements du mot clé "maitre yoda".</p>
<ul>
<li>J'en ai enregistré une centaine via le micro de la reconnaissance vocale en me mettant à plein d'endroit dans ma chambre, avec <code>precise-collect</code></li>
<li>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.</li>
<li>Ma famille (6 personnes)</li>
<li>Des amis (3 personnes)</li>
<li>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.</li>
</ul>
<h2>III - Nettoyer les enregistrements de mot-clé</h2>
<p>J'ai utilisé Audacity, et je l'ai fait à la main (il y aurait sûrement moyen d'automatiser ça).</p>
<p>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.</p>
<p>Ça me fait des enregistrements qui font entre 0.8s et 2s, avec un peu de blanc au début et à la fin.</p>
<p>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.</p>
<h3>IV - Convertir et découper les source de bruit</h3>
<p><strong>Convertir en wav:</strong></p>
<div class="highlight"><pre><span></span><code><span class="nv">SOURCE_DIR</span><span class="o">=</span>music
<span class="nv">DEST_DIR</span><span class="o">=</span>music-wav/
<span class="c1"># selon les extensions de fichier, changez *.mp3 par *.&lt;extension&gt; (youtube-dl télécharge en m4a)</span>
<span class="k">for</span> i <span class="k">in</span> <span class="nv">$SOURCE_DIR</span>/*.mp3<span class="p">;</span> <span class="k">do</span> <span class="nb">echo</span> <span class="s2">&quot;Converting </span><span class="nv">$i</span><span class="s2">...&quot;</span><span class="p">;</span> <span class="nv">fn</span><span class="o">=</span><span class="si">${</span><span class="nv">i</span><span class="p">##*/</span><span class="si">}</span><span class="p">;</span> ffmpeg -i <span class="s2">&quot;</span><span class="nv">$i</span><span class="s2">&quot;</span> -acodec pcm_s16le -ar <span class="m">16000</span> -ac <span class="m">1</span> -f wav <span class="s2">&quot;</span><span class="nv">$DEST_DIR</span><span class="s2">/</span><span class="si">${</span><span class="nv">fn</span><span class="p">%.*</span><span class="si">}</span><span class="s2">.wav&quot;</span><span class="p">;</span> <span class="k">done</span>
<span class="k">for</span> i <span class="k">in</span> <span class="nv">$SOURCE_DIR</span>/*.flac<span class="p">;</span> <span class="k">do</span> <span class="nb">echo</span> <span class="s2">&quot;Converting </span><span class="nv">$i</span><span class="s2">...&quot;</span><span class="p">;</span> <span class="nv">fn</span><span class="o">=</span><span class="si">${</span><span class="nv">i</span><span class="p">##*/</span><span class="si">}</span><span class="p">;</span> ffmpeg -i <span class="s2">&quot;</span><span class="nv">$i</span><span class="s2">&quot;</span> -acodec pcm_s16le -ar <span class="m">16000</span> -ac <span class="m">1</span> -f wav <span class="s2">&quot;</span><span class="nv">$DEST_DIR</span><span class="s2">/</span><span class="si">${</span><span class="nv">fn</span><span class="p">%.*</span><span class="si">}</span><span class="s2">.wav&quot;</span><span class="p">;</span> <span class="k">done</span>
</code></pre></div>
<p><strong>Découper par tranche de 30s:</strong></p>
<div class="highlight"><pre><span></span><code><span class="k">for</span><span class="w"> </span><span class="nv">f</span><span class="w"> </span><span class="nv">in</span><span class="w"> </span><span class="o">*</span>.<span class="nv">wav</span><span class="c1">; do sox &quot;$f&quot; &quot;split.$f&quot; trim 0 30 : newfile : restart ; done</span><span class="w"></span>
</code></pre></div>
<h3>V - Augmenter artificiellement vos mots-clés:</h3>
<p>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.</p>
<p>J'ai pris:</p>
<ul>
<li>Les videos youtubes</li>
<li>Les sons de soundarchive</li>
<li>Et des morceaux de classique</li>
</ul>
<p>Pour être tranquille, on les normalise avec sox:</p>
<div class="highlight"><pre><span></span><code><span class="nv">SOURCE_DIR</span><span class="o">=</span>noise-short/
<span class="nv">DEST_DIR</span><span class="o">=</span>noise-norm/
<span class="k">for</span> i <span class="k">in</span> <span class="nv">$SOURCE_DIR</span>/*.wav<span class="p">;</span> <span class="k">do</span> <span class="nb">echo</span> <span class="s2">&quot;Converting </span><span class="nv">$i</span><span class="s2">...&quot;</span><span class="p">;</span> <span class="nv">fn</span><span class="o">=</span><span class="si">${</span><span class="nv">i</span><span class="p">##*/</span><span class="si">}</span><span class="p">;</span> sox --norm <span class="s2">&quot;</span><span class="nv">$i</span><span class="s2">&quot;</span> <span class="s2">&quot;</span><span class="nv">$DEST_DIR</span><span class="s2">/</span><span class="si">${</span><span class="nv">fn</span><span class="p">%.*</span><span class="si">}</span><span class="s2">.wav&quot;</span><span class="p">;</span> <span class="k">done</span>
</code></pre></div>
<p>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):</p>
<div class="highlight"><pre><span></span><code><span class="ch">#!/bin/bash</span>
<span class="nv">NOISEDIR</span><span class="o">=</span><span class="nv">$1</span>
<span class="nv">DIR</span><span class="o">=</span><span class="s2">&quot;</span><span class="k">$(</span> <span class="nb">cd</span> <span class="s2">&quot;</span><span class="k">$(</span> dirname <span class="s2">&quot;</span><span class="si">${</span><span class="nv">BASH_SOURCE</span><span class="p">[0]</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">)</span><span class="s2">&quot;</span> &gt;/dev/null <span class="m">2</span>&gt;<span class="p">&amp;</span><span class="m">1</span> <span class="o">&amp;&amp;</span> <span class="nb">pwd</span> <span class="k">)</span><span class="s2">&quot;</span>
<span class="k">for</span> f <span class="k">in</span> *.wav
<span class="k">do</span>
<span class="nv">NOISEFILE</span><span class="o">=</span><span class="k">$(</span>find <span class="si">${</span><span class="nv">NOISEDIR</span><span class="si">}</span> -type f <span class="p">|</span> shuf -n <span class="m">1</span><span class="k">)</span>
sox -m -v <span class="m">0</span>.9 <span class="nv">$f</span> -v <span class="m">0</span>.1 <span class="si">${</span><span class="nv">NOISEFILE</span><span class="si">}</span> noise.<span class="nv">$f</span> trim <span class="m">0</span> <span class="sb">`</span>soxi -D <span class="nv">$f</span><span class="sb">`</span>
<span class="k">done</span>
</code></pre></div>
<p>Normalement après ça on a triplé nos enregistrements de mot-clé.</p>
<h3>VI - Installer Mycroft precise:</h3>
<p>https://github.com/MycroftAI/mycroft-precise#source-install</p>
<ol>
<li>il faut python 3.6 (pour pas se prendre la tète installer ubuntu 18.04)</li>
<li>il y a un bug dans le requirements.txt, après l'installation: <code>pip install h5py&lt;3.0.0</code></li>
</ol>
<h3>VII - Entrainement:</h3>
<ul>
<li>Mettre 80/90% de vos enregistrements de mot-clé dans le dossier wake-word et le reste dans test/wake-word</li>
<li><code>precise-train yoda1.net maitre_yoda/ -e 100 -s 0.5</code></li>
<li>Faire un dossier avec tout le bruit puis <code>precise-train-incremental yoda1.net maitre_yoda/ -r path/to/noise-folder -e 50 -th 0.4 -s 0.5</code></li>
<li>Attendre une bonne heure avec un pc de gamer de l'an 2019</li>
</ul>
<h3>IIX - Profitez !</h3>
</div>
</article>
</main>
</body>
</html>