Tags:

ในตอนที่แล้ว ผมได้พูดถึงโปรแกรม PocketSphinx ซึ่งเป็นโปรแกรมรู้จำเสียงอัตโนมัติ (Automatic Speech Recognition หรือ ASR) ที่เป็น open source สามารถปรับแต่งให้รู้จำเสียงแบบใด ภาษาใดก็ได้ โดยผมได้พูดถึงการสร้างโมเดลที่จำเป็นต้องใช้สำหรับโปรแกรมรู้จำเสียงทั้งสามแบบ ได้แก่ language model, phonetic dictionary และ acoustic model ไปแล้ว ในตอนนี้จะเป็นการทดสอบโมเดลเพื่อวัดประสิทธิภาพของโมเดล การนำเอาโมเดลทั้งสามไปใช้งานจริง การทำ adaptation acoustic model และการทำ voice activation ครับ

การทดสอบ Acoustic Model

ขั้นตอนการทดสอบ acoustic model ถือเป็นสิ่งที่จำเป็นมาก เพราะจะเป็นการประเมินโมเดลของเราว่าสามารถนำไปใช้งานได้หรือไม่ โดย Sphinx จะใช้ค่า WER เป็นตัวประเมิน

WER (Word Error Rate) นิยามดังนี้

กำหนดให้มีข้อความที่ถูกต้อง (original text) กับข้อความที่คอมพิวเตอร์สามารถฟังได้ (recognition text) ยาว N คำ ถ้าคำที่คอมพิวเตอร์ฟังผิดเป็นคำที่ถูกแทรกขึ้นมาจากข้อความเดิม I คำ (inserted words) เป็นคำที่หายไปจากข้อความเดิม D คำ (deleted words) และเป็นคำที่ถูกแทนที่ไปจากคำเดิม S คำ (substituted words) แล้ว word error rate สามารถคิดได้ดังนี้

WER = (I + D + S) / N

ค่า WER จะวัดเป็นเปอร์เซ็นต์ สังเกตว่ายิ่งค่า WER เยอะ ประสิทธิภาพของโมเดลก็จะยิ่งแย่

สำหรับคำถามที่ว่าค่า WER ระดับไหนถึงเหมาะสมกับการใช้งาน อันนี้ต้องขึ้นอยู่กับการนำไปใช้ อย่างงานของผมซึ่งใช้คำสั่งเพียงไม่กี่คำก็อาจจะมีค่า WER น้อยกว่า 5% เป็นต้น

สำหรับวิธีการทดสอบ acoustic model สามารถเข้าไปดูได้ที่ http://cmusphinx.sourceforge.net/wiki/tutorialam#testing

การนำโมเดลไปใช้งาน

หลังจากที่ทำการฝึกและทดสอบ acoustic model เรียบร้อยแล้ว จะมีโฟลเดอร์ใหม่งอกขึ้นมาจากเดิมดังนี้ (ตอนก่อนฝึกเราจะมีแค่โฟลเดอร์ etc กับ wav)

  • etc
  • feat
  • logdir
  • model_parameters
  • model_architecture
  • wav

ซึ่งไฟล์ acoustic model ที่เราจะเอาไปใช้จริงๆ อยู่ในไดเรกทอรีนี้ครับ

model_parameters/<your_db_name>.cd_semi_<number_of senones>/

การนำเอาไปใช้งานก็ให้ก็อบปี้โฟลเดอร์นั้นทั้งหมด รวมทั้งไฟล์ language model และ phonetic dictionary มาไว้ในไดเรกทอรีเดียวกัน เมื่อจะใช้งานก็ให้สั่งใน terminal ว่า

รอให้ terminal ขึ้นสถานะว่า Ready… ก่อน จากนั้นก็ลองพูดดูครับ ถ้าโปรแกรมไม่มีปัญหาอะไร มันจะขึ้นว่า Listening ทันทีที่เราพูดจบหรือไม่มีเสียงภายนอกรบกวน และจะแสดงข้อมูลว่าโปรแกรมรู้จำคำศัพท์อะไรได้บ้าง

สำหรับ Troubleshooting ของการสร้าง acoustic model สามารถเข้าไปดูได้ที่ลิงก์นี้ http://cmusphinx.sourceforge.net/wiki/tutorialam#troubleshooting

การทำ Adaptation Acoustic Model

วิธีการเพิ่มประสิทธิภาพของ acoustic model วิธีหนึ่งคือการทำ adaptation ครับ อย่างที่ผมได้บอกไว้ตั้งแต่ตอนที่แล้วว่าบางครั้งเราไม่จำเป็นต้องสร้าง acoustic model ใหม่ทุกครั้ง (ความจำเป็นในการฝึก acoustic model ใหม่นั้นสามารถดูได้ในตอนที่หนึ่ง)

