คราวที่แล้วโม้เรื่อง Voice Recognition ไว้ คราวนี้มาต่อเรื่อง Speech Recognition บ้างดีกว่าครับ

สำหรับ Speech Recognition นั้น เป็นหัวข้อปริญญานิพนธ์ที่ผมทำตอนที่จบการศึกษาครับ ผมเลยสามารถโม้ได้เป็นคุ้งเป็นแควเชียวล่ะ

Speech Recognition คือศาสตร์ทางคอมพิวเตอร์ ที่จะทำยังไงก็ได้ให้คอมพิวเตอร์รู้ว่าคำพูดที่เราพูดเข้าไมโครโฟนนั้น เป็นคำพูดว่าอะไร???

การทำให้คอมพิวเตอร์รู้ว่าเราพูดคำพูดหรือประโยคอะไรนั้น ถือเป็นปัญหาคลาสิกมานานแล้วครับ มีการขบคิดกันมาถึง 30 ปี จนในที่สุดก็คิดตกกันจนได้!!!

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

จุดที่น่าทึ่งก็คือว่า โมเดลทางคณิตศาสตร์ถูกสร้างขึ้นโดยการจำลองจากอวัยวะการออกเสียงของมนุษย์เราครับ ซึ่งอวัยวะออกเสียงของเราก็ได้แก่กระบังลม, ช่องคอ, เพดานอ่อน, เพดานแข็ง, ลิ้น, ริมฝีปาก, ช่องโพรงจมูก, ลิ้นไก่ เป็นต้น

ผมเองก็ไม่รู้เหมือนกันว่าเขาแทนค่าสมการทางคณิตศาสตร์ดังกล่าวได้ไง แต่เขาก็แทนค่าออกมาแล้วอ่ะ ทีนี้รูปแบบของสมการดังกล่าวตั้งอยู่บนสมมติฐานที่ว่าเสียงที่เปล่งออกมาจะถือว่าหน่วยพยางค์เป็นหน่วยที่เล็กที่สุด และ หนึ่งพยางค์จะกินเวลาในการเปล่งเสียงตามปรกติไม่ถึง 1 วินาที

แล้วเขาก็คิดต่อว่า เสียงที่เปล่งออกมาในแต่ล่ะพยางค์ควรแบ่งเป็น frame และแต่ล่ะ frame ควรจะกินเวลาประมาณ 30 – 50 มิลลิวินาที ซึ่งสำหรับผมแล้ว ผมเลือกให้แต่ล่ะ frame กินเวลา 30 มิลลิวินาที

ในแต่ล่ะ frame ควรจะมีเอกลักษณ์ของ frame นั้น ซึ่งสามารถแทนได้ด้วยค่าคงที่ประมาณ 8 – 15 ตัว การแทนค่าคงที่แต่ล่ะ frame ด้วยค่าคงที่ประมาณ 8 – 15 ตัวนั้น ขึ้นอยู่กับผู้พัฒนา software ครับ ว่าจะกำหนดเป็นเท่าไหร่ อย่างของผมนะผมกำหนดให้ค่าเท่ากับ 10 เพราะมันง่ายดีหาร 2 ลงตัวด้วย ไม่มากไป ไม่น้อยไป โดยไอ้เจ้าค่าคงที่ 10 ตัวที่ผมกำหนดเอาไว้ ได้จากการที่ผมตัดเอา amplitude ของเสียงในแต่ล่ะ frame โยนเข้าไปในสมการเพื่อให้ได้ผลลัพท์ออกมานั่นเอง โดยผมจะแทนสมการง่าย ๆ ให้ดูแบบนี้นะ

ค่าสัมประสิทธิ์ 10 ตัว = function_equations(ค่า amplitude ของเสียงใน frame ซึ่งมีช่วงอยู่ที่ 30 วินาที)

สำหรับค่าคงที่ 10 ตัวที่บอกไว้ ถ้าเป็นในทางทฤษฎี speech recognition จะเรียกมันว่า “ค่าสัมประสิทธิ์” ครับ

นั่นก็แสดงว่าถ้าเราเปล่งเสียงออกมาว่า “หนึ่ง” ก็หมายความว่าเราอาจจะแบ่งพยางค์ “หนึ่ง” ออกมาได้เป็น 5 frame และแต่ล่ะ frame แทนได้ด้วยค่าคงที่ 10 ตัว งั้นก็แสดงว่าเราต้องมีค่าคงที่เพื่อใช้แสดงเอกลักษณ์ของเสียง “หนึ่ง” คือ 5 * 10 = 50 ตัวนั่นเอง

