2. ลึกขึ้นหน่อยสำหรับ Language Model
โดย SpeeChy
บทความที่สองนี้จะว่ากันเรื่องโมเดลภาษา (Language model) ลึกขึ้นอีกหน่อยครับ ขอเรียกมันสั้นๆ ว่า LM ละกัน ท่านใดที่ยัง
ไม่รู้จักว่า LM ทำหน้าที่อะไร ขอให้กลับไปอ่านใน บทความแรก นะครับ ในที่นี้ผมจะขอสรุปกว้างๆ ให้ฟังอีกรอบ LM ทำหน้าที่รับ
Word sequence หรือประโยค W = (w1
wM) เข้ามาแล้วบอกเราว่า W สามารถเกิดได้หรือไม่ อาทิเช่น "จะ ไป" เกิดได้แต่
"ไป จะ" ไม่สามารถเกิดได้ เป็นต้น LM อาจจะบอกเป็นค่าความน่าจะเป็นที่จะเกิด W เรียกความน่าจะเป็นนี้ว่า P(W) เช่นให้ค่า
P(จะ ไป) = 0.8 และ P(ไป จะ) = 0.01
วิธีหลักๆ ในการสร้าง LM มีอยู่สองวิธี ดังนี้ครับ
- Regular grammar
วิธีนี้พูดง่ายๆ คือการเขียนกฎเอง ว่าคำใดต่อด้วยคำใดได้บ้าง ตัวอย่างของการเขียน Grammar วิธีนี้ก็คือที่เราได้ทำไปแล้วใน
Digit sequence recognition ในบทความแรก
- N-gram
คราวนี้ถ้า Recognition task อันนึงมันเกิดยาก ยากเกินกว่าจะมานั่งเขียนกฎได้ครอบคลุมทั้งหมด อาทิเช่น รู้จำคำสั่งในร้านอาหารซักแห่ง
ลูกค้าสามารถพูดได้หลากหลายมากๆ เช่น "ขอกระเพราไก่ไข่ดาวจานนึง" หรือ "มีผัดพริกแกงทะเลไหมครับ แต่กุ้งขอตัวใหญ่ๆ นะ ตัวเล็กไม่เอา"
เราก็จะเปลี่ยนเป็นใช้วิธีทางสถิติซึ่งเป็นที่นิยมในหมู่นักวิจัย ASR เรียกว่า N-gram model
ใน Tutorial อันนี้ ผมจะสร้าง N-gram model สำหรับ Task อันนึงที่ผมไม่สามารถนั่งเขียนกฎด้วยตัวเองได้ Task ที่ว่านี้คือ
การจองโรงแรม (Hotel Reservation Task) จริงๆ การจองโรงแรมคงต้องมีการต่อปากต่อคำกันหลายประโยคนะครับ
กว่าจะตกลงสรุปได้ ในที่นี้ผมขอตัดแค่บางส่วนมาทดลองให้เห็นนะครับ โดยผมตั้งคำถามว่า "กรุณาแจ้งจำนวนผู้เข้าพัก
วันที่เข้าพักและวันที่ออกด้วยครับ" คนที่ตอบกลับมาก็ตอบได้หลากหลายมากๆๆๆๆๆ ตัวอย่างเช่น
  "สองคนค่ะ เข้าวันนี้ ออกวันพรุ่งนี้"
  "มากับเพื่อนอีกคน เช็คอินเสาร์หน้าครับ" (คนนี้ไม่ได้บอกวันที่ออก)
  "มากันทั้งหมดหกคนค่ะ" (คนนี้ตอบแค่จำนวนผู้เข้าพักด้วยซ้ำ)
  "เข้าวันนี้ กะจะอยู่ซักห้าวันค่ำ" (คนนี้ไม่ได้บอกจำนวนผู้เข้าพักด้วย)
  ฯลฯ