Adaptation acoustic model สามารถ

  • ช่วยให้โมเดลสามารถรู้จำเสียงของเราได้ดียิ่งขึ้น
  • ช่วยเพิ่มประสิทธิภาพการรู้จำของโมเดลได้ดีขึ้น
  • ช่วยให้โมเดลรู้จำสำเนียง (accent) อื่นๆ ในภาษาเดียวกันได้
  • หากต้องการให้โมเดลรู้จำเสียงในสภาพแวดล้อมอื่นๆ ได้มากขึ้น เช่น ในออฟฟิศ การทำ adaptation ก็ช่วยได้เช่นกัน
  • ภาษาจำพวก cross-language เช่น จะให้โมเดลสามารถรู้จำภาษาอื่นๆ ที่ยืมเอาภาษาอังกฤษ หรือจะให้รู้จำภาษาลาวจากโมเดลภาษาไทย ก็สามารถทำได้เช่นเดียวกัน

ข้อดีอย่างหนึ่งของการทำ adaptation acoustic model คือใช้ข้อมูลเสียงน้อยกว่าการสร้าง acoustic model ใหม่ค่อนข้างมาก CMUSphinx เคลมว่าใช้ข้อมูลเสียงแค่ 5 นาทีก็สามารถเพิ่มประสิทธิภาพของโมเดลขึ้นอย่างเห็นได้ชัด

เตรียมข้อมูลสำหรับทำ Adaptation Acoustic Model

ไฟล์สำหรับทำ adaptation acoustic model มีแค่ 3 ไฟล์เท่านั้น (your_db คือชื่อ database ของเรา จะตั้งชื่อเป็นอะไรก็ได้)

  • your_db.fileids
  • your_db.transcription
  • your_db.dic
  • ข้อมูลเสียงสำหรับทำ adaptation

ไฟล์ทั้งหมดจะคล้ายๆ กับที่ใช้ในการสร้าง acoustic model

กระบวนการ Adaptation

สำหรับวิธีการทำ adaptation และรายละเอียดอื่นๆ สามารถอ่านเพิ่มเติมได้ที่ http://cmusphinx.sourceforge.net/wiki/tutorialadapt

อย่าลืมว่าหลังการทำ adaptation แล้วต้องทำการทดสอบเหมือนกับการสร้าง acoustic model ด้วยทุกครั้ง

การทำ Voice Activation

สังเกตไหมครับว่าการสั่งงานด้วยเสียงบนสมาร์ทโฟนถ้าไม่กดปุ่มก่อนก็ต้องพูดคีย์เวิร์ดก่อนทุกครั้ง อย่างเช่น วลีเด็ดของกูเกิล “OK Google” หรืออย่าง “Hey, Siri” บน iOS 8 ซึ่งการกระทำในลักษณะนี้เราเรียกว่า voice activation

เหตุผลที่ต้องทำ voice activation ส่วนหนึ่งเข้าใจว่าเป็นการแยกระหว่างคำสั่งเสียงบนสมาร์ทโฟนกับคำพูดที่เราใช้พูดในชีวิตประจำวัน (ถ้าเราจะสั่งสมาร์ทโฟนให้ทำงานก็ต้องพูดคีย์เวิร์ดซะก่อน) อีกเหตุผลหนึ่งก็เนื่องมาจากว่าตัว automatic speech recognition ต้องประมวลผลข้อมูลเยอะมากเพื่อบอกว่าแต่ละคำที่เราพูดคืออะไรบ้าง ถ้าให้ตัว automatic speech recognition ทำงานตลอดเวลา สมาร์ทโฟนจะต้องประมวลผลมากจนเกินความจำเป็น ดังนั้น จะดีกว่าหากจะมีโปรแกรมหรือวิธีการที่จะสามารถจับเฉพาะคีย์เวิร์ดที่เราต้องการ ซึ่งน่าจะทำให้ใช้ทรัพยากรในการประมวลผลน้อยลง วิธีการในการจับเฉพาะคีย์เวิร์ดที่ต้องการดังที่อธิบายข้างต้น เราเรียกกันว่า keyword spotting ครับ

ผมจะสรุปความแตกต่างระหว่าง keyword spotting กับ speech recognition เป็นอย่างนี้ครับ