แค่เสียง “หนึ่ง” ก็ต้องเก็บค่าคงที่แสดงสัญลักษณ์ถึง 50 ตัวแน่ะ

จากนั้นก็เอาค่าสัมประสิทธิ์ที่ได้มาบันทึกไว้ครับแล้ว mark เอาไว้ด้วย ว่าไอ้เจ้าค่าสัมประสิทธิ์ทั้ง 50 ตัวเนี่ย มันคือค่าของพยางค์ “หนึ่ง”

แล้วเราก็อัดเสียงพยางค์อื่น ๆ ไปเรื่อย ๆ ครับ แล้วก็บันทึกพร้อมทั้ง mark เอาไว้ว่าค่าสัมประสิทธิ์ดังกล่าวเป็นของพยางค์ใด

ไม่ต่างจากการทำพจนานุกรมพยางค์เลย พับผ่าสิ!!!

ทุกวันนี้ Dragon Naturally Speaking ซึ่งเป็น software speech recognition ระดับโลกก็ใช้วิธีแบบนี้เหมือนกัน คือจ้างคนมาอัดเสียงพยางค์ที่เป็นไปได้ในภาษาอังกฤษแล้วก็มาคำนวณค่าสัมประสิทธิ์ จากนั้นบันทึกแล้วก็ mark เอาไว้ระบบของตนเอง เพียงแต่เทคโนโลยีเขาค่อนข้างชั้นสูง เพราะสามารถบีบอัดค่าสัมประสิทธิ์ตั้งเป็นล้าน ๆ ตัวเอาไว้ได้ โดยใช้พื้นที่ในการจัดเก็บไม่มากนัก และเวลาจะใช้ก็จะอ่านเข้ามาไว้ใน ram แล้วก็คลายค่าสัมประสิทธิ์เพื่อจะใช้งานต่อไป

จุดที่น่าสนใจของ speech recognition ก็คือการหาค่าสัมประสิทธิ์เนี่ยแหล่ะครับ เพราะโมเดลทางคณิตศาสตร์ที่จะเอามาใช้นั้น เป็นสมการแบบ recursion ครับ นั่นก็คือถ้าเราอยากจะได้ผลลัพท์ของ element นี้ เราต้องได้ผลลัพท์มาจาก element ก่อนหน้านั้น

ซึ่งถ้าเราไม่เขียน program ให้เป็นแบบ recursive เราก็ต้องคำนวณค่าตั้งต้นย้อนกลับเอาไว้ก่อนครับ หรือพูดง่ายทางภาษาคณิตศาสตร์ก็คือ เราต้องแก้สมการย้อนกลับนั่นเอง

ตอนนั้นผมตาตั้งเลยครับ เพราะอ่อนคณิตศาสตร์มาก แต่ก็ต้องทำครับไม่งั้นไม่จบ ก็เลยแก้สมการออกมาจนได้ครับ

ตอนที่ทดสอบโปรแกรมให้มันคำนวณค่าสัมประสิทธิ์สำหรับพยางค์ “หนึ่ง” ออกมาเนี่ย ผมลุ้นมากเลย เพราะอะไร เพราะผมใช้เครื่อง 80386DX ทำงานบน Microsoft Windows 3.11 เป็นตัว run ครับ ผลเหรอ??? เพื่อให้ได้มาซึ่งค่าสัมประสิทธิ์ 50 ตัว แค่ 50 ตัวนะ!!!! ต้องใช้เวลาในการ run ถึง 3 นาทีกว่าครับ โอ้แม่เจ้า ไมมันนานงี้วะเนี่ย? (ตอนหลังผมมาทราบจากเพื่อนที่เรียนวิศวะไฟฟ้าครับว่า สมการทางคณิตศาสตร์ที่ผมนำมาใช้นั้น มันคือสมการประยุกต์จาก fast fourier transform ครับ โอ้แล้วผมจะรู้มั้ยเนี่ย ไม่ได้เรียนวิศวะนะเฟ้ย มิน่ามันถึงได้คำนวณนานอย่างงี้)

ตอนนั้น Microsoft Windows 3.11 ไม่มีหรอกครับกลไก multi-threading น่ะ ฝันเลยครับ ทำไม่ได้!!!

แต่พอเอาไป run ที่เครื่องของคู่ project ซึ่งเป็น Pentium 145 MHz ทำงานบน Microsoft Windows 95 โหย หาค่าสัมประสิทธิ์ 50 ตัว สำหรับพยางค์ “หนึ่ง” ใช้เวลาแค่ 3 วินาทีเอง ไมมันต่างกันงี้เนี่ย!!!

โอเค โวยวายพอแล้วครับ กลับมาเล่าต่อ

