Fui con pocketsphinx_continuous y una tarjeta de sonido de $ 4 .
Para manejar el hecho de que necesita dejar de escuchar cuando se usa el sintetizador de voz, utilicé un mezclador para manejar el volumen de entrada al micrófono (esta fue la mejor práctica recomendada por CMU, ya que el motor de arranque de parada dará lugar a un reconocimiento más pobre)
echo "SETTING MIC IN TO 15 (94%)" >> ./audio.log
amixer -c 1 set Mic 15 unmute 2>&1 >/dev/null
Con un comando coincidente para silenciar la escucha cuando se reproduce el sintetizador de voz
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
Para calcular los tiempos correctos para silenciar, simplemente ejecuto soxi a través de lua y luego configuro el unmute.sh (opuesto al mute.sh) para ejecutar "x" segundos desde el inicio. No hay duda de muchas maneras de manejar esto. Estoy contento con los resultados de este método.
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')
Para realmente captar la voz en el pi que 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
Nuevamente, hay otras formas, pero me gusta mi salida de esta manera.
Para el sintetizador, utilicé la solución Pi Cepstrals incipiente, pero no está disponible en línea, debe contactarlos directamente para organizar la compra y cuesta alrededor de $ 30. Los resultados son aceptables, sin embargo, el discurso crea algunos clics desagradables, la compañía respondió que ya no tienen un RaspPi y no están dispuestos a mejorar el producto. YMMV
El reconocimiento de voz se encuentra en alrededor del 12% de la CPU cuando está "inactivo", y se dispara brevemente cuando se realiza una porción de reconocimiento.
La creación de voz aumenta a aproximadamente 50-80% cuando se procesa.
El play / sox pesa bastante, pero aplico efectos en tiempo real a las voces renderizadas mientras las toco;)
El pi se elimina en gran medida utilizando todas las guías que pude encontrar para detener los servicios no necesarios y se ejecuta en modo CLI completo. 800mhz over-clocked (el más pequeño).
scaling_governor establecido en: rendimiento
Cuando funciona completamente: funciona a aproximadamente 50ºC a la luz solar directa y a 38ºC a la sombra. Tengo disipadores de calor instalados.
Último punto: en realidad ejecuto todo este equipo a la IA "impulsada por Internet" como un buen extra.
El pi maneja todo esto a la perfección, y reproduce cualquier audio en red en tiempo real, y audio en bucle completo a cualquier otra caja de Unix. etc.
Para manejar la gran carga de la CPU de voz, he implementado un sistema de almacenamiento en caché basado en md5sum para que las mismas expresiones no se procesen dos veces. (alrededor de 1000 archivos a 220 mb en total cubren el 70% de las expresiones que generalmente obtengo de la IA), esto realmente ayuda a reducir la carga total de la CPU en general.
En resumen, todo esto es totalmente factible. sin embargo, el reconocimiento de voz solo será tan bueno como la calidad de sus micrófonos, su modelo de idioma, qué tan específicamente están las voces de sus sujetos con la audiencia original (uso un modelo en_US en niños en_UK, no perfecto) y otros detalles minuciosos que con esfuerzo puedes reducir a un resultado decente.
Y para que conste, ya hice todo esto una vez antes con un Kindle (y eso también funcionó con cmu sphinx y flite). Espero que esto ayude.