ใครทำ Speech Recognition

  • warning: realpath() [function.realpath]: SAFE MODE Restriction in effect. The script whose uid is 1005 is not allowed to access /tmp owned by uid 0 in /var/www/sites/sugree/codenone.com/subdomains/www/html/includes/file.inc on line 190.
  • warning: realpath() [function.realpath]: SAFE MODE Restriction in effect. The script whose uid is 1005 is not allowed to access /tmp owned by uid 0 in /var/www/sites/sugree/codenone.com/subdomains/www/html/includes/file.inc on line 190.

คือว่าพอดีผมกำลังทำโปรเจคจบเกี่ยวกับ Speech Recognition เป็นภาษาไทย ผมได้ลองศึกษา ขั้นตอน วิธีการทำ อัลกอลิทึม ที่ต้องใช้มาบ้างแล้ว แต่พอผมจะเริ่มเขียนโปรแกรมปุ๊บ ผมก็ติดปัญหาทันที คือ ผมไม่รู้ว่าจะใช้ภาษาใดในการเขียน (ไม่รู้ว่าภาษาใดสามารถทำงานกับไฟล์เสียงได้) ไม่รู้ว่าภาษานั้นๆ จะมีวิธีการใด ในการดึงเอาค่า ความถี่ สเปคตรัม หรือข้อมูลอื่นๆ ที่จำเป็นสำหรับขั้นตอนการรู้จำ ออกมาจากไฟล์เสียง ให้กลายเป็นตัวเลข เพื่อนำไปใช้งานเขียนโปรแกรมต่อไป หรือต้องใช้อะไรพิเศษนอกจากตัวภาษามาช่วยหรือเปล่าครับ(ผมเคยเห็น บางบทความบอกว่าใช้ C, JAVA แต่ผมไม่รู้จะดึงค่าต่างๆ ของเสียงออกมาได้อย่างไร) ผมติดปัญหานี้มานานมากแล้วครับ ขอคำชี้แนะด้วยครับขอบคุณเป็นอย่างสูงครับ

สำหรับ Java ในตัว JDK ก็มี Sound API ให้เรียกใช้อยู่แล้ว หรือจะให้เจาะจงยิ่งกว่า ลองดู Java Speech API มีคนอิมพลีเมนท์ไว้หลายอันเหมือนกัน

ลองแล้วเป็นยังไง อย่าลืมมาบอกกันด้วย

สำหรับ Java ไม่มี Speech Recognition ที่ Implement แล้วครับ ไม่เคยเห็นจริงๆ ที่มี Implement Java Speech API มีของ IBM ทำออกมาและอีกหลายๆยี้ห้อ ซื้งล้วนแล้วแต่เป็น Speech synthesis ทั้งนั้น
ทุกภาษาทำงานกับเสียงได้ครับ แต่คุณจะเขียน เองตั้งแต่เริ่มเลยเหรอ? มันไม่อยากไปหน่อยเหรอครับ?
ลองหา Engine มาใช้ดีกว่านะครับ

*** การดึงค่า พวก Amplitude จาก Wave ออกมาน่าจะต้องอ่าน Format ของ wave นะครับ ว่า มันเก็บกันอย่างไร sampling เท่าไหร ผมว่าน่าจะเอา Data ออกมาไม่อยาก สำหรับ Freq Spectrum -*- ผมโง่ Math ไม่รุ้ทำได้ไงเหมือนกัน เขาบอกใช้ ฟูเรีย ดึงออกมา

--- พระเจ้า ๆๆๆๆๆ จอร์จ

ออกตัวก่อนว่าไม่เคยทำ แต่อ่าน guide อธิบาย API ส่วน speech recognition แล้วก็น่าสนุกดีเหมือนกัน ดูไปดูมาไปเจอ Sphinx-4 เป็น speech recognition system เขียนด้วยจาวาล้วนๆ ก็ดูน่าลองดี

ว่าแต่จริงๆถนัดเขียนภาษาอะไรเหรอ ?

ถนัดจริงๆเลยก็ C ครับ

คุณ Sid หาของเล่นมาให้เล่นด้วย Search ไม่เคยเจอ -*- (Skill Search ต่ำ)
ขอบคุณงับๆๆๆ

่เดยทำครับ แนะนำให้ใช้ matlab ครับ ใน matlab จะมี module ให้เราประกอบ Neural Network ขั้นมาได้อยากจะใส่ค่า weight เพื่อให้มันเรียนรู้ยังไงก็ตามใจ ขั้นตอนคร่าว ๆคือ

1. แปลงเสียงจาก time domain ให้รู้ในรูปแบบให้เป็น Freq. domain โดยสร้างจากการพูดซ้ำ ๆ กัน เพื่อนให้เกิดความต่างเพื่อให้จดจำได้ครอบคลุม นั่นคือการพูดคำว่า "ครับ" 2 ครั้งจะทำให้เกิด Signal ที่ผิดเพี้ยนกันได้พอสมควร
2. ใส่ Freq. domain ให้ Neural Network ที่เราสร้างจาก matlab (จะใช้ภาษาอื่นก็ได้นะ แล้วแต่)ใส่ไปเรื่อยจำมันเริ่มจำ charecteristic ได้น่ะแหละ

โชคดีครับ