ทีนี้เมื่อเราบันทึกพยางค์ได้มากพอแล้ว (หมายถึงบันทึกค่าสัมประสิทธิ์สำหรับพยางค์ได้มากพอแล้ว ซึ่งควรจะบันทึกให้มาก ๆ เข้าไว้ครับ) ก็ถึงเวลาที่เราจะใช้งานครับ

วิธีใช้งานก็ง่ายมาก เราก็เปิดไมโครโฟนแล้วเปล่งเสียงคำพูดเข้าไปครับ เช่น พูดว่า “หนึ่ง” (ยกแต่ตัวอย่างนี้แหล่ะง่ายดี) แล้วก็ให้โปรแกรมของเรานำพยางค์ “หนึ่ง” มาแบ่งเป็น frame แล้วหาค่าสัมประสิทธิ์ 10 ตัวให้กับแต่ล่ะ frame จะเห็นว่าวิธีการเหมือนตอนบันทึกสัมประสิทธิ์ของพยางค์ต้นแบบเก็บไว้ใน database เป๊ะเลย

ทีนี้จุดที่จะทำให้ software ของเรากิน cpu ถึง 100% ก็ตอนเปรียบเทียบเนี่ยแหล่ะครับ เพราะจะต้องเอาค่าสัมประสิทธิ์ของพยางค์ “หนึ่ง” ที่ตะกี๊พูดใส่ microphone ของแต่ล่ะ frame ไปเปรียบเทียบกับค่าสัมประสิทธิ์ในแต่ล่ะ frame ของพยางค์ต้นแบบทุกตัวที่มีอยู่ใน database ด้วยกฎการตัดสินใจครับ โดยกฎดังกล่าวจะให้ผลลัพท์มาเป็นค่าคงที่

เมื่อเปรียบทุก frame ของทุกพยางค์ใน database แล้ว พบว่าผลลัพท์จากการเปรียบเทียบระหว่างพยางค์ที่เปล่งเข้า microphone กับพยางค์ใน database ใดมีค่าน้อยที่สุด ก็แสดงว่าพยางค์ใน database ตัวนั้นแหล่ะครับ คือพยางค์ที่เราเปล่งเข้า microphone ตะกี๊

หมายความว่าไง???? หมายความว่าการจะรู้ว่าพยางค์ที่เปล่งเข้าไปคือ “หนึ่ง” นั้น software ของเราต้องเปรียบเทียบกับพยางค์ทุกตัวที่มีอยู่ใน database นั่นเอง คือไม่มีหรอกครับ index แบบว่า sequential ล้วน ๆ ครับ

ยิ่งเรามีพยางค์ใน database มากเท่าไหร่ ยิ่งต้องกินเวลาในการเปรียบเทียบเท่านั้น เพราะก็อย่างที่บอก กว่าจะรู้ว่าเป็นพยางค์ไหน ก็ต้องค้นมันให้จบ database ก่อนนั่นเอง จะเดาส่งเดชก็ไม่ได้ เพราะยังค้นไม่จบ เฮ้อ

ดังนั้นการจะทำ software ประเภท speech recognition ได้นั้น นอกจากจะต้องแตกฉานทางคณิตศาสตร์ชั้นสูงแล้ว (ซึ่งผมไม่ได้แตกฉาน อาศัยลอกตำราเอา) ก็ต้องมีความรู้ในการ programming ชั้นสูงด้วย เพราะการวน loop อันมากมายมหาศาลเพื่อคำนวณค่าทางคณิตศาสตร์ซึ่งกินเวลาของ CPU เป็นอันมากนั้น ถ้าเราไม่ใช้การจัดการหน่วยความจำที่ดี, การทำ multi-threading, การจำลองระบบ index ในหน่วยความจำ และการเขียน code ในระดับ assembly บ้าง ก็คงทำให้ software ทำงานให้รวดเร็วและมีประสิทธิภาพไม่ได้ แหงม ๆ

ผมเคยลอง Dragon Naturally Speaking แล้ว เอ๋อไปเลย เพราะแค่ภายหลังจากผมเปล่งพยางค์แค่เสี้ยววินาที มันก็เปรียบเทียบพยางค์แล้วแสดงผลให้ผมเรียบร้อยแล้ว มันแน่จริง ๆ

