- ได้ลองสร้าง โมเดลเสียงแบบ CTC ขนาด 9M พารามิเตอร์ ที่ฝึกด้วย ข้อมูลเสียงราว 300 ชั่วโมง เพื่อช่วยฝึกการออกเสียงและวรรณยุกต์ภาษาจีน
- ใช้สถาปัตยกรรม Conformer encoder เพื่อจับทั้งลักษณะเสียงเฉพาะจุดและบริบทโดยรวม พร้อม การทำโทเคนเป็นหน่วย Pinyin+วรรณยุกต์ เพื่อแยกข้อผิดพลาดด้านการออกเสียงได้อย่างชัดเจน
- ใช้ CTC loss เพื่อประเมินสิ่งที่ผู้ใช้พูดจริงในระดับเฟรม และทำ time alignment ด้วย อัลกอริทึม Viterbi
- แม้ลดขนาดโมเดลจาก 75M → 9M ก็แทบ ไม่สูญเสียความแม่นยำ และหลังทำ quantization แบบ INT8 แล้วมีขนาดเพียงราว 11MB จึงรันบนเว็บเบราว์เซอร์ได้ทันที
- เดโมบนเบราว์เซอร์แสดงให้เห็นถึง ศักยภาพของระบบแก้ไขการออกเสียงแบบ on-device และการปรับปรุงคุณภาพข้อมูลจะเป็นกุญแจสำคัญต่อการเพิ่มประสิทธิภาพในอนาคต
ภาพรวมของโมเดลประเมินการออกเสียง
- เพื่อแก้ปัญหาความยากในการเรียนการออกเสียงภาษาจีน จึงได้ฝึก โมเดลเสียงขนาดเล็กสำหรับให้คะแนนการออกเสียง ขึ้นมาเอง
- ใช้ข้อมูลเสียงที่มีทรานสคริปต์ราว 300 ชั่วโมง (AISHELL-1, Primewords)
- ให้ใช้งานได้ในรูปแบบที่รันบนเบราว์เซอร์ได้โดยตรง
- วิธี แสดงภาพ pitch แบบเดิม มีความไม่เสถียรจากสัญญาณรบกวนและความแตกต่างของการพูด จึงพบว่าแนวทางที่อิงข้อมูลมีประสิทธิภาพกว่า
- เป้าหมายคือการสร้างระบบ Computer-Assisted Pronunciation Training (CAPT) แบบ on-device โดยไม่ต้องพึ่ง commercial API
โครงสร้างโมเดลและวิธีการฝึก
- เลือกใช้โครงสร้าง Conformer encoder + CTC loss
- CNN จับลักษณะอะคูสติกในช่วงเวลาสั้น ๆ (เช่น zh vs z)
- Transformer จัดการรูปแบบวรรณยุกต์ตามบริบท (เช่น tone sandhi)
- วิธีแบบ CTC จะส่งออกการกระจายความน่าจะเป็นรายเฟรม เพื่อประเมินหน่วยเสียงที่ออกเสียงจริงได้โดยตรง
- ใช้โทเคน `` เพื่อจัดแนวการซ้ำและช่องว่าง
- สะท้อนสิ่งที่ออกเสียงจริงโดยไม่แก้อัตโนมัติ
การทำโทเคนและการจัดแนว
- กำหนด ชุด Pinyin+วรรณยุกต์ เป็นหนึ่งโทเคน
- ตัวอย่าง:
zhong1 และ zhong4 เป็นคนละโทเคน
- วรรณยุกต์เบาใช้ tone 5 (
ma5) ให้เป็นมาตรฐานเดียวกัน
- รวมทั้งหมด 1,254 โทเคน +
,
- ใช้ อัลกอริทึม Viterbi คำนวณเส้นทางที่เหมาะที่สุดระหว่างเฟรมเสียงกับโทเคน
- ตัวอย่าง: เมื่อออกเสียง “Nǐ hǎo” จะแยกช่วง
ni3 และ hao3 ออกจากกัน
การทำโมเดลให้เบาและประสิทธิภาพ
- ย่อจากโมเดลเริ่มต้น 75M พารามิเตอร์ลงมาเหลือ 9M
- 75M: TER 4.83%, Tone Accuracy 98.47%
- 9M: TER 5.27%, Tone Accuracy 98.29%
- การสูญเสียความแม่นยำมีน้อยมาก ชี้ว่าปัญหานี้เป็นงานที่ ขึ้นกับข้อมูลเป็นหลัก (data-bound)
- ย่อโมเดล FP32 (37MB) ลงเหลือ 11MB ด้วย INT8 quantization
- โหลดบนเบราว์เซอร์ได้ทันทีผ่าน
onnxruntime-web
ข้อผิดพลาดในการจัดแนวและการแก้ไข
- พบปัญหาที่ ช่วงเงียบ บิดเบือนการประเมินการออกเสียง
- ตัวอย่าง: หากมีความเงียบ 1 วินาทีก่อนออกเสียง “我喜欢…” ระบบจะจัดแนวผิดไปที่
wo3 และให้ 0 คะแนน
- วิธีแก้: ไม่นำเฟรมที่เป็นความเงียบมาคิดคะแนน
- กรองเฟรมที่มีความน่าจะเป็นของ `` ตั้งแต่ 0.7 ขึ้นไป
- หลังแก้แล้วคะแนนความเชื่อมั่นของพยางค์แรกดีขึ้นจาก 0.0 → 0.99
ผลลัพธ์และข้อจำกัด
- ระหว่างเบต้าเทสต์สามารถสัมผัสได้ถึงผลของการแก้ไขการออกเสียง
- โมเดลให้คะแนนอย่างเข้มงวดมาก
- เสียงเจ้าของภาษาและเสียงเด็ก มีความแม่นยำลดลง
- ข้อมูล AISHELL ส่วนใหญ่เป็นเสียงอ่านออกเสียง จึงมีความต่างด้านความเร็วและน้ำเสียง
- ในอนาคตจำเป็นต้องเพิ่ม ข้อมูลภาษาพูด เช่น Common Voice
- เว็บเดโมมีขนาดราว 13MB และให้ความสามารถแก้ไขการออกเสียงแบบครบถ้วนได้ในขนาดที่ เบากว่าเว็บไซต์ส่วนใหญ่
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ขอบคุณสำหรับโปรเจ็กต์ที่เจ๋งมาก
แต่รู้สึกแปลกที่ในประโยค “我想学中文” ระบบ รับรู้ “wén” เป็น “guó”
ดูเหมือนว่านี่เป็นผลจากการที่โมเดลเรียนรู้ โครงสร้างของคำมากกว่าวรรณยุกต์ น่าจะเกิดอคติเพราะ “Zhōng guó” ปรากฏบ่อยในข้อมูลฝึก
อย่างที่เขียนไว้ในบล็อก ดูเหมือนว่านี่ไม่ใช่ “โมเดลที่บอกว่าฉันออกเสียงอะไรจริง ๆ” แต่เป็นโครงสร้างที่ แมป ไปยังพยางค์ที่ใกล้ที่สุดจาก 1254 พยางค์ที่เป็นไปได้
ถึงอย่างนั้นก็ชอบแนวทางการเรียนรู้แบบ เน้นเสียงพูด นี้มาก การเรียนแบบอิงตัวอักษรทำให้สับสนเพราะระบบเขียนของแต่ละประเทศต่างกัน สำหรับผู้เริ่มต้น แม้แต่ pinyin ก็ยังมีสัญลักษณ์ที่ชวนงงหลายอย่าง
ไอเดียและ UI ดูเข้าใจง่ายจนน่าประทับใจ
แต่แม้แต่ผมซึ่งเป็นคนปักกิ่งและ พูดภาษาจีนมาตรฐานได้อย่างสมบูรณ์แบบ ก็ยังผ่านข้อที่ง่ายได้ยาก
ในตัวอย่าง “你好吃饭了吗” การตรวจจับวรรณยุกต์ผิด และ “了” ตามบริบทควรเป็น “le” ไม่ใช่ “liǎo”
มีหลายความเห็นที่กังวลเรื่องวรรณยุกต์ แต่ในความเป็นจริง ต่อให้วรรณยุกต์ไม่เป๊ะก็ไม่ได้ทำให้สื่อสารมีปัญหามากนัก
แต่ละพื้นที่มีสำเนียงต่างกัน ต่อให้วรรณยุกต์ปนกันคนก็ยังเข้าใจกันได้ อย่ายึดติดกับวรรณยุกต์มากเกินไป และขอแนะนำการเรียนแบบ ยึดบริบทเป็นหลัก
ถึงสำเนียงท้องถิ่นจะต่างกัน แต่ที่คนยังสื่อสารกันได้เป็นเพราะ 1) ความต่างของวรรณยุกต์ระหว่างพื้นที่ใกล้เคียงไม่มาก และ 2) ถ้าคุยกันไม่รู้เรื่องก็จะสลับไปใช้ ภาษามาตรฐาน (Putonghua)
เหตุผลที่ภาษาจีนดำรงอยู่ได้ก็เพราะระบบวรรณยุกต์นี่เอง ถ้าวรรณยุกต์ผิด การสื่อสารแทบจะเป็นไปไม่ได้
อย่างไรก็ตาม หนึ่งในเหตุผลที่จีนสื่อสารด้วยตัวอักษรเป็นหลัก ก็เพราะแต่ละพื้นที่มีการออกเสียงและวรรณยุกต์ต่างกัน จน พึ่งเสียงพูดอย่างเดียวไม่ได้
การสร้างแรงจูงใจให้มองข้ามวรรณยุกต์เป็นเรื่องอันตราย ถ้าวรรณยุกต์ไม่สำคัญจริง มันคงหายไปนานแล้ว
ถ้าบริบทแคบก็จะสับสนได้ง่าย ดังนั้นวรรณยุกต์ยังคงเป็นแกนสำคัญ อีกทั้งยังต้องเสริมข้อมูลเพิ่ม เพราะระบบยังรับรู้ “吃” เป็น “shi2” เป็นต้น
ในฐานะผู้เรียนระดับกลาง ผมถึงกับสร้างบัญชีใหม่เพื่อฝากฟีดแบ็ก
ถ้าพูดเร็ว ระบบจะตามหน่วยเสียงไม่ทันและตรวจวรรณยุกต์คลาดเคลื่อน
ตัวอย่างเช่น ถ้าพูด “他是我的朋友” ด้วยความเร็วธรรมชาติ ระบบจะรับ “我” เป็น “de” หรืออ่าน “是” เป็น “si”
แต่ถ้าพูดช้า ๆ ชัด ๆ จะตรวจได้ถูกต้อง
ควรคำนึงถึงปรากฏการณ์อย่าง การเปลี่ยนวรรณยุกต์ของเสียงสามต่อเนื่อง (tone sandhi) ด้วย จำเป็นต้องมีความสามารถในการจัดการการออกเสียงในบทสนทนาธรรมชาติ
สำหรับคนที่พูดภาษาในยุโรป การเรียนภาษาจีนหรือ ภาษาที่มีวรรณยุกต์ อื่น ๆ นั้นยากมาก
หูไม่คุ้นกับวรรณยุกต์ ทำให้คิดว่าตัวเองพูดถูกแล้ว แต่เจ้าของภาษาฟังไม่ออก
ภาษาอังกฤษมีสระที่ต่างกันไปตามภูมิภาค และแยกความต่างอย่าง “done vs down”, “beat vs bit” ได้ยาก
ตรงกันข้าม ภาษาสเปนมีระบบสระเรียบง่าย เลยเรียนง่ายกว่ามาก
ตอนเรียน pitch accent ของภาษาญี่ปุ่น ตอนแรกผมก็ไม่ได้ยินความต่างอะไรเลย แต่พอฝึกซ้ำ ๆ ก็เริ่มจับได้
พอได้ตระหนักว่าภาษาอังกฤษเองก็มีรูปแบบระดับเสียงอย่างคำว่า “uh-oh” ก็เริ่มจับทางได้
โดยเฉพาะนิสัยการใช้น้ำเสียงแบบอังกฤษเพื่อ แสดงความไม่แน่ใจ นี่แหละที่เป็นปัญหา
วรรณยุกต์กับไวยากรณ์เป็นพื้นฐานที่ต้องเก็บให้ได้ช่วงต้น หลังจากนั้นอีกหลายปี ความพยายามส่วนใหญ่จะไปอยู่ที่การท่องคำศัพท์
ความยากที่แท้จริงของภาษาจีนคือ การขาดคำศัพท์ร่วมกับภาษาอื่น และ ระบบอักษรที่ไม่อิงหน่วยเสียง
มันทำงานได้ดีเฉพาะตอนพูดเป็นคำ ๆ แต่พอเป็นระดับประโยคหรือความเร็วธรรมชาติจะมี การรับรู้ผิดเยอะ
ผมเป็นเจ้าของภาษาที่มี ใบรับรองภาษามาตรฐานระดับ 2A แต่ถ้าพูดแบบสบาย ๆ ระบบก็ยังพลาด
โมเดลยังแยกไม่ออกระหว่างบทสนทนาในชีวิตประจำวันกับการออกเสียงแบบทางการ
ตอนเรียนที่ไต้หวัน ผมเคย วาดเส้นโค้งวรรณยุกต์ด้วยมือเพื่อช่วยจำ
แม้จะดูเหมือนชาวต่างชาติบ้า ๆ แต่ได้ผลจริง
ความต่างของสำเนียงท้องถิ่นก็มีมากเหมือนกัน ถ้ารวบรวม ข้อมูลอ้างอิงแยกตามเจ้าของภาษาแต่ละคน ได้ก็น่าจะดี
ผมเสียดายที่ตอนนั้นไม่ได้ทำตาม
ผมเป็นเจ้าของภาษา แต่เดโมกลับไม่รู้จำการออกเสียงของผม
น่าจะเป็นเพราะ เสียงรบกวนพื้นหลัง ตอนนั้นลูกสาวกำลังดูการ์ตูนอยู่ข้าง ๆ
เป็นโปรเจ็กต์ที่เจ๋งมาก แต่ผมอยากแนะนำว่า อย่าพึ่งพาฟีดแบ็กภายนอกมากเกินไป
แก่นของการแก้การออกเสียงคือ การฝึกหู ผู้เรียนผู้ใหญ่ก็ยังมีความยืดหยุ่นของระบบประสาทอยู่ ดังนั้นควรฝึกฟังคู่คำที่ต่างกันน้อย ๆ เป็นต้น เพื่อฝึกหูให้แม่น
แบบนี้ไม่เพียงช่วยเรื่องการออกเสียง แต่ยังช่วย การฟังและความเร็วในการเรียนรู้คำศัพท์ ได้มากด้วย
เมื่อเทียบกับ SST แล้ว การซิงก์ข้อความกับเสียง (สไตล์คาราโอเกะ) มีประสิทธิภาพกว่ามาก
วิธีที่ผู้ใช้ฟังเสียงตัวเองซ้อนกับต้นฉบับแล้วรับรู้ความต่างด้วยตัวเองนั้นมีประโยชน์ต่อการเรียนรู้อย่างมาก
แทนที่จะท่องว่าวรรณยุกต์ของแต่ละคำคืออะไร การ เลียนแบบการออกเสียงของเจ้าของภาษาโดยตรง จะเป็นธรรมชาติกว่ามาก
น่าประทับใจที่ทุกอย่างรันในเบราว์เซอร์ได้ทั้งหมดด้วย ONNX Runtime Web
แนวทางใช้การบังคับจัดแนวเพื่อกันการเดาความหมายออกไป และ แยกปัญหาเรื่องวรรณยุกต์ออกมาต่างหาก ถือว่าฉลาดมาก
ในเวอร์ชันถัดไป ถ้าเพิ่ม tone sandhi (การเปลี่ยนวรรณยุกต์) เป็นขั้นตอนหลังประมวลผล ก็น่าจะมีประโยชน์กับการฝึกความเร็วในการสนทนามากขึ้น
อยากให้มี โหมด pinyin ผมเรียนแค่การพูด ไม่ได้เรียนอ่านตัวอักษร
ตอนนี้กำลังจัดคำศัพท์ด้วย เว็บแอปแฟลชการ์ด ที่ผมทำเอง