หน้าที่ของ ASR คือรู้จำเสียงพูดประโยคพวกนี้ให้ได้ครับ Download thaispeech2 แล้วลองดูตามไปกับ Tutorial นะครับ
ขั้นตอนที่ 1
- ดาวน์โหลด HTK ver 3.2 ขึ้นไป จาก http://htk.eng.cam.ac.uk มา install
ตามขั้นตอนที่สอนในเว็ป ย้ำนะครับว่า 3.2 ขึ้นไป เพราะมันจะมี tool สำหรับทำ Language model
- ตั้ง Path ให้สามารถเรียกคำสั่ง Executable files ของ HTK หาก install ถูกต้อง เมื่อเรียกคำสั่งใดๆ ของ HTK โดยไม่ได้ใส่
Argument ใดๆ โปรแกรมจะแสดง Short help ของคำสั่งนั้นๆ
ขั้นตอนที่ 2
- ดาวน์โหลด Tutorial thaispeech2.tar.gz (20.20 MB)
- Unzip ด้วยคำสั่ง
- prompt> tar -zxf thaispeech2.tar.gz
- ในไดเรคทอรี thaispeech2/ จะประกอบด้วยไดเรคทอรีย่อยดังนี้
| config/ | เก็บไฟล์ที่กำหนดพารามิเตอร์ต่างๆ ในการรู้จำ |
| script/ | เก็บ Script file ที่ใช้สั่งเพื่อเรียนรู้ |
| am/ | เก็บไฟล์โมเดลเสียง (Acoustic model) |
| lm/ | เก็บไฟล์โมเดลภาษา (Language model) เริ่มต้นจะมี Text file ชื่อ hrt.text เป็น Text ที่จะใช้ในการ Train โมเดลภาษา |
| mfc/ | สำหรับเก็บไฟล์ค่าสำคัญของเสียงที่จะรู้จำ (Speech feature) เริ่มต้นจะยังว่างเปล่า |
| wav/ | เก็บไฟล์เสียงที่เป็นตัวอย่างในการเรียนรู้และทดลอง เป็นไฟล์ Windows PCM wav ธรรมดา |
- นอกจากนี้ในไดเรคทอรี thaispeech2/ ยังมีไฟล์ได้แก่
| code.scp | เก็บลิสต์ของไฟล์เสียง .wav คู่กับไฟล์ค่าสำคัญของเสียง .mfc ไฟล์นี้เป็นอินพุตของ code.sh ครับ |
| code.sh | เป็น Script file เพื่อแปลงไฟล์เสียง .wav เป็นไฟล์ .mfc ซึ่งเก็บค่าสำคัญของเสียง |
| train.scp | เก็บลิสต์ไฟล์เสียงที่ใช้ในการเรียนรู้ แต่อยู่ในรูปแบบของไฟล์ .mfc แล้วนะครับ ลองเปิดดู |
| trainam.sh | เป็น Script file สั่งให้ระบบเริ่มเรียนรู้ สร้างโมเดลเสียงที่ใช้ในการรู้จำ |
| trainlm.sh | เป็น Script file สั่งให้ระบบสร้างโมเดลภาษาที่ใช้ในการรู้จำ |
| test.scp | เก็บลิสต์ไฟล์เสียงที่ต้องการจะรู้จำ ในรูปแบบของไฟล์ .mfc |
| recog.sh | อันนี้เป็น Script file สั่งให้ระบบทำการรู้จำครับ |
ขั้นตอนที่ 3
- เริ่มต้น ต้องแปลงไฟล์เสียง .wav เป็นไฟล์ค่าสำคัญ .mfc ก่อน โดยใช้คำสั่งในไดเรคทอรี thaispeech2/
- thaispeech2> code.sh
คำสั่งนี้จะทำการแปลง .wav เป็น .mfc ตามที่ลิสต์ไว้ใน code.scp ครับ ลองดูในไดเรคทอรี thaispeech2/mfc/
จะพบว่ามีไฟล์ .mfc เกิดขึ้นมา
ขั้นตอนที่ 4
- ทำการสร้างโมเดลเสียงที่ใช้ในการรู้จำ โดยใช้คำสั่ง
- thaispeech2> trainam.sh
หลังจากสั่งคำสั่งนี้ ระบบจะนำไฟล์ .mfc ที่ใช้ในการเรียนรู้ (ลิสต์ไว้ใน train.scp) มาสร้างโมเดลเสียง ใช้เวลานาน
พอสมควรขึ้นอยู่กับความเร็วของเครื่องนะครับ หลังจากจบการเรียนรู้ จะพบว่าใน thaispeech2/am/ เกิดไดเรคทอรี
ย่อยขึ้นมากมาย แต่ละไดเรคทอรีเก็บโมเดลเสียงที่ซับซ้อนขึ้นเรื่อยๆ ไดเรคทอรีสุดท้ายคือ
thaispeech2/am/tiehmm2m_3/ จะเก็บโมเดลเสียงอันสุดท้าย (ชื่อว่า newMacros) ใช้ในการรู้จำ
- ภายใน trainam.sh มีคำสั่งย่อยมากมาย เหมือนกับที่ได้อธิบายไว้ในบทแรก
หลักการสร้างโมเดลเสียง ตรงนี้ขอให้พิจารณาข้อแตกต่างระหว่างการสร้างโมเดลเสียงในบทแรกและบทนี้ด้วยนะครับ เพราะเป็นจุดสำคัญ
ในการที่เราจะสร้างระบบใหม่เองในอนาคตข้างหน้า อ่านตรงนี้ครับ ข้อแตกต่างของระบบใน Tutorial 1 & 2
ขั้นตอนที่ 5
- ทำการสร้างโมเดลภาษาที่ใช้ในการเรียนรู้ โดยใช้คำสั่ง
- thaispeech2> trainlm.sh
คำสั่งนี้ จะจัดการ Pre-process text file thaispeech2/lm/hrt.text และนำไป Train โมเดลภาษาซึ่งท้ายสุดก็คือ
ไฟล์ thaispeech2/lm/hrt.2/hrt_en.wdnet
- รายละเอียดขั้นตอนการ Train โมเดลภาษาแบบ N-gram ดูใน การสร้าง N-gram model ครับ
ขั้นตอนที่ 6
- ในการรู้จำก็ง่ายๆ ครับ ในไดเรคทอรี thaispeech2/ ใช้คำสั่ง
- thaispeech2> recog.sh
ระบบจะทำรับเอาไฟล์ .mfc ที่ลิสไว้ใน test.scp มาทำการรู้จำทีละไฟล์ละเก็บผลการรู้จำไว้ในไฟล์ output.mlf ที่
สร้างขึ้นใหม่ในไดเรคทอรีเดียวกัน เปิดดู output.mlf ครับ เป็น ASCII text ธรรมดา แสดงผลการรู้จำแต่ละไฟล์ น่า
เสียดายที่ HTK ไม่สามารถแสดงผลเป็นภาษาไทยได้ ผมเลยสร้างระบบให้จัดการทุกอย่างเป็น English alphabet
โดย map คำภาษาไทยเป็นคำภาษาอังกฤษก่อนที่จะสร้างโมเดลภาษาและโมเดลเสียง ผลที่เห็นใน output.mlf อยากรู้
ว่าได้เป็นประโยคว่าอย่างไร ให้ดูเทียบกับ Map table ในไฟล์ config/hrt_th2en.table
เมื่อทดลองจบเป็นที่เรียบร้อยแล้ว เราลองมาดู หลักการทำงานของ N-gram model
รวมทั้ง การสร้าง N-gram model กันต่อเลยครับ
ขอย้ำอีกรอบนะครับ ท่านที่ยังไม่เข้าใจหลักการรู้จำเสียง ควรกลับไปอ่านในบทความแรกก่อน ก็จะเข้าใจขั้นตอนต่างๆ ได้ดีขึ้นครับ
เมื่อมีประโยค W = (w1 ... wM) มาให้ N-gram model จะคำนวณค่าความน่าจะเป็นของการเกิดคำใดๆ โดยพิจารณาจาก N-1
คำก่อนหน้า อาทิเช่น N = 2 ซึ่งเรียกว่า Bigram หรือ 2-gram นั้น จะให้ค่าความน่าจะเป็นของ คำใดๆ โดยดูจาก คำก่อนหน้ามันเพียงคำเดียว
เรามักจะเขียนค่าความน่าจะเป็นนี้ในรูปของ P(w2|w1) ซึ่งหมายถึงความน่าจะเป็นที่คำ w2 จะเกิดตามหลังคำ w1 อาทิเช่น
| P(ไป|จะ) = 0.8 | P(จะ|ไป) = 0.01 | P(จะ|ผม) = 0.7 |
| P(ตลาด|ไป) = 0.5 | P(โรงเรียน|ไป) = 0.6 | P(ผม|ไป) = 0.02 |
คราวนี้ เวลามีประโยคยาวๆ W = (w1 ... wM) มาซักประโยคนึง เช่น "ผม จะ ไป โรงเรียน" ค่าความน่าจะเป็นที่จะเกิดประโยคดังกล่าวก็สามารถ
คำนวณได้โดยการคูณต่อๆ กันไปดังนี้
| P(ผม จะ ไป โรงเรียน) | = P(จะ|ผม).P(ไป|จะ).P(โรงเรียน|ไป) |
|   | = (0.7)(0.8)(0.6) |
|   | = 0.336 |
| P(จะ ไป ผม จะ) | = P(ไป|จะ).P(ผม|ไป).P(จะ|ผม) |
|   | = (0.8)(0.02)(0.7) |
|   | = 0.0112 |
เห็นกันจะๆ นะครับว่า "จะ ไป ผม จะ" มีโอกาสเกิดต่ำมากเมื่อเทียบกับ "ผม จะ ไป โรงเรียน" ในทำนองเดียวกัน เราสามารถสร้าง 3-gram
(Trigram) model โดยที่กำหนดค่าความน่าจะเป็นของแต่ละคำ โดยพิจารณาจากคำก่อนหน้า 2 คำ อาทิเช่น
| P(ผม จะ ไป โรงเรียน) | = P(จะ|ผม).P(ไป|ผม จะ).P(โรงเรียน|จะ ไป) |
เพราะฉะนั้นสำหรับ N-gram model สิ่งที่จะต้องคำนวณเตรียมเอาไว้ก็คือ P(w2|w1) สำหรับ 2-gram หรือ P(w3|w1,w2) สำหรับ 3-gram
ในที่นี่จะขออธิบายต่อไปในกรณี 2-gram เท่านั้นนะครับ ค่าความน่าจะเป็น P(w2|w1) Train ได้ด้วย Training text ดังสมการนี้
| P(w2|w1) = c(w1,w2)/c(w1) | (1) |
c(w1,w2) คือจำนวนครั้งใน Training text ที่เกิด w1 คู่กับ w2 และ c(w1) ก็คือจำนวนครั้งที่เกิด w1
คราวนี้ลองคิดภาพครับว่า เอาแค่กรณี 2-gram ก็เป็นไปไม่ได้แล้ว ที่ Training text จะมีคำเกิดขึ้นครบทุกคู่ให้คำนวณค่า 2-gram
และถ้าคำคู่ไหนไม่เกิดขึ้นใน Training text เช่น c(ไป,โรงเรียน) = 0 ก็จะทำให้ P(โรงเรียน|ไป) = 0 และ P(ผม จะ ไป โรงเรียน) ก็จะเท่ากับ 0 เลย
อันนี้ยอมไม่ได้ครับ เพราะปัญหามันแค่ว่าใน Training text ไม่มีให้เห็นเท่านั้น ไม่ใช่ว่าไม่มีโอกาสเกิดเลยซะหน่อย ดังนั้น เราต้องทำการให้ค่า
ความน่าจะเป็นแกคำคู่ที่ไม่เกิดขึ้นใน Training text ทุกคู่ เราเรียกการเพิ่มค่า Prob ให้กับ unseen N-gram ว่าการ Smoothing วิธีการ
Smooting มีนักวิจัยเสนอกันมาหลากหลายวิธีมากครับ วิธีง่ายๆ ก็แค่เพิ่ม c(w1,w2) จาก 0 เป็น 1 สำหรับคำคู่ใดๆ ที่ไม่มีใน Training text
เขาเรียกวิธีนี้ว่า Additive smooting แต่ที่นิยมกว่าเรียกว่า Back-off smoothing วิธีการนี้จะคำนวณค่า P(w2|w1) สำหรับคู่ (w1,w2) ใดๆ ดังนี้
| P(w2|w1) | = P(w2|w1) ถ้า c(w1,w2) > 0 |   |
|   | = B(w1).P(w2) ถ้า c(w1,w2) = 0 | (2) |
ซึ่งหมายความว่า ถ้ามีคู่ (w1,w2) เกิดขึ้นใน Training set แล้วล่ะก็ จะได้ P(w2|w1) ตามสมการที่ 1 และถ้าไม่มี ก็จะคำนวณได้จากผลคูณของ
B(w1) กับ P(w2) โดยที่ P(w2) คือ 1-gram (Unigram) probability คำนวณได้โดย
c(w2) คือจำนวนครั้งที่เกิด w2 ขึ้น และ C คือจำนวนคำทั้งหมดใน Training text ส่วน B(w1) เราเรียกว่า Back-off weight ซึ่งมีสมการ
คำนวณยุ่งยากอยู่พอสมควรขึ้นกับ Algorithm ที่เลือกใช้ใน Back-off smoothing อาทิเช่นวิธี Good-Turing ในที่นี้จะยังไม่ขออธิบาย
สมการที่มาของ B(w2) ขอให้สังเกตเพียงแค่ว่า เมื่อไม่มี 2-gram ใน Training text แล้ว Back-off smoothing จะถอยกลับไปใช้ 1-gram
แทน (ถึงได้เรียกว่า Back-off ไงครับ)
คราวนี้หลังจาก Run Tutorial thaispeech2 เสร็จแล้ว ลองเปิดดูไฟล์ thaispeech2/lm/hrt.2/hrt_en.2gram ซึ่งเป็นไฟล์โมเดล
ภาษาแบบ 2-gram ในรูปแบบที่กำหนดโดย ARPA USA. จะพบว่าหน้าตาประมาณนี้

