คำอธิบายปัญหา
ฉันต้องการที่จะใช้การจดจำเสียงเป็นส่วนหนึ่งของโครงการฮาร์ดแวร์ซึ่งฉันต้องการที่จะประกอบด้วยตนเองอย่างสมบูรณ์ (ฉันใช้พลังงานต่ำขนาดเล็กอุปกรณ์ความเร็วต่ำเช่น Arduino และ Raspberry Pi, Kinects ฯลฯ ไม่ใช้คอมพิวเตอร์แบบดั้งเดิมด้วย ระบบปฏิบัติการที่เกี่ยวข้องดังนั้นโครงการปิด / ตนเองประกอบด้วย)
การจดจำเสียงสามารถซับซ้อนมากขึ้นอยู่กับระดับของความซับซ้อนที่คุณต้องการ ฉันมีสิ่งที่ฉันเชื่อว่าเป็นข้อกำหนดที่เรียบง่าย ฉันแค่อยากจะจำเสียงของตัวเองและฉันมีพจนานุกรมเล็ก ๆ จำนวน 20 คำขึ้นไปที่ฉันอยากจะจำ ดังนั้นฉันไม่จำเป็นต้องมีห้องสมุดรู้จำเสียงพูดเป็นข้อความและเสียงที่ซับซ้อนหรือซอฟต์แวร์บุคคลที่สามที่ยอดเยี่ยมใด ๆ ที่ฉันค้นหาผ่านเครื่องมือค้นหาทางอินเทอร์เน็ต (ไม่มีปัญหาเหล่านี้!) ฉันเชื่อว่าความต้องการของฉัน "ง่ายพอ" (ภายในเหตุผล) ที่ฉันสามารถเขียนรหัสโซลูชันของตัวเอง ฉันสงสัยว่าถ้าใครเขียนกระบวนการของตัวเองแบบนี้และวิธีการของฉันนั้นมีข้อบกพร่องอย่างมากมายหรือไม่? มีวิธีที่ดีกว่าในการทำเช่นนี้โดยไม่ต้องใช้คณิตศาสตร์ในระดับสูงหรือต้องเขียนอัลกอริทึมที่ซับซ้อนหรือไม่? นั่นคือทางออกที่ฉันได้ลองคิดดูด้านล่าง
คำอธิบายโซลูชัน
ฉันจะเขียนสิ่งนี้ในภาษา C แต่ฉันต้องการที่จะพูดคุยเกี่ยวกับกระบวนการที่ไม่เชื่อเรื่องภาษาโดยเพ่งความสนใจไปที่กระบวนการของตนเอง ถ้าอย่างนั้นเราก็สามารถเพิกเฉยได้
1. ฉันจะบันทึกพจนานุกรมคำศัพท์ล่วงหน้าเพื่อให้ตรงกับที่พูด เราสามารถจินตนาการได้ว่าฉันมีการบันทึก 20 คำจาก 20 คำที่แตกต่างกันหรืออาจเป็นวลีสั้น ๆ หรือประโยคสองหรือสามคำ ฉันเชื่อว่าสิ่งนี้ทำให้กระบวนการเปรียบเทียบไฟล์บันทึกสองไฟล์ง่ายกว่าการแปลงเสียงเป็นข้อความและเปรียบเทียบสองสตริง
2. ไมโครโฟนเชื่อมต่อกับอุปกรณ์ฮาร์ดแวร์ของฉันใช้รหัสของฉัน [1] รหัสกำลังทำการเก็บตัวอย่างความยาวคงที่อย่างต่อเนื่องตัวอย่างความยาว 10 มิลลิวินาทีและเก็บตัวอย่าง 10 ตัวอย่างติดต่อกันในรูปแบบการบันทึกแบบวงกลม [2] (ฉันกำลังประดิษฐ์ตัวเลขเหล่านี้อยู่ด้านบนของหัวของฉันดังนั้นพวกเขาจึงเป็นเพียงตัวอย่างเพื่ออธิบายกระบวนการ)
[1] อาจมีการเชื่อมต่อผ่านตัวกรองแบนด์พาสและ op-amp เช่นเดียวกับการบันทึกพจนานุกรมเพื่อเก็บตัวอย่างเสียงที่จัดเก็บและรวบรวมไว้ให้เล็กลง
[2] ฉันไม่แน่ใจว่าฉันจะเก็บตัวอย่างอย่างไรฉันต้องคิดหาวิธีแม้ว่าฉันจะสร้างตัวเลข (จำนวนเต็ม / ทศนิยม / สองเท่า) ที่แสดงถึงเสียงของตัวอย่าง 10msec (อาจเป็นค่า CRC หรือผลรวม MD5 ของตัวอย่างเสียง) หรือสตรีมของตัวเลข (สตรีมของการอ่านเสียงที่มีความถี่อาจ) ในที่สุด "ตัวอย่าง" จะเป็นตัวเลขหรือตัวเลข ส่วนนี้จะเป็นฮาร์ดแวร์ที่เกี่ยวข้องมากขึ้นดังนั้นจึงไม่ใช่การอภิปรายที่นี่
3. รหัสดูที่มันถูกเก็บไว้ 10 ตัวอย่างติดต่อกันและมองหาการเพิ่มปริมาณเพื่อระบุคำหรือวลีที่ถูกกล่าว (หยุดพักจากความเงียบ) แล้วเพิ่มขึ้นเป็นตัวอย่างการเก็บรวบรวมติดต่อกันเพื่อพูดตัวอย่าง 500 ตัวอย่าง นั่นหมายถึงมันจับเสียง 5 วินาทีในตัวอย่าง 10 มิลลิวินาที
เป็นตัวอย่างหรือ "ชิ้นส่วน" ที่เปรียบเทียบระหว่างเสียงที่เก็บไว้กับเสียงที่ถ่าย หากเปอร์เซ็นต์ตัวอย่างที่จับได้สูงพอจับคู่กับที่เก็บไว้เทียบเท่ารหัสจะถือว่าเป็นคำเดียวกัน
The start of a store recording of the world "hello" for example,
stored words are split into 10 msec samples also
Stored Sample No | 1| 2| 3| 4| 5| 6| 7| 8|
Stored Sample Value |27|38|41|16|59|77|200|78|
Incoming audio (me saying "hello") with some "blank" samples
at the start to symbolise silence
Incoming Sample No | 1| 2| 3| 4| 5| 6| 7| 8| 9|10| 11|12|
Incoming Sample Value | | | |20|27|38|46|16|59|77|200|78|
4. เมื่อโค้ดได้รวบรวมสตรีมตัวอย่างเต็มรูปแบบแล้วมันจะตัดตัวอย่างช่องว่างที่จุดเริ่มต้นเพื่อสร้างการบันทึกเสียงต่อไปนี้ นอกจากนี้ยังสามารถย้ายตัวอย่างชุดไปข้างหลังและส่งต่อสถานที่ไปสองสามแห่งเพื่อให้สอดคล้องกับตัวอย่างที่เก็บไว้ได้ดียิ่งขึ้น
สิ่งนี้จะสร้างกลุ่มตัวอย่างดังนี้:
Stored Sample No | 1| 2| 3| 4| 5| 6| 7| 8|
Stored Sample Value |27|38|41|16|59|77|200|78|
Incoming Sample No |-1| 1| 2| 3| 4| 5| 6| 7| 8|
Incoming Sample Value |20|27|38|46|16|59|81|201|78|
5. ฉันเชื่อว่าการมีค่าเปอร์เซ็นต์สำหรับการปิดแต่ละตัวอย่างต้องเป็นอย่างนั้นดังนั้นตัวอย่าง 7 จึงแตกต่างกันด้วยค่า 1 ซึ่งน้อยกว่า% 1 และค่าเปอร์เซ็นต์สำหรับจำนวนตัวอย่างทั้งหมดซึ่งต้องอยู่ภายในเปอร์เซ็นต์การจับคู่ตัวอย่าง รหัสมีระดับความแม่นยำที่ปรับได้ง่าย
ฉันไม่เคยทำอะไรแบบนี้มาพร้อมกับเสียงมาก่อนมันอาจจะเป็นงานมาก นี่คือเหตุผลที่ฉันถามคำถามนี้ถ้าคุณอาจรู้คำตอบของคำถามนี้ชัดเจนแล้ว (อาจเป็นคำตอบที่เคย) ฉันหวังว่านี่จะไม่เป็นงานที่ใหญ่มากเพราะฮาร์ดแวร์บางอย่างที่ฉันจะใช้งานจะเป็นสิ่งที่ไม่กี่วินาที ในหลายร้อย Megahertz (อาจ 1Ghz โดยใช้ Rasp Pi ที่โอเวอร์คล็อก) ดังนั้นนี่เป็นวิธีที่ค่อนข้างหยาบในการจับคู่ตัวอย่างเสียงโดยใช้กำลังการคำนวณที่ต่ำกว่า ฉันไม่ได้มุ่งหวังผลทันที แต่น้อยกว่า 30 วินาทีเพื่อพิสูจน์แนวคิดที่ดี
PS ฉันไม่มีตัวแทนในการแท็กสิ่งนี้ด้วยแท็กใหม่เช่น "เสียง", "การจดจำเสียง", "เสียง", "การจดจำเสียง" ฯลฯ