J'y suis allé avec pochesphinx_continuous et une carte son à 4 $ .
Pour gérer le fait qu'il doit cesser d'écouter lorsque j'utilise un synthétiseur vocal, j'ai utilisé amixer pour entrer le volume dans le micro (cette pratique a été recommandée par la CMU, car le moteur d'arrêt / redémarrage entraînerait une moins bonne reconnaissance).
echo "SETTING MIC IN TO 15 (94%)" >> ./audio.log
amixer -c 1 set Mic 15 unmute 2>&1 >/dev/null
Avec une commande correspondante pour couper l'écoute lorsque le synthétiseur vocal joue
FILE: mute.sh
#!/bin/sh
sleep $1;
amixer -c 1 set Mic 0 unmute >/dev/null 2>&1 ;
echo "** MIC OFF **" >> /home/pi/PIXIE/audio.log
Pour calculer les bons moments de mise en sourdine, exécutez simplement soxi via lua, puis réglez le fichier unmute.sh (à l'opposé du mute.sh) sur "x" secondes à partir du démarrage. Il y a sans doute beaucoup de façons de gérer cela. Je suis content des résultats de cette méthode.
LUA SNIPPET:
-- Begin parallel timing
-- MUTE UNTIL THE SOUNDCARD FREES UP
-- "filename" is a fully qualified path to a wav file
-- outputted by voice synth in previous operation
-- GET THE LENGTH
local sample_length = io.popen('soxi -D '..filename);
local total_length = sample_length:read("*a");
clean_length = string.gsub(total_length, "\n", "") +1;
sample_length:close();
-- EXAMPLE LOGGING OUTPUT...
--os.execute( 'echo LENGTH WAS "'.. clean_length .. '" Seconds >> ./audio.log');
-- we are about to play something...
-- MUTE, then schedule UNMUTE.sh in x seconds, then play synth output
-- (have unrolled mute.sh here for clarity)
os.execute( 'amixer -c 1 set Mic '..mic_level..' unmute 2>&1 >/dev/null ');
os.execute( 'echo "** MIC OFF **" >> ./audio.log ');
-- EXAMPLE LOGGING OUTPUT...
-- os.execute( 'echo PLAYING: "'.. filename..'" circa ' .. clean_length .. ' Seconds >> ./audio.log ');
os.execute( './unmute.sh "'.. clean_length ..'" &');
-- THEN PLAY THE THING WHILE THE OTHER PROCESS IS SLEEPING
os.execute( './sounds-uncached.sh '..filename..' 21000')
Pour saisir réellement la voix sur le pi que j'utilise:
pocketsphinx_continuous -bestpath 0 -adcdev plughw:1 -samprate 20000 \
-nfft 512 -ds2 -topn2 -maxwpf 5 -kdtreefn 3000 -kdmaxdepth 7 -kdmaxbbi 15 \
-pl_window 10 -lm ./LANGUAGE/0892-min.lm -dict ./LANGUAGE/0892-min.dic 2>&1 \
| tee -i 2>/dev/null >( sed -u -n -e 's/^.\{9\}: //p' ) \
>( sed -u -n -e 's/^READY//p' \
-e 's/^Listening//p' -e 's/^FATAL_ERROR: \"continuous\.c\"\, //p') \
> /dev/null
Encore une fois, il y a d'autres moyens, mais j'aime ma sortie de cette façon.
Pour le synthé, j'ai utilisé la solution pi naissante de Cepstrals, mais elle n'est pas disponible en ligne, vous devez les contacter directement pour prendre les dispositions nécessaires pour l'acheter. Le prix d'achat est d'environ 30 $. Les résultats sont acceptables, mais le discours crée quelques clics et bruits désagréables. La société a répondu en affirmant qu'elle ne possédait plus de RaspPi et qu'elle ne souhaitait pas améliorer le produit. YMMV
La reconnaissance vocale se situe à environ 12% de l’UC quand elle est "inactive" et s’accroît brièvement lorsqu’une partie de la reconnaissance est faite.
La création de voix atteint environ 50 à 80% lors du rendu.
Le jeu / sox pèse assez lourdement mais j’applique des effets en temps réel aux voix rendues au fur et à mesure que je les joue;)
Le pi est fortement dépouillé en utilisant chaque guide que je pourrais trouver pour arrêter les services non requis et fonctionne en mode CLI complet. 800 MHz surchargé (le plus petit).
scaling_governor défini sur: performance
En fonctionnement complet: il fonctionne à environ 50 ° C sous la lumière directe du soleil et à 38 ° C à l'ombre. Je fais installer des dissipateurs de chaleur.
Dernier point: en fait, je lance tout ce matériel à l'IA "Internet".
Le pi gère tout cela de manière transparente, et reproduit tous les fichiers audio en réseau en temps réel, et les boucles audio intégralement en boucle sur n'importe quel autre boîtier Unix. etc.
Pour gérer la surcharge de temps processeur de la parole, j'ai implémenté un système de mise en cache basé sur md5sum afin que les mêmes énoncés ne soient pas rendus deux fois. (environ 1000 fichiers @ 220 mb au total couvrent 70% des énoncés que je tire en général de l’intelligence artificielle), ce qui aide vraiment à réduire la charge totale du processeur.
En résumé, tout cela est totalement faisable. cependant, la reconnaissance vocale dépendra uniquement de la qualité de vos micros, de votre modèle de langage, de la proximité des voix de vos sujets avec le public cible initial (j'utilise un modèle en_US sur des enfants en_UK, mais pas parfait) et d'autres détails qu'avec un effort, vous pouvez obtenir un résultat décent.
Et pour l’information, j’avais déjà fait tout cela une fois auparavant sur une feuille (et cela fonctionnait aussi avec cmu sphinx et flite). J'espère que cela t'aides.