ขอบคุณครับสำหรับคำแนะนำ แต่ผมยังไม่ค่อยเข้าใจนัก ตรงการแปลงเสียงจาก time domain ให้อยู่ในรูปแบบเป็น Freq. domain มันต้องใช้ ฟูเลี่ยทรานฟรอม ไม่ก็ เวฟเลสทรานฟรอม ใช่ไหมครับ ถึงแม้matlab จะมีฟังชั่นสำเร็จรูปในการแปลงให้ก็จริง แล้วoutput ที่ได้หลังจากแปลงแล้วจะยังเป็นไฟล์ .WAV อยู่หรือว่าเป็นค่าตัวเลข ที่บอกถึงความถี่แต่ละช่วงคลื่นเสียง ค่าแอมพลีจูด และค่าจำเพาะอื่นๆ ที่จำเป็นที่จะต้องใช้งานเลยหรือเปล่าครับ .........เพราะอีกปัญหาที่ผม งง คือ เวลารับเสีบงพูด เข้ามาเป็นประโยค แล้วเราต้องการจะตัดเป็นคำๆ เราจะเขียนโปรแกรมจัดการมันได้ยังไง ในเมื่อการที่เราจะนำค่าเหล่านั้นมาเขียนโปรแกรมได้ ค่าเหล่านั้นจะต้องเป็นตัวเลข หรือสตริง ใช่ไหมครับ แต่เสียงเนีย มันเป็นคลื่นๆ อยู่ในรูปของ .WAV ไม่ใช่ทั้งตัวเลขและสตริง ...........ตอนนี้ผมได้ลองแปลงไฟล์ .WAV ให้อยู่ในเล่นฐาน 16 ที่เก็บในฟลอแม็ตของ NTFS แต่ก็ประสบปัญหาว่า ไม่รู้ความหมาย ของเลขนั้นๆ รู้แค่ว่า บรรทัดแรก เป็นเฮสเดอร์บอกชนิตของไฟล์ บรรทัดที่ 4 หลังคำว่า data ถึงจะเป็นข้อมูลจริงที่เก็บ นอกนั้นยัง งงๆ ไม่รู้ว่าอะไรเป็นอะไรครับ ...........ใครมีวิธีอะไรดีๆ บอกมาเลยครับผมฟังหมด ขอบคุณทุกคนที่ช่วยเหลือครับ

ไฟล์ .wav ก็เป็นการเก็บข้อมูลเสียง Digital แบบนึงครับ ดังนั้นมันจึงมี Sampling กับ Sampling Rate หากดึงข้อมูลจาก .wav เป็นอาเรย์หนึ่งมิติได้ก็ง่ายครับ แกน x ซึ่งเป็นเวลา ก็คือ index ของ array ส่วนแกน y ก็คือ Amplitude ของเสียง คือค่าใน Array (ซึ่งก็คือค่าตัวเลข อาจเป็น integer หรือ floating point) เช่น

sound[x] = y

แต่เวลาจะคำนวนเวลาจริง ๆ ของ Amplitude ก็เอา index ไปคูณกับ Sampling Rate ซึ่งไม่จำเป็นเท่าไร

ส่วนการทำเป็นความถี่ ใน MATLAB ก็

spec = fft(sound)

ผลที่ออกมาก็เป็นอาเรย์ที่มีสมาชิกเป็นตัวเลขเหมือนกัน แต่ทีนี้แกน x จะเป็นความถี่ แกน y ก็จะเป็น Spectrum

ส่วนการจะทำ Recognition ขั้นแรกต้องแยกเป็นคำ ๆ ให้ได้ก่อน อาจใช้การหา local minimum ใน time domain เอา (แต่มีอีกหลายวิธีครับ ซึ่งเรืองนี้ก็ยากไม่ใช่น้อย) พอแยกเป็นคำ ๆ ได้แล้ว ก็ดึง parameter จาก signal เช่น Signal Form, Amplitude, Histogram, Spectrum มาให้ได้ ส่วนจะเป็น parameter ไหนนั้น ต้องคิดเองครับ เพราะศิลป์มันอยู่ตรงนี้ เมื่อได้ parameter space มาแล้ว ก็ Classification ตรง Classification นี่แหละครับ ที่อาจใช้ Neural ได้ หรืออาจหา Algorithm เองโดยใช้วิชา Stochastic ก็ได้

ผมแนะนำว่าควรไปศึกษาเรื่อง Digital Signal Processing ดูครับ การเขียนโปรแกรมนั้นเป็นแค่ส่วนประกอบเล็ก ๆ หากไม่เข้าใจเรื่อง Digital Signal Processing คงอธิบายกันยาวมาก ๆ เพราะผมเองก็ต้องใช้เวลาเรียนตั้งหลายเทอม

sugree's picture

ในที่สุดพระเอกก็ขี่ม้าขาวออกมา

ฟังอธิบายแล้วเพลินเชียว

ดูมีความรู้เยอะดีครับ กำลังจะทำเรื่องนี้อยู่เหมือนกัน แต่ยังรู้อะร ๆ น้อยอยู่ พอมีอะไรจะแนะนำไหมครับ naam22522@hotmail.com

ย้าย Codenone

ประกาศย้าย Codenone ไปใช้ Forum ของ Blognone แทนครับ ตามไปตั้งกระทู้ต่อได้ที่ Codenone Forum (รายละเอียดอ่านจากกระทู้ ย้าย Codenone ไปรวมกับ Blognone)

กระทู้เก่าๆ จะย้ายตามไปในภายหลัง ตอนนี้ปิดการโพสต์กระทู้ไว้ เหลือไว้เฉพาะอ้างอิงเท่านั้น