Ich ging mit pocketsphinx_continuous und einer 4 $ Soundkarte .
Um die Tatsache zu bewältigen, dass es bei Verwendung von Sprachsynthese nicht mehr zuhören muss, habe ich amixer verwendet, um die Lautstärke des Mikrofons zu regeln.
echo "SETTING MIC IN TO 15 (94%)" >> ./audio.log
amixer -c 1 set Mic 15 unmute 2>&1 >/dev/null
Mit einem passenden Befehl zum Stummschalten des Abhörens, wenn der Sprachsynth abgespielt wird
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
Um die richtigen Zeiten für die Stummschaltung zu berechnen, starte ich soxi einfach über lua und setze die Datei unmute.sh (gegenüber der Datei mute.sh) auf "x" Sekunden nach dem Start. Es gibt zweifellos viele Möglichkeiten, damit umzugehen. Ich bin mit den Ergebnissen dieser Methode zufrieden.
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')
Um tatsächlich die Stimme auf dem Pi zu erfassen, benutze ich:
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
Auch hier gibt es andere Möglichkeiten, aber ich mag meine Ausgabe auf diese Weise.
Für den Synthesizer habe ich Cepstrals pi-Lösung verwendet, aber es ist nicht online verfügbar. Sie müssen sich direkt an sie wenden, um den Kauf zu arrangieren, und der Kaufpreis liegt bei etwa 30 US-Dollar. Die Ergebnisse sind akzeptabel, aber die Rede erzeugt einige unangenehme Klicks und Knackgeräusche. Das Unternehmen hat geantwortet, dass sie keinen RaspPi mehr haben und nicht bereit sind, das Produkt zu verbessern. YMMV
Die Spracherkennung liegt im Leerlauf bei etwa 12% der CPU und bei einem Erkennungsblock bei einem kurzen Spitzenwert.
Die Stimmenerzeugung erreicht beim Rendern einen Spitzenwert von etwa 50-80%.
Das Play / Sox ist ziemlich schwer, aber ich wende Echtzeiteffekte auf die gerenderten Stimmen an, während ich sie spiele;)
Der pi wird stark reduziert, wenn ich alle Anleitungen verwende, die ich finden kann, um nicht benötigte Dienste zu stoppen, und wird im vollständigen CLI-Modus ausgeführt. 800 MHz übertaktet (kleinste).
scaling_governor gesetzt auf: performance
Bei vollem Betrieb: Bei direkter Sonneneinstrahlung ca. 50 ° C, im Schatten 38 ° C. Ich habe Kühlkörper eingebaut.
Letzter Punkt: Ich stelle die gesamte Ausrüstung als nettes Extra auf "internetgetriebene" KI.
Das pi erledigt all dies nahtlos und spielt jedes vernetzte Audio in Echtzeit ab und überträgt es vollständig an jede andere Unix-Box. usw.
Um die hohe Belastung der Sprach-CPU zu bewältigen, habe ich ein md5sum-basiertes Caching-System implementiert, damit dieselben Äußerungen nicht zweimal gerendert werden. (ca. 1000 Dateien bei insgesamt 220 MB decken 70% der Äußerungen ab, die ich im Allgemeinen von der KI erhalte.) Dies trägt wirklich dazu bei, die Gesamt-CPU-Auslastung insgesamt zu senken.
In précis ist das alles völlig machbar. Die Spracherkennung ist jedoch nur so gut wie die Qualität Ihrer Mikrofone, Ihr Sprachmodell, die Nähe Ihrer Motivstimmen zum ursprünglich vorgesehenen Publikum (ich verwende ein en_US-Modell für en_UK-Kinder, nicht perfekt) und andere Details dass man mit mühe ein anständiges ergebnis erzielen kann.
Und fürs Protokoll, ich habe das alles schon einmal auf einem Kindle gemacht (und das hat auch mit Cmu Sphinx und Flite funktioniert). Hoffe das hilft.