Sono andato con pocketphinx_continuous e una scheda audio da $ 4 .
Per gestire il fatto che deve smettere di ascoltare quando si utilizza il sintetizzatore vocale, ho usato l'amixer per gestire il volume di ingresso al microfono (questa è stata la migliore pratica raccomandata dalla CMU poiché il motore di avvio si tradurrà in un riconoscimento più scarso)
echo "SETTING MIC IN TO 15 (94%)" >> ./audio.log
amixer -c 1 set Mic 15 unmute 2>&1 >/dev/null
Con un comando corrispondente per disattivare l'audio durante la riproduzione del sintetizzatore vocale
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
Per calcolare i tempi giusti per disattivare l'audio per ho appena eseguito soxi via lua e quindi impostare unmute.sh (al contrario di mute.sh) per eseguire "x" secondi dall'avvio. Non ci sono molti modi per gestirlo. Sono contento dei risultati di questo metodo.
SNIPPET LUA:
-- 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')
Per afferrare effettivamente la voce sul pi che uso:
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
Ancora una volta, ci sono altri modi, ma mi piace il mio output in questo modo.
Per il synth ho usato la soluzione Cepstrals per principianti, ma non è disponibile online devi contattarli direttamente per organizzare l'acquisto e costa circa $ 30. I risultati sono accettabili, tuttavia il discorso crea cattivi clic e pop, la società ha risposto dicendo che non hanno più un RaspPi e non sono disposti a migliorare il prodotto. YMMV
Il riconoscimento vocale si attesta a circa il 12% della CPU quando è "inattivo" e si innalza brevemente quando si esegue un blocco di riconoscimento.
La creazione della voce aumenta di circa il 50-80% durante il rendering.
Il play / sox pesa abbastanza pesantemente ma applico effetti in tempo reale alle voci renderizzate mentre le suono;)
Il pi è pesantemente abbattuto usando ogni guida che ho trovato per fermare i servizi non richiesti e funziona in modalità CLI completa. 800mhz over-clock (il più piccolo).
scaling_governor impostato su: performance
A pieno funzionamento: funziona a circa 50 ° C alla luce solare diretta e 38 ° C all'ombra. Ho montato i dissipatori di calore.
Ultimo punto: in realtà gestisco tutta questa attrezzatura con l'intelligenza artificiale "Internet driven" come un bel extra.
Il pi gestisce tutto questo senza soluzione di continuità, e riproduce qualsiasi audio di rete in tempo reale, e l'audio completamente in loop su qualsiasi altra casella Unix. eccetera.
per gestire l'onere gravoso della CPU per il parlato ho implementato un sistema di cache basato su md5sum in modo che le stesse espressioni non vengano rese due volte. (circa 1000 file a 220 mb in totale coprono il 70% delle parole che generalmente torno dall'intelligenza artificiale) questo aiuta davvero a ridurre il carico totale della CPU nel complesso.
In pratica, questo è totalmente fattibile. tuttavia il riconoscimento vocale sarà buono solo quanto la qualità dei tuoi microfoni, il tuo modello linguistico, quanto in particolare le voci dei tuoi soggetti sono rivolte al pubblico originale previsto (io uso un modello en_US su bambini en_UK, non perfetto) e altri dettagli minuziosi che con uno sforzo puoi ridurre ad un risultato decente.
E per la cronaca, ho già fatto tutto questo una volta in precedenza su un kindle (e questo ha funzionato anche con sfinge cmu e flite). Spero che sia di aiuto.