วกกลับมาเมืองไทยเราครับว่าเมืองไทยเรามีการวิจัยพัฒนาทางด้าน speech recognition บ้างหรือเปล่า?? คือเท่าที่เห็นนะครับ ก็มีที่ NECTEC นั่นแหล่ะ แต่การวิจัยค่อนข้างจะล่าช้านะ ส่วนตามสถาบันการศึกษาต่าง ๆ ก็มีบ้าง ซึ่งส่วนใหญ่จะเป็นวิทยานิพนธ์ของระดับปริญญาโท และก็พยายามเน้นไปที่การเปรียบเทียบค่าสัมประสิทธิ์ของพยางค์ต้นแบบ กับค่าสัมประสิทธิ์ของพยางค์ที่ผู้ใช้พูดเข้าทาง microphone มากกว่า

ผมรู้ล่ะว่าที่ speech recognition พัฒนาในเมืองไทยอย่างล่าช้าเพราะอะไร???

เพราะผู้วิจัยทางด้านนี้พบปัญหาตรงกัน นั่นก็คือโมเดลทางคณิตศาสตร์ที่จะใช้ในการหาค่าสัมประสิทธิ์นั้น ไม่เหมาะกับภาษาไทยของเรา มันถูกออกแบบมาเพื่อกลไกการออกเสียงของภาษาอังกฤษครับ ไม่ใช่ภาษาไทย

คุณทราบมั้ยว่าการเปล่งเสียงของภาษาไทยกับภาษาอังกฤษนั้น เป็นคนล่ะเรื่องกันเลย เพราะภาษาไทยเราเป็นเสียงที่เปล่งออกทางโพรงจมูกเป็นส่วนใหญ่ ในขณะที่ภาษาอังกฤษไม่ใช่ ไม่เชื่อลองอุดจมูกแล้วพูดภาษาไทยจากนั้นสลับเป็นภาษาอังกฤษสิครับ แล้วจะรู้ว่าพูดภาษาไทยลำบากมากเลยเมื่ออุดจมูก

ผมเองภายหลังจากทดสอบ software speech recognition ที่ผมสร้างขึ้นก็พบปัญหาว่า software จะเปรียบเทียบไม่ผิดในระดับของพยัญชนะและสระ แต่จะเปรียบเทียบผิดในระดับวรรณยุกต์ นั่นคือ ถ้าต้นแบบเราเก็บค่าสัมประสิทธิ์สำหรับพยางค์ “กา”, “ก่า”, “ก้า”, “ก๊า”, “ก๋า” เอาไว้ แล้วเราพูดใส่ microphone ว่า “ก้า” software จะเปรียบเทียบผิดเป็น “กา” หรือไม่ก็ “ก๋า” เป็นต้น ซึ่งไม่มีความแม่นยำเอาซะเลย

ก็การออกเสียงภาษาอังกฤษมันมีวรรณยุกต์ที่ไหนเล่า!!!!

ผมก็หวังนะว่าจะมีนักวิจัย speech recognition ของเมืองไทย คิดสมการทางคณิตศาสตร์ซึ่งตั้งอยู่บนพื้นฐานการเปล่งเสียงของคนไทยได้ในเร็ววันนะครับ ผมจะรอ 🙂

Related Posts

8 thoughts on “Speech Recognition

  1. ปี พ.ศ. 2540 โน่นแน่ะครับ ไม่รู้มันไปปรากฎที่หอสมุดแห่งชาติหรือยัง

    เพราะครั้งนั้นผมทำออกมาตั้ง 3 เล่มแน่ะ ได้ยินว่าเล่มนึงเอาไว้ที่หอสมุดแห่งชาติ, อีกเล่มไว้ที่หอสมุดกลางของสถาบัน และเล่มสุดท้ายไว้ในห้องสมุดภาคฯ

  2. ได้ความรู้เพิ่มขึ้นเยอะเละ ถึงแม้จะยังงงเรื่องค่าสัมประสิทธิ์

    กำลังทำโปรเจคเกี่ยวกับSpeech Recognition กำลังศึกษาอยู่

    พี่ช่วยแนะนำได้ไหมค่ะ

    เกี่ยวกับการเปล่งเสียงตัวอักษรภาษาอังกฤษทีละตัว เพื่อเป็น input สำหรับ dictionary แปลอังกฤษเป็นไทย แทนการพิมพ์

    แล้วจะมีความเป็นไปได้ที่จะทำบนมือถือได้หรือเปล่าค่ะ

  3. มีเรื่องจะปรึกษามากมาย
    จะทำโปรเจ็คการพิมพ์ตามคำพูดในไมโครซอฟเวิร์ดสำหรับคนพิการทางมือง่ะ
    แต่ยังไม่เข้าใจอะไรเลยพี่ช่วยเปงที่ปรึกษาให้หน่อยนะคะ ขอบคุณค่ะ
    (ไม่ได้บังคับนะ แต่ต้องเปงที่ปรึกษาให้ด้วย)

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *