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 มีอยู่สองวิธี ดังนี้ครับ

  1. Regular grammar
    วิธีนี้พูดง่ายๆ คือการเขียนกฎเอง ว่าคำใดต่อด้วยคำใดได้บ้าง ตัวอย่างของการเขียน Grammar วิธีนี้ก็คือที่เราได้ทำไปแล้วใน Digit sequence recognition ในบทความแรก
  2. 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 กันต่อเลยครับ ขอย้ำอีกรอบนะครับ ท่านที่ยังไม่เข้าใจหลักการรู้จำเสียง ควรกลับไปอ่านในบทความแรกก่อน ก็จะเข้าใจขั้นตอนต่างๆ ได้ดีขึ้นครับ


หลักการทำงานของ N-gram model

เมื่อมีประโยค W = (w1 ... wM) มาให้ N-gram model จะคำนวณค่าความน่าจะเป็นของการเกิดคำใดๆ โดยพิจารณาจาก N-1 คำก่อนหน้า อาทิเช่น N = 2 ซึ่งเรียกว่า Bigram หรือ 2-gram นั้น จะให้ค่าความน่าจะเป็นของ คำใดๆ โดยดูจาก คำก่อนหน้ามันเพียงคำเดียว เรามักจะเขียนค่าความน่าจะเป็นนี้ในรูปของ P(w2|w1) ซึ่งหมายถึงความน่าจะเป็นที่คำ w2 จะเกิดตามหลังคำ w1 อาทิเช่น

P(ไป|จะ) = 0.8P(จะ|ไป) = 0.01P(จะ|ผม) = 0.7
P(ตลาด|ไป) = 0.5P(โรงเรียน|ไป) = 0.6P(ผม|ไป) = 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 คำนวณได้โดย

P(w2) = c(w2)/C(3)

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 model

N-gram เนี่ย สามารถ Train ได้จากฐานข้อมูล Text ครับ แต่ต้องเป็น Text ที่ตัดเป็นคำๆ ต่อๆ กันแล้ว (ดูตัวอย่างได้ใน thaispeech2/lm/hrt.text) สำหรับ Text ภาษาไทย ก็มีปัญหาที่จะต้องจัดการก่อน 2 อย่างครับ

อย่างแรก Text ภาษาไทย ไม่มีการตัดเป็นคำๆ ไว้ก่อน อันนี้เป็นประเด็นปัญหาพื้นฐานของภาษาไทย กับอีกหลายๆ ภาษาที่เวลาเขียน ไม่มีช่องระหว่างคำ ของไทยยากเข้าไปอีกที่ไม่มีเครื่องหมายบอกว่าจบประโยคอีก แต่อย่างไรก็ตาม การ Preprocess text ให้เป็นแบบใน file hrt.text นั้น ก็มีวิธีไม่ยาก (แต่ถึกพอควร) ดังนี้ครับ

  1. ตัด Text ทั้งยวงให้เป็นประโยคๆ แบบคร่าวๆ คือไม่จำเป็นต้องแบ่งเป็นประโยคเป๊ะๆ ตามภาษาศาสตร์ อาจใช้ space เป็นตัวช่วยแบ่งได้ โดยกำหนดให้ความยาวประโยคไม่เกินขนาดหนึ่ง
  2. ภาษาไทยเรามี Tool ช่วยในการตัดคำอยู่บางตัวครับ ในที่นี้ขอแนะนำ SWATH พัฒนาโดยคุณไพศาล เจริญพรสวัสดิ์ ก็ไป Download มาตัดประโยคเป็นคำๆ ต่อๆ กัน
  3. ตัวตัดคำจะยังมี 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 เป็นภาษาไทย ที่ตัดแบ่งคำเรียบร้อยแล้ว ดังต่อไปนี้ครับ

  1. แปลง 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

  2. เข้าสู่ขั้นตอนการสร้าง 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


  3. เนื่องจากในขั้นตอน 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


ข้อแตกต่างของระบบใน Tutorial 1 & 2

ตรงนี้ผมอยากดึงเอาจุดสำคัญๆ ในการสร้างระบบ Recognizer ใน Domain ใหม่ๆ มาชี้ให้ดูว่ามันมีอะไรที่ต้องเตรียมใหม่บ้าง แล้วก็มีอะไรที่เหมือนกันในทุกๆ ระบบ โดยจะเปรียบเทียบระหว่างสองระบบ
  • Dgs: Digit sequence recognition ใน Tutorial 1
  • Hrt: Hotel reservation recognition ใน Tutorial 2

สิ่งที่แตกต่างกันได้แก่

  1. Language model
    Dgs ใช้ LM ที่สร้างโดย Regular grammar (เขียนกฏเองใน dgs.gram) ส่วน Hrt ใช้ LM แบบ 2-gram ที่สร้างโดย Train จาก Training text (hrt_en.2gram) เพียงแต่ทั้งสองกรณี จะต้องแปลง .gram หรือ .2gram เป็น .wdnet ทั้งคู่ เพื่อใช้กับ HVite


  2. Dictionary
    เราต้องเตรียม Dictionary ให้สอดคล้องกับคำที่มีใน LM กล่าวคือ คำศัพท์ใน Dgs ประกอบด้วย ตัวเลข 10 ตัว (ดูใน dgs.dict) แต่ Hrt มีคำศัพท์ทั้งหมด 210 ตัว (ใน hrt_en.dict) อันนี้ต้องเตรียมเองก่อนจะ Train โมเดลเสียงครับ


  3. Monophone.list
    และเมื่อคำศัพท์ที่มีใน Dictionary ต่างกัน จำนวน monophone ที่ต้องสร้างใน monophone.list ก็ต่างกันด้วย และสำคัญมากๆ คือ Wav file ที่ใช้ในการ Train โมเดลเสียง (ใน /wav/train) ต้องครอบคลุม monophone ที่ ต้องสร้างด้วย พูดง่ายๆ คือ ทุก monophone ใน monophone.list ต้องมีใน Training wav อย่างน้อย 1 ครั้ง ในทางกลับกัน monophone.list ก็ต้องมีทุก monophone ที่มีใน Training wav ด้วยเช่นกัน


  4. Monophone.mlf
    เมื่อ Training wav ต่างกันในแต่ละระบบ monophone.mlf ก็ต้องเตรียมให้สอดคล้องด้วย


  5. 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