1 คะแนน โดย GN⁺ 2026-02-01 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • ได้ลองสร้าง โมเดลเสียงแบบ 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 ความคิดเห็น

 
GN⁺ 2026-02-01
ความคิดเห็นจาก Hacker News
  • ขอบคุณสำหรับโปรเจ็กต์ที่เจ๋งมาก
    แต่รู้สึกแปลกที่ในประโยค “我想学中文” ระบบ รับรู้ “wén” เป็น “guó”
    ดูเหมือนว่านี่เป็นผลจากการที่โมเดลเรียนรู้ โครงสร้างของคำมากกว่าวรรณยุกต์ น่าจะเกิดอคติเพราะ “Zhōng guó” ปรากฏบ่อยในข้อมูลฝึก
    อย่างที่เขียนไว้ในบล็อก ดูเหมือนว่านี่ไม่ใช่ “โมเดลที่บอกว่าฉันออกเสียงอะไรจริง ๆ” แต่เป็นโครงสร้างที่ แมป ไปยังพยางค์ที่ใกล้ที่สุดจาก 1254 พยางค์ที่เป็นไปได้

    • ผมลองพูด “guó” ซ้ำหลายครั้งแล้ว แต่ระบบก็ยังไม่รับรู้ว่าเป็นการพูดซ้ำ
      ถึงอย่างนั้นก็ชอบแนวทางการเรียนรู้แบบ เน้นเสียงพูด นี้มาก การเรียนแบบอิงตัวอักษรทำให้สับสนเพราะระบบเขียนของแต่ละประเทศต่างกัน สำหรับผู้เริ่มต้น แม้แต่ pinyin ก็ยังมีสัญลักษณ์ที่ชวนงงหลายอย่าง
  • ไอเดียและ UI ดูเข้าใจง่ายจนน่าประทับใจ
    แต่แม้แต่ผมซึ่งเป็นคนปักกิ่งและ พูดภาษาจีนมาตรฐานได้อย่างสมบูรณ์แบบ ก็ยังผ่านข้อที่ง่ายได้ยาก
    ในตัวอย่าง “你好吃饭了吗” การตรวจจับวรรณยุกต์ผิด และ “了” ตามบริบทควรเป็น “le” ไม่ใช่ “liǎo”
    มีหลายความเห็นที่กังวลเรื่องวรรณยุกต์ แต่ในความเป็นจริง ต่อให้วรรณยุกต์ไม่เป๊ะก็ไม่ได้ทำให้สื่อสารมีปัญหามากนัก
    แต่ละพื้นที่มีสำเนียงต่างกัน ต่อให้วรรณยุกต์ปนกันคนก็ยังเข้าใจกันได้ อย่ายึดติดกับวรรณยุกต์มากเกินไป และขอแนะนำการเรียนแบบ ยึดบริบทเป็นหลัก

    • ในฐานะเจ้าของภาษา ขอแย้งว่า วรรณยุกต์สำคัญมาก
      ถึงสำเนียงท้องถิ่นจะต่างกัน แต่ที่คนยังสื่อสารกันได้เป็นเพราะ 1) ความต่างของวรรณยุกต์ระหว่างพื้นที่ใกล้เคียงไม่มาก และ 2) ถ้าคุยกันไม่รู้เรื่องก็จะสลับไปใช้ ภาษามาตรฐาน (Putonghua)
      เหตุผลที่ภาษาจีนดำรงอยู่ได้ก็เพราะระบบวรรณยุกต์นี่เอง ถ้าวรรณยุกต์ผิด การสื่อสารแทบจะเป็นไปไม่ได้
    • จากมุมของคนที่เรียนจนถึงระดับ C1 ในไต้หวัน วรรณยุกต์สำคัญในช่วงแรก แต่ ยิ่งแสดงออกได้มากขึ้น บริบทก็ยิ่งช่วยชดเชย
      อย่างไรก็ตาม หนึ่งในเหตุผลที่จีนสื่อสารด้วยตัวอักษรเป็นหลัก ก็เพราะแต่ละพื้นที่มีการออกเสียงและวรรณยุกต์ต่างกัน จน พึ่งเสียงพูดอย่างเดียวไม่ได้
    • ระหว่างเจ้าของภาษา ต่อให้รูปแบบวรรณยุกต์ต่างกันก็ยังเข้าใจกันได้ เพราะไวยากรณ์และน้ำเสียงคาดเดาได้ แต่ผู้เรียนไม่เป็นแบบนั้น
      การสร้างแรงจูงใจให้มองข้ามวรรณยุกต์เป็นเรื่องอันตราย ถ้าวรรณยุกต์ไม่สำคัญจริง มันคงหายไปนานแล้ว
    • ปัญหาเรื่อง “了” เป็น บั๊กของ JavaScript และแก้แล้ว ที่เหลือน่าจะปรับปรุงได้ด้วยชุดข้อมูลที่หลากหลายขึ้น
    • ต่อให้บอกว่าวรรณยุกต์ไม่สำคัญ ก็ยังมีกรณีอย่าง 熊猫(xióngmāo) กับ 胸毛(xiōngmáo) ที่ความหมายต่างกันคนละเรื่องเพราะวรรณยุกต์
      ถ้าบริบทแคบก็จะสับสนได้ง่าย ดังนั้นวรรณยุกต์ยังคงเป็นแกนสำคัญ อีกทั้งยังต้องเสริมข้อมูลเพิ่ม เพราะระบบยังรับรู้ “吃” เป็น “shi2” เป็นต้น
  • ในฐานะผู้เรียนระดับกลาง ผมถึงกับสร้างบัญชีใหม่เพื่อฝากฟีดแบ็ก
    ถ้าพูดเร็ว ระบบจะตามหน่วยเสียงไม่ทันและตรวจวรรณยุกต์คลาดเคลื่อน
    ตัวอย่างเช่น ถ้าพูด “他是我的朋友” ด้วยความเร็วธรรมชาติ ระบบจะรับ “我” เป็น “de” หรืออ่าน “是” เป็น “si”
    แต่ถ้าพูดช้า ๆ ชัด ๆ จะตรวจได้ถูกต้อง
    ควรคำนึงถึงปรากฏการณ์อย่าง การเปลี่ยนวรรณยุกต์ของเสียงสามต่อเนื่อง (tone sandhi) ด้วย จำเป็นต้องมีความสามารถในการจัดการการออกเสียงในบทสนทนาธรรมชาติ

    • การเปลี่ยนวรรณยุกต์เป็นแกนสำคัญของการออกเสียงภาษาจีน ตอนนี้ยังอยู่ในระดับสำหรับผู้เริ่มต้น จึงยังต้องปรับปรุง
    • ขอบคุณสำหรับฟีดแบ็ก ตอนนี้ได้เพิ่มการรองรับ sandhi (การเปลี่ยนวรรณยุกต์) แล้ว ช่วยลองดูว่าใช้งานได้ดีไหม
    • ผมก็ดูเหมือนจะเจอปัญหาว่าระบบยังไม่จัดการการเปลี่ยนวรรณยุกต์เหมือนกัน แต่ไอเดียนี่เจ๋งจริง ๆ
    • ผมก็เจอปัญหาเดียวกัน ขอแซวเล่นว่า หรือเพราะเป็น “ดาพั่งจึ (dapangzi)” กันนะ
  • สำหรับคนที่พูดภาษาในยุโรป การเรียนภาษาจีนหรือ ภาษาที่มีวรรณยุกต์ อื่น ๆ นั้นยากมาก
    หูไม่คุ้นกับวรรณยุกต์ ทำให้คิดว่าตัวเองพูดถูกแล้ว แต่เจ้าของภาษาฟังไม่ออก

    • ในฐานะเจ้าของภาษาจีน ผมกลับรู้สึกว่าระบบ สระของภาษาอังกฤษ ยากกว่ามาก
      ภาษาอังกฤษมีสระที่ต่างกันไปตามภูมิภาค และแยกความต่างอย่าง “done vs down”, “beat vs bit” ได้ยาก
      ตรงกันข้าม ภาษาสเปนมีระบบสระเรียบง่าย เลยเรียนง่ายกว่ามาก
    • เพราะแบบนี้จึงเข้าใจว่าทำไมคนจีนถึงมักพลาดเรื่องการออกเสียงภาษาอังกฤษหรือเยอรมัน มันเป็นเพราะ จุดที่ใช้โฟกัสความสนใจต่างกัน
    • สำหรับคนที่ไม่คุ้นกับวรรณยุกต์หรือระดับเสียง มันยากจนแทบบ้าได้ แต่เครื่องมือแบบนี้ช่วยให้กระบวนการนั้นทรมานน้อยลง
      ตอนเรียน pitch accent ของภาษาญี่ปุ่น ตอนแรกผมก็ไม่ได้ยินความต่างอะไรเลย แต่พอฝึกซ้ำ ๆ ก็เริ่มจับได้
      พอได้ตระหนักว่าภาษาอังกฤษเองก็มีรูปแบบระดับเสียงอย่างคำว่า “uh-oh” ก็เริ่มจับทางได้
    • บางครั้งแม้พูดประโยคง่าย ๆ คนก็ยังฟังไม่ออกบ่อยมาก
      โดยเฉพาะนิสัยการใช้น้ำเสียงแบบอังกฤษเพื่อ แสดงความไม่แน่ใจ นี่แหละที่เป็นปัญหา
    • แต่จริง ๆ แล้ววรรณยุกต์ไม่ได้ยากขนาดนั้น สิ่งที่ยากจริงคือ ปริมาณคำศัพท์
      วรรณยุกต์กับไวยากรณ์เป็นพื้นฐานที่ต้องเก็บให้ได้ช่วงต้น หลังจากนั้นอีกหลายปี ความพยายามส่วนใหญ่จะไปอยู่ที่การท่องคำศัพท์
      ความยากที่แท้จริงของภาษาจีนคือ การขาดคำศัพท์ร่วมกับภาษาอื่น และ ระบบอักษรที่ไม่อิงหน่วยเสียง
  • มันทำงานได้ดีเฉพาะตอนพูดเป็นคำ ๆ แต่พอเป็นระดับประโยคหรือความเร็วธรรมชาติจะมี การรับรู้ผิดเยอะ
    ผมเป็นเจ้าของภาษาที่มี ใบรับรองภาษามาตรฐานระดับ 2A แต่ถ้าพูดแบบสบาย ๆ ระบบก็ยังพลาด
    โมเดลยังแยกไม่ออกระหว่างบทสนทนาในชีวิตประจำวันกับการออกเสียงแบบทางการ

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

    • ในคลาสของผมก็มีนักเรียนคนหนึ่งที่ออกวรรณยุกต์แบบเกินจริง แต่สุดท้ายกลับ ออกเสียงได้แม่นที่สุด
      ผมเสียดายที่ตอนนั้นไม่ได้ทำตาม
    • ขอแนะนำ บทเรียน YouTube ของ Mike Laoshi
    • ผมเองก็ทดสอบกับเพื่อนแค่ไม่กี่คน และกำลังคิดอยู่ว่าจะ ตั้งภูมิภาคเป็นพารามิเตอร์ ดีไหม ถ้าฝึกให้รองรับทุกสำเนียง ระบบอาจจะใจกว้างเกินไป
    • มันคล้ายกับ การฝึกโซลเฟจ ที่ใช้ท่ามือแทนระดับเสียง
    • ท่ามือช่วยได้มากโดยเฉพาะเวลาท่องคำใหม่ ๆ ถ้าใช้นิ้วแทนวรรณยุกต์จะจำได้ดีขึ้น
  • ผมเป็นเจ้าของภาษา แต่เดโมกลับไม่รู้จำการออกเสียงของผม
    น่าจะเป็นเพราะ เสียงรบกวนพื้นหลัง ตอนนั้นลูกสาวกำลังดูการ์ตูนอยู่ข้าง ๆ

    • ตอนนี้ยังไวต่อเสียงรบกวนพื้นหลัง แต่กำลังฝึก เวอร์ชันที่ปรับปรุงด้วยการเพิ่มข้อมูล (data augmentation) อยู่
  • เป็นโปรเจ็กต์ที่เจ๋งมาก แต่ผมอยากแนะนำว่า อย่าพึ่งพาฟีดแบ็กภายนอกมากเกินไป
    แก่นของการแก้การออกเสียงคือ การฝึกหู ผู้เรียนผู้ใหญ่ก็ยังมีความยืดหยุ่นของระบบประสาทอยู่ ดังนั้นควรฝึกฟังคู่คำที่ต่างกันน้อย ๆ เป็นต้น เพื่อฝึกหูให้แม่น
    แบบนี้ไม่เพียงช่วยเรื่องการออกเสียง แต่ยังช่วย การฟังและความเร็วในการเรียนรู้คำศัพท์ ได้มากด้วย

    • ผมกำลังพัฒนา Phrasing.app และเห็นด้วยกับคำแนะนำนี้เต็มที่
      เมื่อเทียบกับ SST แล้ว การซิงก์ข้อความกับเสียง (สไตล์คาราโอเกะ) มีประสิทธิภาพกว่ามาก
      วิธีที่ผู้ใช้ฟังเสียงตัวเองซ้อนกับต้นฉบับแล้วรับรู้ความต่างด้วยตัวเองนั้นมีประโยชน์ต่อการเรียนรู้อย่างมาก
    • ผมก็คิดเหมือนกัน การฟังคือหัวใจของการพูด
      แทนที่จะท่องว่าวรรณยุกต์ของแต่ละคำคืออะไร การ เลียนแบบการออกเสียงของเจ้าของภาษาโดยตรง จะเป็นธรรมชาติกว่ามาก
  • น่าประทับใจที่ทุกอย่างรันในเบราว์เซอร์ได้ทั้งหมดด้วย ONNX Runtime Web
    แนวทางใช้การบังคับจัดแนวเพื่อกันการเดาความหมายออกไป และ แยกปัญหาเรื่องวรรณยุกต์ออกมาต่างหาก ถือว่าฉลาดมาก
    ในเวอร์ชันถัดไป ถ้าเพิ่ม tone sandhi (การเปลี่ยนวรรณยุกต์) เป็นขั้นตอนหลังประมวลผล ก็น่าจะมีประโยชน์กับการฝึกความเร็วในการสนทนามากขึ้น

  • อยากให้มี โหมด pinyin ผมเรียนแค่การพูด ไม่ได้เรียนอ่านตัวอักษร
    ตอนนี้กำลังจัดคำศัพท์ด้วย เว็บแอปแฟลชการ์ด ที่ผมทำเอง

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