Speech recognition เป็นการประมวลผลคำพูดของผู้พูดโดยแปลงจากเสียงของผู้พูดให้เป็นข้อความทั้งหมด เช่น ถ้าผมพูดว่า “เย็นนี้ไปกินข้าวกันไหม” โปรแกรมนี้จะต้องสามารถบอกได้ว่าผมกำลังพูดประโยคที่ว่า “เย็นนี้ไปกินข้าวกันไหม” ได้ทั้งหมด

Keyword spotting เป็นการประมวลผลคำพูดของผู้พูดโดยจับเอาเฉพาะคีย์เวิร์ดที่เราต้องการเท่านั้น ไม่จำเป็นต้องแปลงคำพูดทั้งหมด เช่น ผมตั้งโปรแกรมให้จับคีย์เวิร์ดคำว่า “กินข้าว” แล้วผมพูดว่า “เย็นนี้ไปกินข้าวกันไหม” โปรแกรมจะบอกว่าผมได้พูดคำว่า “กินข้าว” ไปแล้ว

CMUSphinx’s Keyword Spotting

CMUSphinx มีฟีเจอร์ keyword spotting ครับ แต่ต้องพูดก่อนว่าเวอร์ชันที่ใช้ปัจจุบัน (PocketSphinx-0.8) นั้นกลับไม่มีฟีเจอร์นี้มาให้ครับ (ทั้งๆ ที่เวอร์ชัน 0.7 ซึ่งเป็นเวอร์ชันก่อนหน้า หรือเวอร์ชัน 5prealpha ซึ่งเป็นเวอร์ชันที่ยังพัฒนากันอยู่กลับมีฟีเจอร์นี้มาให้) ดังนั้น ถ้าต้องการจะใช้จริงๆ ผมแนะนำให้ติดตั้งโปรแกรมเวอร์ชันที่พัฒนาอยู่แทน (เวอร์ชัน 0.7 ผมใช้แล้วไม่ค่อยเวิร์คเท่าไหร่) ลิงก์ดาวน์โหลดจะอยู่ที่ http://sourceforge.net/p/cmusphinx/code/HEAD/tree/trunk/ คลิกที่ Download Snapshot ซึ่งวิธีการติดตั้งเหมือนกับเวอร์ชันก่อนๆ

ผมทดลองใช้ pocketsphinx_continuous กับ acoustic model ที่ถูกสร้างมาจาก sphinxtrain-1.0.8 แล้วไม่มีปัญหา (แถมยังใช้งานได้ดีกว่าเวอร์ชัน 0.8 เสียด้วยซ้ำ) ส่วนการสร้าง acoustic model จาก sphinxtrain ที่อยู่ใน snapshot ดังกล่าวพบว่าไม่สามารถใช้งานได้ครับ (แต่เนื่องจากเป็นเวอร์ชันพัฒนา ก็ไม่แน่ว่าอาจจะมีการแก้ไขแล้ว)

วิธีการใช้งาน keyword spotting นั้นจะใช้คำสั่งดังนี้

Option ที่เพิ่มขึ้นมาของ keyword spotting ใน PocketSphinx คือ -kws ครับ โดยสิ่งที่ตามหลัง -kws คือไฟล์ keyphrase ซึ่งเป็นไฟล์ที่เก็บคีย์เวิร์ดที่เราต้องการให้มันตรวจจับครับ โดยหนึ่งบรรทัดจะประกอบด้วยคีย์เวิร์ดซึ่งเป็นศัพท์ที่มีใน phonetic dictionary หนึ่งตัว ตัวอย่างเช่น ถ้าสมมติผมต้องการให้คำว่า “ฮัลโหล” เป็นคีย์เวิร์ดสำหรับทำ keyword spotting ผมก็เขียนแค่ว่า “ฮัลโหล” ก็พอแล้ว อีกสิ่งหนึ่งที่อยากให้สังเกตคือการทำ keyword spotting นั้นไม่ใช้ไฟล์ language model ครับ

การใช้งานของ pocketsphinx_continuous รุ่นที่กำลังพัฒนาอยู่นั้นจะแตกต่างจากเวอร์ชัน 0.8 อยู่อย่างหนึ่งตรงที่เราต้องบอกโปรแกรมเสมอว่าจะให้รับข้อมูลนำเข้าเป็นอะไร สังเกตได้ว่า ผมเพิ่ม option อันสุดท้ายคือ -inmic ลงไป แล้วตามด้วย yes ในที่นี้จะหมายถึงว่าให้โปรแกรมรับข้อมูลเสียงจากไมโครโฟนครับ (กรณีที่ต้องการให้รับข้อมูลเป็นไฟล์เสียงก็ใช้ -infile เหมือนเดิม)

