Poszedłem z pocketsphinx_continuous i kartą dźwiękową za 4 USD .
Aby poradzić sobie z faktem, że musi on przestać słuchać podczas korzystania z syntezatora mowy, użyłem amixera do obsługi głośności wejściowej do mikrofonu (było to zalecane przez CMU najlepszą praktykę, ponieważ zatrzymanie silnika spowoduje gorsze rozpoznawanie)
echo "SETTING MIC IN TO 15 (94%)" >> ./audio.log
amixer -c 1 set Mic 15 unmute 2>&1 >/dev/null
Z pasującym poleceniem, aby wyciszyć słuchanie podczas odtwarzania syntezatora mowy
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
Aby obliczyć właściwy czas wyciszenia, po prostu uruchamiam soxi przez lua, a następnie ustaw unmute.sh (na odwrót od mute.sh), aby uruchamiał „x” sekund od uruchomienia. Nie ma wątpliwości, że istnieje wiele sposobów, aby sobie z tym poradzić. Cieszę się z wyników tej metody.
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')
Aby właściwie złapać głos na pi, używam:
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
Znów są inne sposoby, ale w ten sposób podoba mi się mój wynik.
W przypadku syntezatora użyłem raczkującego rozwiązania pi Cepstrals, ale nie jest on dostępny online, musisz skontaktować się z nim bezpośrednio, aby umówić się na jego zakup, a jego zakup kosztuje około 30 USD. Wyniki są akceptowalne, jednak mowa powoduje paskudne kliknięcia i trzaski, firma odpowiedziała, że nie ma już RaspPi i nie chce ulepszać produktu. YMMV
Rozpoznawanie głosu znajduje się na poziomie około 12% CPU, gdy jest „bezczynne”, i na krótko zwiększa się, gdy wykonuje fragment rozpoznawania.
Podczas renderowania generowanie głosu wzrasta o około 50–80%.
Gra / sox waży dość mocno, ale podczas renderowania głosów stosuję efekty w czasie rzeczywistym;)
Pi jest mocno zredukowane za pomocą każdego przewodnika, jaki udało mi się znaleźć, aby zatrzymać niepotrzebne usługi i działa w pełnym trybie CLI. 800 MHz przetaktowany (najmniejszy).
scaling_governor ustawiony na: performance
Po pełnym uruchomieniu: działa w temperaturze około 50ºC w bezpośrednim świetle słonecznym i 38ºC w cieniu. Mam zamontowane radiatory.
Ostatnia kwestia: właściwie cały ten sprzęt wypuszczam na sztuczną inteligencję sterowaną przez Internet jako niezły dodatek.
Pi radzi sobie z tym wszystkim płynnie i odtwarza dźwięk sieciowy w czasie rzeczywistym oraz w pełni zapętlony dźwięk do dowolnego innego urządzenia z systemem Unix. itp.
aby poradzić sobie z dużym obciążeniem procesora mowy, wdrożyłem system buforowania oparty na md5sum, więc te same wypowiedzi nie są renderowane dwukrotnie. (około 1000 plików @ 220 mb łącznie pokrywa 70% wypowiedzi, które generalnie otrzymuję z AI), to naprawdę pomaga obniżyć całkowite obciążenie procesora.
Na wstępie wszystko to jest całkowicie wykonalne. jednak rozpoznawanie głosu będzie tylko tak dobre, jak jakość mikrofonów, model językowy, jak konkretnie głosy uczestników są zbliżone do pierwotnie zamierzonej publiczności (używam modelu en_US u dzieci en_UK, a nie doskonałe) i inne szczegóły że z trudem możesz obniżyć do przyzwoitego wyniku.
A dla przypomnienia, zrobiłem to wszystko już raz na rozpałce (i to też działało z cmu sfinksem i flite). Mam nadzieję że to pomoże.