Я пошел с pocketsphinx_continuous и звуковой картой за 4 $ .
Чтобы справиться с тем фактом, что необходимо прекратить прослушивание при использовании синтезатора речи, я использовал amixer для обработки громкости на входе в микрофон (это было рекомендовано наилучшей практикой CMU, поскольку остановка запуска двигателя приведет к ухудшению распознавания)
echo "SETTING MIC IN TO 15 (94%)" >> ./audio.log
amixer -c 1 set Mic 15 unmute 2>&1 >/dev/null
С помощью соответствующей команды для отключения звука при воспроизведении синтезатора речи
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
Чтобы рассчитать правильное время отключения звука, я просто запускаю soxi через lua и затем устанавливаю unmute.sh (противоположный mute.sh) для запуска «x» секунд после запуска. Без сомнения, есть много способов справиться с этим. Я доволен результатами этого метода.
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')
Чтобы фактически захватить голос на пи, я использую:
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
Опять же, есть и другие способы, но мне нравится мой вывод таким образом.
Для синтезатора я использовал решение Cepstrals для начинающих пи, но он недоступен в Интернете, вам нужно связаться с ним напрямую, чтобы договориться о его покупке, и он стоит около 30 долларов. Результаты являются приемлемыми, однако речь вызывает некоторые неприятные клики и хлопки, компания ответила, что у них больше нет RaspPi и они не хотят улучшать продукт. YMMV
Распознавание голоса занимает около 12% процессорного времени в режиме ожидания и резко увеличивается, когда выполняется распознавание.
При рендеринге создание голоса достигает 50-80%.
Play / sox весит довольно сильно, но я применяю эффекты в реальном времени к визуализированным голосам, когда я их играю;)
Пи сильно урезан, используя каждое руководство, которое я могу найти, чтобы остановить ненужные сервисы, и работает в полном режиме CLI. 800 МГц, разогнанный (самый маленький).
scaling_governor установлен в: производительность
Когда он полностью работает: он работает при температуре около 50ºC под прямыми солнечными лучами и при температуре 38ºC в тени. У меня установлены радиаторы.
Последнее замечание: я на самом деле запускаю всю эту экипировку для "интернет-ориентированного" ИИ как приятное дополнение.
Pi обрабатывает все это без проблем, и воспроизводит любой сетевой звук в режиме реального времени, и полностью зацикливает звук на любой другой Unix-блок. и т.п.
Чтобы справиться с большой нагрузкой на процессор речи, я реализовал систему кэширования на основе md5sum, чтобы одни и те же высказывания не отображались дважды. (около 1000 файлов при 220 мегабайтах всего покрывает 70% высказываний, которые я обычно получаю от AI), это действительно помогает снизить общую загрузку процессора в целом.
В précis это все полностью выполнимо. однако распознавание голоса будет таким же хорошим, как качество ваших микрофонов, ваша языковая модель, то, насколько конкретно ваши собеседники близки к исходной целевой аудитории (я использую модель en_US для детей en_UK, не идеально) и другие мелочи детализации. что с усилием вы можете свести к приличному результату.
И для справки, я уже делал все это однажды на разжигании (и это работало также с cmu sphinx и flite). Надеюсь это поможет.