Thresholding ใน Keyword Spotting

กรณีที่เราต้องการ (หรือไม่ต้องการ) ให้โปรแกรม detect คำที่ใกล้เคียงกับคีย์เวิร์ด เช่น ต้องการให้โปรแกรมจับคำได้ง่ายขึ้น หรือไม่ต้องการจับคำว่า “หมั่นโถว” แทนที่จะเป็นคำว่า “ฮัลโหล” ก็สามารถปรับค่า threshold ของตัว keyword spotting ได้โดยเขียนคำสั่งดังนี้

โดยค่า default ของ kws_threshold คือ 1.00 ครับ ผมทดลองใช้ค่า default ในการให้ pocketsphinx_continuous จับคีย์เวิร์ดพบว่ามันยังใช้ได้ไม่ดีนัก เลยลองปรับเพิ่ม/ลดค่าของ kws_threshold ดู ปรากฏว่ายิ่งค่าของ kws_threshold ลดลงเท่าไหร่ ยิ่งทำให้โปรแกรมจับคำคีย์เวิร์ดที่มีเสียงใกล้เคียงได้มากขึ้นเท่านั้น ส่วนจะปรับเท่าไหร่นั้นอันนี้ขึ้นอยู่กับการทดลอง (ผมลองปรับไปถึง 1e-10 หรือก็คือ 0.0000000001 แต่ผมลองหาบางกระทู้เค้าแนะนำถึง 1e-50 เลยครับ)

ประเด็นเพิ่มเติมของ PocketSphinx

ต่อไปนี้จะพูดถึงประเด็นต่างๆ ที่น่าสนใจของ PocketSphinx เพิ่มเติมครับ

ประเด็นที่ 1: Speech Recognition ใน PocketSphinx ไม่สามารถปรับค่า thresholding ได้

อันนี้เป็นปัญหาใน speech recognition นะครับ ไม่ใช่ปัญหาของ keyword spotting

ปัญหาเกิดขึ้นหลังจากที่ผมลองพูดคำอื่นๆ ที่ไม่ใช่คำสั่งที่ต้องการ อย่างเช่นคำว่า “ปิดไฟ” ผมลองพูดคำว่า “กินไก่” แทน สังเกตได้ว่าคำสองคำนี้เสียงใกล้เคียงกันเลยทำให้ PocketSphinx นึกว่าผมพูดคำว่า “ปิดไฟ” ดังนั้น ผมจึงพยายามหาวิธีเพื่อที่จะทำให้ PocketSphinx ไม่ต้องหาคำใกล้เคียงกับที่ผมพูด (ศัพท์ทางเทคนิคของคำที่ใกล้เคียงกันแต่ไม่ต้องการให้โปรแกรมรู้จำได้นั้นเรียกว่า out-of-vocabulary word หรือ OOV word) แต่ปรากฏว่าหลายๆ เว็บต่างก็บอกว่าโปรแกรมนี้ไม่สามารถทำแบบนั้นได้

วิธีการหนึ่งที่จะแก้ปัญหานี้ได้คือต้องสร้างโมเดลที่จำคำที่ใกล้เคียงกับคำว่า “ปิดไฟ” ทั้งหมด เช่น คำว่า “มิด” “คิด” “ไผ่” “ไก่” เป็นต้น ซึ่งนั่นจะทำให้ต้องใช้เวลาในการสร้างโมเดลมากขึ้นครับ ส่วน Sphinx4 เข้าใจว่ามีเทคนิคหนึ่งคือการทำ phone loop แต่ไม่ได้ศึกษามาว่าต้องทำยังไงบ้าง

ศึกษาเรื่องของการทำ Rejecting Out-of-Grammar Utterances เพิ่มเติมได้ที่ http://cmusphinx.sourceforge.net/wiki/sphinx4:rejectionhandling

สำหรับผู้ที่พัฒนาโปรแกรมบน iOS นั้นจะมีโปรแกรมเพิ่มเติมชื่อว่า OpenEars ของ PolitePix ซึ่งพัฒนามาจาก CMUSphinx มาอีกต่อหนึ่ง สามารถทำได้ทั้ง speech recognition และ text-to-speech synthesis และยังมี plugin เสริมเพื่อเพิ่มประสิทธิภาพของ OpenEars ด้วย ซึ่ง plugin ตัวหนึ่งที่มีคือ Rejecto สามารถปรับค่า thresholding สำหรับการทำ speech recognition ได้ แต่โปรแกรมนี้จะฟรีเฉพาะ OpenEars เท่านั้น plugin ที่เหลือต้องเสียเงินครับ สำหรับรายละเอียดโปรแกรมเพิ่มเติมสามารถอ่านได้ที่ http://www.politepix.com/

