ผมไปกับ pocketsphinx_continuous และการ์ดเสียง $ 4
เพื่อจัดการกับความจริงที่ว่ามันจำเป็นต้องหยุดฟังเมื่อใช้การสังเคราะห์เสียงพูดฉันใช้ amixer เพื่อจัดการกับปริมาณการป้อนข้อมูลไปยังไมโครโฟน
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" วินาทีจากการเริ่มต้น ไม่ต้องสงสัยเลยว่ามีวิธีมากมายในการจัดการกับสิ่งนี้ ฉันมีความสุขกับผลลัพธ์ของวิธีนี้
ลัวะ 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
อีกครั้งมีวิธีอื่น ๆ แต่ฉันชอบผลลัพธ์ของฉันด้วยวิธีนี้
สำหรับ synth ฉันใช้ Cepstrals fledgling pi solution แต่มันไม่พร้อมใช้งานออนไลน์คุณต้องติดต่อพวกเขาโดยตรงเพื่อเตรียมการซื้อมันและประมาณ $ 30 ถึงจะซื้อ ผลลัพธ์เป็นที่ยอมรับ แต่เสียงพูดนั้นสร้างคลิกและป๊อปที่น่ารังเกียจบางอย่าง บริษัท ได้ตอบว่าพวกเขาไม่มี RaspPi อีกต่อไปและไม่เต็มใจที่จะปรับปรุงผลิตภัณฑ์ YMMV
การรู้จำเสียงอยู่ที่ CPU ประมาณ 12% เมื่อ "ไม่ได้ใช้งาน" และมีหนามแหลมสั้น ๆ เมื่อทำการจดจำเสียง
การสร้างเสียงแหลมที่ประมาณ 50-80% เมื่อเรนเดอร์
การเล่น / sox มีน้ำหนักค่อนข้างหนัก แต่ฉันใช้เอฟเฟกต์ตามเวลาจริงกับเสียงที่เรนเดอร์ขณะที่ฉันเล่น;)
Pi ถูกถอดออกอย่างหนักโดยใช้คู่มือที่ฉันสามารถหาได้เพื่อหยุดบริการที่ไม่ต้องการและทำงานในโหมด CLI ที่สมบูรณ์ 800mhz โอเวอร์คล็อก (เล็กที่สุด)
scaling_governor ตั้งค่าเป็น: ประสิทธิภาพ
เมื่อวิ่งเต็มที่: จะวิ่งที่ประมาณ50ºCในแสงแดดโดยตรงและ38ºCในที่ร่ม ฉันมีแผงระบายความร้อนพอดี
ประเด็นสุดท้าย: จริง ๆ แล้วฉันใช้งานอุปกรณ์ทั้งหมดนี้เพื่อ "ขับเคลื่อนด้วยอินเทอร์เน็ต" AI เป็นสิ่งที่ดีเป็นพิเศษ
ปี่จัดการทั้งหมดนี้อย่างราบรื่นและเล่นเสียงเครือข่ายใด ๆ แบบเรียลไทม์และวนลูปเสียงเต็มไปที่กล่อง Unix อื่น ๆ เป็นต้น
เพื่อจัดการกับภาระค่าใช้จ่ายในการพูดซีพียูขนาดใหญ่ฉันได้ติดตั้งระบบแคชที่ใช้ md5sum ดังนั้นการพูดที่เหมือนกันจะไม่ถูกแสดงผลสองครั้ง (ประมาณ 1,000 ไฟล์ที่ 220 mb รวมครอบคลุม 70% ของคำที่ฉันมักจะได้รับกลับมาจาก AI) สิ่งนี้ช่วยให้การทำงานของ CPU โดยรวมลดลง
ในเบื้องต้นนี้เป็นไปได้ทั้งหมด อย่างไรก็ตามการรู้จำเสียงจะทำได้ดีเท่ากับคุณภาพไมโครโฟน, รูปแบบภาษาของคุณ, วิธีปิดเสียงผู้เข้าร่วมในกลุ่มเป้าหมายของคุณโดยเฉพาะเจาะจงเป็นพิเศษ (ฉันใช้โมเดล en_US สำหรับเด็ก en_UK, ไม่สมบูรณ์) และรายละเอียดอื่น ๆ ด้วยความพยายามคุณสามารถลดระดับลงเพื่อผลลัพธ์ที่ดี
และสำหรับการบันทึกนั้นฉันได้ทำทั้งหมดนี้หนึ่งครั้งก่อนที่จะติด (และที่ทำงานเกินไปกับ cmu sphinx และ flite) หวังว่านี่จะช่วยได้