รูปที่ 1 ARPA 2-gram model
หมายเหตุนิดนึงครับว่า ค่า P(w), B(w), และ P(w2|w1) ใน ARPA model จะเป็นค่าที่ Take log ฐาน 10 เพราะว่าค่า Prob จริงๆ
มันต่ำมาก เวลาคำนวณจริงใน Recognizer มันจะคูณกันและต่ำลงไปอีกจนหายไปเลย ดังนั้นเวลาคำนวณจริง จะใช้ค่า log10 นี่แหละครับ
N-gram เนี่ย สามารถ Train ได้จากฐานข้อมูล Text ครับ แต่ต้องเป็น Text ที่ตัดเป็นคำๆ ต่อๆ กันแล้ว (ดูตัวอย่างได้ใน thaispeech2/lm/hrt.text)
สำหรับ Text ภาษาไทย ก็มีปัญหาที่จะต้องจัดการก่อน 2 อย่างครับ
อย่างแรก Text ภาษาไทย ไม่มีการตัดเป็นคำๆ ไว้ก่อน อันนี้เป็นประเด็นปัญหาพื้นฐานของภาษาไทย กับอีกหลายๆ ภาษาที่เวลาเขียน ไม่มีช่องระหว่างคำ
ของไทยยากเข้าไปอีกที่ไม่มีเครื่องหมายบอกว่าจบประโยคอีก แต่อย่างไรก็ตาม การ Preprocess text ให้เป็นแบบใน file hrt.text นั้น ก็มีวิธีไม่ยาก
(แต่ถึกพอควร) ดังนี้ครับ
- ตัด Text ทั้งยวงให้เป็นประโยคๆ แบบคร่าวๆ คือไม่จำเป็นต้องแบ่งเป็นประโยคเป๊ะๆ ตามภาษาศาสตร์ อาจใช้ space เป็นตัวช่วยแบ่งได้
โดยกำหนดให้ความยาวประโยคไม่เกินขนาดหนึ่ง
- ภาษาไทยเรามี Tool ช่วยในการตัดคำอยู่บางตัวครับ ในที่นี้ขอแนะนำ
SWATH พัฒนาโดยคุณไพศาล เจริญพรสวัสดิ์ ก็ไป Download มาตัดประโยคเป็นคำๆ ต่อๆ กัน
- ตัวตัดคำจะยังมี Error เกิดขึ้นเสมอ ก็ต้องนั่งแก้คำที่ตัดผิดเอง ตรงนี้แหละครับที่ว่าถึก
อย่างที่สอง HTK (version 3.2) ไม่สามารถ process ภาษาไทยได้ในบางกรณี เพื่อตัดปัญหา เราจะทำการ Map คำไทย ไปเป็นคำที่ใช้
English alphabet ก่อน โดยอาศัย Table ที่ต้องสร้างขึ้นมาเอง ใน Tutorial เราสร้างไว้ให้แล้วในไฟล์ thaispeech2/config/hrt_th2en.table
ซึ่งจะประกอบด้วยคู่คำไทยกับคำแทนมันในภาษาอังกฤษ เราใช้รูปแบบง่ายๆ เลยครับ w001, w002, .. นอกจากนี้ใน HTK ต้องการสัญลักษณ์พิเศษปิดหัวท้าย
ประโยคด้วย เพื่อบอกว่านี่คือต้นประโยค นี่คือจบประโยค เราใช้คำที่เป็น Default ของ HTK เลยครับ คือ !ENTER กับ !EXIT
ขั้นตอนการสร้าง N-gram ใน Tutorial (ดูใน thaispeech2/trainlm.sh) จะเริ่มตั้งแต่ขั้นตอนที่มี Training text hrt.text เป็นภาษาไทย
ที่ตัดแบ่งคำเรียบร้อยแล้ว ดังต่อไปนี้ครับ
- แปลง hrt.text เป็น hrt_en.text ด้วย Script file ชื่อ engtext.pl อันนี้จะทำการแปลง Text ไทยเป็นอังกฤษตาม Table ที่กำหนดใน
config/hrt_th2en.table พร้อมทั้งเติม !ENTER และ !EXIT หัวท้ายประโยค
>script/engtext.pl config/hrt_th2en.table lm/hrt.text > lm/hrt_en.text
- เข้าสู่ขั้นตอนการสร้าง N-gram ตามขั้นตอนที่ให้ไว้ใน HTK โดยทำตาม Command ต่อไปนี้
> mkdir hrt.0
> LNewMap -f WFC HRT empty.wmap
> LGPrep -T 1 -a 100000 -b 200000 -d hrt.0 -n 2 -s "HRT" empty.wmap hrt_en.text
> mkdir hrt.1
> LGCopy -T 1 -b 200000 -d hrt.1 hrt.0/wmap hrt.0/gram.0
> mkdir hrt.2
> LBuild -T 1 -c 2 2 -n 2 -f TEXT hrt.0/wmap hrt.2/hrt_en.2gram hrt.1/data.0
เท่านี้ก็จะได้ lm/hrt.2/hrt_en.2-gram เป็น 2-gram file ในรูปแบบของ ARPA
- เนื่องจากในขั้นตอน Recognize เราจะใช้ HVite ใน HTK เป็นตัว Recognizer (เช่นเดียวกับที่ใช้ใน Tutorial แรก) ตัว HVite นี้
จะรับ LM แบบ Word network (ดังเช่น dgs.wdnet ใน Tutorial แรก) เราจึงต้องแปลง hrt_en.2gram เป็น hrt_en.wdnet โดยใช้คำสั่งใน
HTK ดังนี้
>HBuild -n lm/hrt.2/hrt_en.2gram config/hrt_en.vocab lm/hrt.2/hrt_en.wdnet
คำสั่ง HBuild นี้ต้องการ List ของ Vocabulary ที่มีใน hrt_en.2gram ด้วย อันนี้เราต้องสร้างเอง ก็คือไฟล์
config/hrt_en.vocab เมื่อ Run HBuild เราจะได้ไฟล์ lm/hrt.2/hrt_en.wdnet ซึ่งจะเอาไปใช้กับ HVite
recognizer เป็นอันจบขั้นตอนการเตรียม LM
ตรงนี้ผมอยากดึงเอาจุดสำคัญๆ ในการสร้างระบบ Recognizer ใน Domain ใหม่ๆ มาชี้ให้ดูว่ามันมีอะไรที่ต้องเตรียมใหม่บ้าง
แล้วก็มีอะไรที่เหมือนกันในทุกๆ ระบบ โดยจะเปรียบเทียบระหว่างสองระบบ
- Dgs: Digit sequence recognition ใน Tutorial 1
- Hrt: Hotel reservation recognition ใน Tutorial 2
สิ่งที่แตกต่างกันได้แก่
- Language model
Dgs ใช้ LM ที่สร้างโดย Regular grammar (เขียนกฏเองใน dgs.gram) ส่วน Hrt ใช้ LM แบบ 2-gram ที่สร้างโดย Train จาก
Training text (hrt_en.2gram) เพียงแต่ทั้งสองกรณี จะต้องแปลง .gram หรือ .2gram เป็น .wdnet ทั้งคู่ เพื่อใช้กับ HVite
- Dictionary
เราต้องเตรียม Dictionary ให้สอดคล้องกับคำที่มีใน LM กล่าวคือ คำศัพท์ใน Dgs ประกอบด้วย ตัวเลข 10 ตัว (ดูใน
dgs.dict) แต่ Hrt มีคำศัพท์ทั้งหมด 210 ตัว (ใน hrt_en.dict) อันนี้ต้องเตรียมเองก่อนจะ Train โมเดลเสียงครับ
- Monophone.list
และเมื่อคำศัพท์ที่มีใน Dictionary ต่างกัน จำนวน monophone ที่ต้องสร้างใน monophone.list ก็ต่างกันด้วย
และสำคัญมากๆ คือ Wav file ที่ใช้ในการ Train โมเดลเสียง (ใน /wav/train) ต้องครอบคลุม monophone ที่
ต้องสร้างด้วย พูดง่ายๆ คือ ทุก monophone ใน monophone.list ต้องมีใน Training wav อย่างน้อย 1 ครั้ง
ในทางกลับกัน monophone.list ก็ต้องมีทุก monophone ที่มีใน Training wav ด้วยเช่นกัน
- Monophone.mlf
เมื่อ Training wav ต่างกันในแต่ละระบบ monophone.mlf ก็ต้องเตรียมให้สอดคล้องด้วย
- Fulltri.sh
ในการสร้างโมเดลเสียงในสองระบบที่ผ่านมา คำศัพท์ต่างกัน จำนวนต่างกัน monophone.list ต่างกัน
monophone.mlf ก็ต่างกัน เมื่อจะเอามาทำ tied-state จะต้องสร้าง config/triphn-full.list ก็จะมีจำนวนไม่
เท่ากัน ในกรณี Hrt นี้ เราได้สร้าง perl command ชื่อ genfulltri.pl ซึ่งเป็น tool สำหรับสร้าง Full triphone
list ให้ครอบคลุมทุกกรณีที่เกิดขึ้นได้ในการ Recognize ให้ดูการใช้งานได้ใน script/fulltri.sh
ทั้งหมดนี้แหละครับคือสิ่งที่ต้องเตรียม ที่แตกต่างกันไปในแต่ละ Task ที่จะสร้าง แท้จริงแล้วหากเราสามารถสร้างโมเดลเสียงให้ครอบคลุมทุก
Triphone ที่เกิดขึ้นได้ในภาษาไทย (Generalized acoustic model) เราก็ไม่จำเป็นจะต้องมาสร้างโมเดลเสียงสำหรับแต่ละระบบอีกแล้ว
เพียงแค่สร้างโมเดลภาษาเท่านั้นพอ หากแต่ว่าการสร้าง Generalized acoustic model ต้องการไฟล์เสียงจำนวนมากๆๆๆๆๆ เพื่อให้ครอบ
คลุมทุกกรณีที่เป็นไปได้ และในแต่ละ Triphone มีจำนวนมากพอที่จะสร้าง HMM ที่ดีได้ ตรงนี้ทางผู้เขียนกำลังพยายามอยู่ครับ คาดว่าอีกไม่นาน
จะมีให้มาใช้กัน
Copyright (c) 2004 Chai Wutiwiwatchai, Thai Speech Group
|