ประเด็นที่ 2: การพัฒนาโปรแกรม speech recognition บน Android และ iOS

โมเดลที่ได้จากการทำ training นั้นสามารถนำไปใช้งานบน Android หรือ iOS ได้ครับ โดย iOS นั้นสามารถใช้โปรแกรม OpenEars ช่วยได้ ส่วนบน Android นั้นทาง CMUSphinx ได้ให้รายละเอียดเรื่องของวิธีการทำและมีตัว demo ด้วยครับ ซึ่งในบทความนี้จะขออนุญาตไม่พูดถึงรายละเอียดของการพัฒนาโปรแกรมบนสมาร์ทโฟนนะครับ ซึ่งรายละเอียดของการพัฒนาโปรแกรม speech recognition บน Android และ iOS เพิ่มเติมดูที่ http://cmusphinx.sourceforge.net/wiki/building

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

สำหรับบทความ, tutorial ฉบับเต็ม, FAQ เอกสารประกอบของ PocketSphinx และ Sphinx4 หรือเนื้อหาอื่นๆ เพิ่มเติม สามารถเข้าไปชมได้ที่ลิงก์นี้ครับ http://cmusphinx.sourceforge.net/wiki/ สำหรับฟอรั่มถามตอบสามารถเข้าได้ที่ลิงก์นี้ http://sourceforge.net/p/cmusphinx/discussion/ หากมีข้อสงสัยใดๆ จะถามในคอมเมนต์ได้แต่ผมแนะนำให้ถามในฟอรั่มน่าจะได้คำตอบที่ดีกว่าครับ :)

สุดท้ายนี้ ขอให้สนุกกับการเขียนโปรแกรมครับ

Get latest news from Blognone

Comments

By: panurat2000
ContributorSymbianUbuntuIn Love
on 12 July 2014 - 17:09 #721147
panurat2000's picture

โฟล์เดอร์ => โฟลเดอร์

ปรากฎ => ปรากฏ

By: littletail
ContributorTraineeWindows
on 12 July 2014 - 20:39 #721165 Reply to:721147

แก้แล้วครับ

By: nuntawat
WriterAndroidWindowsIn Love
on 12 July 2014 - 21:09 #721169 Reply to:721165
nuntawat's picture
  • Tutorial สะกดด้วยตัวพิมพ์เล็กทั้งหมด
  • "บทความ Tutorial ฉบับเต็ม FAQ เอกสารประกอบของ PocketSphinx และ Sphinx4 หรือเนื้อหาอื่นๆ เพิ่มเติม" น่าจะใส่ลูกน้ำคั่นระหว่างสิ่งต่างๆ คนละสิ่งกัน อาทิ หาก "บทความ" ไม่เกี่ยวกับ "tutorial" ก็ควรมีลูกน้ำคั่น
By: littletail
ContributorTraineeWindows
on 14 July 2014 - 12:56 #721446 Reply to:721169

แก้แล้วครับ

By: grit
iPhoneWindows PhoneWindows
on 13 July 2014 - 01:40 #721213

เยี่ยมเลยครับ เดี๋ยวจะลองศึกษาดู

By: pasuth73
iPhoneWindows PhoneAndroidUbuntu
on 13 July 2014 - 10:20 #721230

เยี่ยมมากเลยครับอยากลองศึกษาบ้าง แต่ฝั่งไมโครซอฟท์มีบิงอยู่ผมอยากรู้ว่ามันต่างจากมาใช้โปแกรมนี้มากแค่ไหนอะครับ อย่างหนึ่งก็คงจะใช้เน็ตกับไม่ใช้

By: littletail
ContributorTraineeWindows
on 14 July 2014 - 01:57 #721362 Reply to:721230

ผมไม่เคยใช้ Bing แฮะ แต่ที่แน่ๆ คือ PocketSphinx กับ Sphinx4 เป็น open source ใช้ได้กับหลายๆ แพลตฟอร์มครับ ยิ่ง Sphinx4 นี่เป็นภาษาจาวาเลย

By: DailyxDaisy on 22 February 2020 - 14:16 #1148707

มีวิธีที่สามารถนำ PocketSphinx มาบันทึกเสียงเป็นเสียงคำศัพท์ภาษาอังกฤษ มาเปรียบเทียบ เสียงของผู้ใช้ให้ถูกต้องไหมคะ