Pocketsphinx_continuous ve 4 $ 'lık ses kartı ile gittim .
Konuşma sent'ı kullanırken dinlemeyi bırakması gerektiği gerçeğini yönetmek için mikrofona ses hacmini işlemek için karıştırıcı kullandım (bu, CMU tarafından durdurma motorunun daha kötü tanınmasına neden olacağı için bu en iyi yöntem olarak önerildi)
echo "SETTING MIC IN TO 15 (94%)" >> ./audio.log
amixer -c 1 set Mic 15 unmute 2>&1 >/dev/null
Konuşma synth çaldığında dinlemeyi susturmak için eşleşen bir komutla
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
Sessizlik yapmak için doğru zamanları hesaplamak için lua üzerinden soxi'yi çalıştırdım ve sonra unmute.sh'ı (mute.sh'ın tersi) başlangıçtan itibaren "x" saniye çalışacak şekilde ayarlayın. Kuşkusuz bununla baş etmenin birçok yolu vardır. Bu yöntemin sonuçlarından memnunum.
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')
Aslında kullandığım pi üzerindeki sesi kapmak için:
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
Yine, başka yollar var, ama çıktımı bu şekilde seviyorum.
Synth için Cepstrals acemi pi çözümünü kullandım, ancak çevrimiçi olarak kullanılamıyor, satın almak için doğrudan bağlantı kurmanız gerekiyor ve satın almak için 30 dolar civarında. Sonuçlar kabul edilebilir, ancak konuşma bazı kötü tıklamalar ve patlamalar yaratıyor, şirket artık bir RaspPi'ye sahip olmadıklarını ve ürünü geliştirmek için isteksiz olduklarını söyleyerek cevap verdi. YMMV
Ses tanıma "boşta" olduğunda yaklaşık% 12 CPU'da oturur ve bir tanıma parçası yaparken kısa bir süre yükselir.
Ses oluşturma, oluştururken yaklaşık% 50-80 oranında yükselir.
Oyun / sox oldukça ağır bir hal alıyor ama ben çalınan seslere gerçek zamanlı efektler uyguluyorum;)
Pi, gerekmeyen hizmetleri durdurmak için bulabildiğim her kılavuzu kullanarak yoğun şekilde sıyrılıyor ve CLI modunda çalışıyor. 800 mhz fazla mesai (en küçük).
scaling_governor şöyle ayarlandı: performans
Tamamen çalışırken: doğrudan güneş ışığında yaklaşık 50ºC'de ve gölgede 38ºC'de çalışır. Isı alıcıları monte ettim.
Son nokta: Aslında tüm bu donanımları "internet odaklı" AI ile güzel bir ekstra olarak çalıştırıyorum.
Pi tüm bunları sorunsuz bir şekilde gerçekleştirir ve Ağa bağlı herhangi bir sesin gerçek zamanlı olarak çalınmasını ve diğer herhangi bir Unix kutusuna tamamen döngülü ses verilmesini sağlar. vb.
Büyük konuşma CPU yükü yükünü ele almak için md5sum tabanlı bir önbellekleme sistemi kullandım, böylece aynı ifadeler iki kez gösterilmez. (toplamda yaklaşık 1000 dosya @ 220 mb, AI'dan genel olarak geri aldığım ifadelerin% 70'ini kapsıyor), bu gerçekten toplam CPU yükünü azaltmaya yardımcı oluyor.
Précis'te bu tamamen yapılabilir. Ancak, ses tanıma yalnızca mikrofonlarınızın kalitesi, dil modeliniz, konularınızın seslerinin orijinal hedef kitleye ne kadar yakın olduğu (en_UK çocuklarında en_US modelini kullanmıyorum, mükemmel değil) kadar iyi olacak. gayretle iyi bir sonuca varabilirsiniz.
Ve kayıt için, bütün bunları daha önce bir kez mızmızla yaptım (ve bu cmu sfenks ve flite ile de çalıştı). Bu yardımcı olur umarım.