โอเพนเวท
OpenThai 2.0 ASR Streaming
โมเดลแบบเปิดที่ถอดเสียงพูดภาษาไทยเป็นข้อความ ขณะที่คนยังพูดอยู่
- พารามิเตอร์640ล้าน
- สัญญาอนุญาตOpenMDW-1.1
- ข้อความช้ากว่าเสียง80–1120ms
- FLEURS อักษรผิด8.47%
ดาวน์โหลดโมเดลอ่านบทความเปิดตัว
เปิดน้ำหนักโมเดลบน Hugging Face เมื่อ 12 พฤศจิกายน 2569 โดย iApp Technology
ทำอะไรได้บ้าง
- ถอดความขณะที่คนพูดข้อความมาช้ากว่าเสียง 80, 320, 560 หรือ 1120 มิลลิวินาที เลือกได้ตอนถอดเสียง น้ำหนักชุดเดียวใช้ได้ทุกระดับ และยิ่งรอนานขึ้นก็แม่นขึ้นเล็กน้อย
- เสียงยาวแค่ไหนก็ได้เซิร์ฟเวอร์ที่แนบมาตัดไฟล์ยาวเป็นท่อนตามช่วงหยุด แล้วถอดแต่ละท่อนแยกกัน แบบเดียวกับบริการของ iApp ไฟล์ยาวหนึ่งชั่วโมงหรือมากกว่าจึงถอดได้ด้วยหน่วยความจำคงที่ เราทดสอบกับไฟล์ยาวสูงสุด 87 นาที
- อักษรไทยล้วน หรือคำอังกฤษเป็นภาษาอังกฤษพรอมต์
th-THเขียนทุกอย่างเป็นอักษรไทย ส่วนพรอมต์th-mixเขียนคำภาษาอังกฤษที่ผู้พูดใช้เป็นอักษรละติน - ใครพูดอะไรเซิร์ฟเวอร์ที่แถมมาระบุผู้พูดในการประชุมได้ ด้วยโมเดลแยกผู้พูดแบบเปิดของ NVIDIA
- GPU หรือ CPUNVIDIA H100 หนึ่งใบถอดไฟล์ได้เร็วกว่าเวลาจริงราว 257 เท่า และรองรับการสตรีมสดได้ราว 20 สาย ส่วน CPU ระดับโน้ตบุ๊ก 8 เธรดก็ตามทันการสตรีมสดหนึ่งสาย
- โมเดลเบื้องหลัง OpenThai ASR Realtimeบริการถอดเสียงสดบนคลาวด์ของ iApp ใช้โมเดลนี้ ดูที่ OpenThai ASR Realtime
ผลการทดสอบ
- 560 ms
- 1120 ms
- ตามความหน่วง
- เสียงยาวทั้งไฟล์
อัตราผิดพลาดระดับตัวอักษร (%) ยิ่งต่ำยิ่งดี ที่ความหน่วง 560 ms เราถอดเสียงทุกโมเดลเองด้วยสคริปต์สตรีมมิงของ NeMo ชุดเดียวกันและค่าตั้งเดียวกัน ทั้ง Typhoon ASR Streaming 0.6B ตามที่เผยแพร่ และแบบที่ใช้โมเดลภาษา 4-gram ที่ผู้พัฒนาเผยแพร่คู่กัน
| ชุดทดสอบ | คลิป | OpenThai 2.0 ASR Streaming | Typhoon ASR Streaming 0.6B | Typhoon ASR Streaming 0.6B + โมเดลภาษา 4-gram | ผลต่าง ของเรา − Typhoon |
|---|---|---|---|---|---|
| FLEURS เสียงอ่าน | 1,021 | 8.47 | 11.28 | 11.73 | −2.82 [−3.15, −2.48], ของเราต่ำกว่า |
| GigaSpeech2 ชุดทดสอบ จาก YouTube | 8,823 | 15.35 | 16.33 | 16.62 | −0.98 [−1.31, −0.58], ของเราต่ำกว่า |
| TVSpeech รายการทีวีและ YouTube | 570 | 12.41 | 10.84 | 11.05 | +1.57 [+0.90, +2.52], Typhoon ต่ำกว่า |
| LOTUSDIS การประชุม ไมโครโฟนกลางโต๊ะ | 5,516 | 20.77 | 28.91 | 29.02 | −8.15 [−8.88, −7.46], ของเราต่ำกว่า |
| ภาษาถิ่นอีสาน | 500 | 34.90 | 34.15 | 35.79 | +0.75 [−0.21, +1.69], เสมอ |
- ก่อนให้คะแนน ข้อความทั้งสองฝั่งถูกเขียนให้อยู่ในรูปเดียวกัน คือทำตัวเลขให้ตรงกัน และตัดช่องว่างกับเครื่องหมายวรรคตอนออก ผลต่างคือของเราลบ Typhoon ASR Streaming 0.6B พร้อมช่วงความเชื่อมั่น 95% จาก paired bootstrap ที่สุ่มทั้งวิดีโอ ทั้งไฟล์บันทึก ทั้งผู้พูด หรือทั้งการประชุม ช่วงที่คร่อมศูนย์ถือว่าเสมอกัน ตัวหนาคือค่าผิดพลาดที่ต่ำกว่าอีกโมเดลด้วยความเชื่อมั่น 95%
- TVSpeech เป็นชุดทดสอบของ Typhoon ASR Streaming 0.6B เอง LOTUSDIS: เราเทรนด้วยการประชุมอื่นจากห้องและไมโครโฟนชุดเดียวกัน และผู้พูดบางคนอยู่ทั้งสองฝั่ง แถวนี้จึงได้เปรียบฝั่งเรา FLEURS: เราเทรนด้วยชุด train และ dev แต่ไม่ได้ใช้ชุด test ทั้งสองโมเดลเทรนด้วยชุด train ของ GigaSpeech2 เราไม่ได้เทรนด้วยภาษาอีสาน และข้อมูลเทรนที่ Typhoon ASR Streaming 0.6B เผยแพร่ก็ไม่มีภาษาอีสาน
- ไฟล์ที่เราเผยแพร่ตั้งค่ า blank offset ไว้ที่ −1.0 ซึ่งเลือกจากข้อมูลชุดพัฒนา หากทำแบบเดียวกันกับ Typhoon ASR Streaming 0.6B ค่าที่ดีที่สุดบนข้อมูลชุดพัฒนาเดียวกันคือ -2.0 และค่าผิดพลาดจะเป็น FLEURS เสียงอ่าน 11.63, GigaSpeech2 ชุดทดสอบ จาก YouTube 15.26, TVSpeech รายการทีวีและ YouTube 10.68, LOTUSDIS การประชุม ไมโครโฟนกลางโต๊ะ 26.71, ภาษาถิ่นอีสาน 33.87
อัตราผิดพลาดระดับตัวอักษร (%) ยิ่งต่ำยิ่งดี ที่ความหน่วง 1120 ms เราถอดเสียงทุกโมเดลเองด้วยสคริปต์สตรีมมิงของ NeMo ชุดเดียวกันและค่าตั้งเดียวกัน ทั้ง Typhoon ASR Streaming 0.6B ตามที่เผยแพร่ และแบบที่ใช้โมเดลภาษา 4-gram ที่ผู้พัฒนาเผยแพร่คู่กัน
| ชุดทดสอบ | คลิป | OpenThai 2.0 ASR Streaming | Typhoon ASR Streaming 0.6B | Typhoon ASR Streaming 0.6B + โมเดลภาษา 4-gram | ผลต่าง ของเรา − Typhoon |
|---|---|---|---|---|---|
| FLEURS เสียงอ่าน | 1,021 | 8.36 | 11.32 | 11.64 | −2.96 [−3.31, −2.65], ของเราต่ำกว่า |
| GigaSpeech2 ชุดทดสอบ จาก YouTube | 8,823 | 15.23 | 16.18 | 16.44 | −0.95 [−1.35, −0.49], ของเราต่ำกว่า |
| TVSpeech รายการทีวีและ YouTube | 570 | 12.14 | 10.70 | 11.18 | +1.45 [+0.77, +2.46], Typhoon ต่ำกว่า |
| LOTUSDIS การประชุม ไมโครโฟนกลางโต๊ะ | 5,516 | 20.30 | 28.23 | 28.64 | −7.93 [−8.66, −7.24], ของเราต่ำกว่า |
| ภาษาถิ่นอีสาน | 500 | 34.49 | 33.73 | 35.68 | +0.76 [−0.28, +1.86], เสมอ |
- ก่อนให้คะแนน ข้อความทั้งสองฝั่งถูกเขียนให้อยู่ในรูปเดียวกัน คือทำตัวเลขให้ตรงกัน และตัดช่องว่างกับเครื่องหมายวรรคตอนออก ผลต่างคือของเราลบ Typhoon ASR Streaming 0.6B พร้อมช่วงความเชื่อมั่น 95% จาก paired bootstrap ที่สุ่มทั้งวิดีโอ ทั้งไฟล์บันทึก ทั้งผู้พูด หรือทั้งการประชุม ช่วงที่คร่อมศูนย์ถือว่าเสมอกัน ตัวหนาคือค่าผิดพลาดที่ต่ำกว่าอีกโมเดลด้วยความ เชื่อมั่น 95%
- TVSpeech เป็นชุดทดสอบของ Typhoon ASR Streaming 0.6B เอง LOTUSDIS: เราเทรนด้วยการประชุมอื่นจากห้องและไมโครโฟนชุดเดียวกัน และผู้พูดบางคนอยู่ทั้งสองฝั่ง แถวนี้จึงได้เปรียบฝั่งเรา FLEURS: เราเทรนด้วยชุด train และ dev แต่ไม่ได้ใช้ชุด test ทั้งสองโมเดลเทรนด้วยชุด train ของ GigaSpeech2 เราไม่ได้เทรนด้วยภาษาอีสาน และข้อมูลเทรนที่ Typhoon ASR Streaming 0.6B เผยแพร่ก็ไม่มีภาษาอีสาน
- ไฟล์ที่เราเผยแพร่ตั้งค่า blank offset ไว้ที่ −1.0 ซึ่งเลือกจากข้อมูลชุดพัฒนา หากทำแบบเดียวกันกับ Typhoon ASR Streaming 0.6B ค่าที่ดีที่สุดบนข้อมูลชุดพัฒนาเดียวกันคือ -2.0 และค่าผิดพลาดจะเป็น FLEURS เสียงอ่าน 11.63, GigaSpeech2 ชุดทดสอบ จาก YouTube 15.26, TVSpeech รายการทีวีและ YouTube 10.68, LOTUSDIS การประชุม ไมโครโฟนกลางโต๊ะ 26.71, ภาษาถิ่นอีสาน 33.87
| ชุดทดสอบ | 80 ms | 320 ms | 560 ms | 1120 ms |
|---|---|---|---|---|
| FLEURS เสียงอ่าน | 8.73 / 11.78 | 8.53 / 11.67 | 8.47 / 11.28 | 8.36 / 11.32 |
| GigaSpeech2 ชุดทดสอบ จาก YouTube | 16.64 / 17.75 | 15.53 / 16.64 | 15.35 / 16.33 | 15.23 / 16.18 |
| TVSpeech รายการทีวีและ YouTube | 13.06 / 11.44 | 12.54 / 10.84 | 12.41 / 10.84 | 12.14 / 10.70 |
| LOTUSDIS การประชุม ไมโครโฟนกลางโต๊ะ | 26.12 / 34.35 | 21.79 / 29.49 | 20.77 / 28.91 | 20.30 / 28.23 |
| ภาษาถิ่นอีสาน | 35.84 / 35.37 | 34.72 / 34.65 | 34.90 / 34.15 | 34.49 / 33.73 |
อัตราผิดพลาดระดับตัวอักษร (%) ของเรา / Typhoon ASR Streaming 0.6B ความหน่วงคือความยาวของช่วงเสียงที่โมเดลรอก่อนถอดความ 80 ms คือสั้นที่สุด การ์ดโมเดลของ Typhoon ASR Streaming 0.6B นับเฉพาะช่วงมองไปข้างหน้า "1040 ms" ของเขาจึงตรงกับค่า 1120 ms ในตา รางนี้
เสียงยาวทั้งไฟล์ ที่ความหน่วง 560 ms แต่ละไฟล์ได้จากการต่อทุกคลิปของวิดีโอหรือไฟล์บันทึกเดียวกันตามลำดับ คั่นด้วยความเงียบหนึ่งวินาที "ถอดต่อเนื่อง" คือถอดทั้งไฟล์ในรอบเดียวแบบที่สคริปต์ของ NeMo ทำ "ตัดตามช่วงหยุด" คือถอดแบบที่เซิร์ฟเวอร์ที่แนบมาทำ โดยตัดไฟล์เป็นท่อนตรงที่ไม่มีใครพูดนาน 0.7 วินาที แล้วถอดแต่ละท่อนแยกกัน ทั้งสองโมเดลผ่านโค้ดชุดเดียวกัน และ Typhoon ASR Streaming 0.6B ใช้ค่าตั้งตามที่เผยแพร่
| ชุดทดสอบ | ไฟล์ | ถอดต่อเนื่อง | ตัดตามช่วงหยุด | ||||
|---|---|---|---|---|---|---|---|
| OpenThai 2.0 ASR Streaming | Typhoon ASR Streaming 0.6B | ผลต่าง ของเรา − Typhoon | OpenThai 2.0 ASR Streaming | Typhoon ASR Streaming 0.6B | ผลต่าง ของเรา − Typhoon | ||
| TVSpeech ทั้งวิดีโอ (0.5–47 นาที) | 18 | 23.54 | 11.07 | +12.47 [+7.49, +17.08], Typhoon ต่ำกว่า | 12.66 | 10.84 | +1.82 [+1.16, +2.74], Typhoon ต่ำกว่า |
| GigaSpeech2 ทั้งไฟล์บันทึก (5–87 นาที) | 31 | 23.10 | 30.07 | −6.97 [−12.06, −2.63], ของเราต่ำกว่า | 13.53 | 14.42 | −0.88 [−1.34, −0.41], ของเราต่ำกว่า |
เมื่อถอดต่อเนื่อง โมเดลของเราจะตกหล่นคำหลังช่วงที่เงียบเกือบสนิท ยิ่งเงียบนานและเงียบมาก ยิ่งตกหล่นมาก ส่วน Typhoon ASR Streaming 0.6B ไม่มีปัญหานี้ เมื่อตัดตามช่วงหยุด ผลของเราใกล้เคียงหรือดีกว่าการถอดทีละคลิป เซิร์ฟเวอร์ที่แนบมาและบริการ OpenThai ASR Realtime ของ iApp ตัดตามช่วงหยุดทั้งคู่
สรุปคือ ที่ความหน่วง 560 ms โมเดลนี้ผิดพลาดน้อยกว่า Typhoon ASR Streaming 0.6B กับเสียงอ่าน (FLEURS 8.47% เทียบกับ 11.28%) คลิปจาก YouTube (GigaSpeech2 15.35% เทียบกับ 16.33%) และการประชุม (LOTUSDIS ซึ่งเป็นชุดที่ได้เปรียบฝั่งเรา) แต่ผิดพลาดมากกว่ากับรายการทอล์กทางทีวี (TVSpeech 12.41% เทียบกับ 10.84%) และเสมอกันกับภาษาถิ่นอีสาน ไ ฟล์เสียงยาวควรตัดเป็นท่อนตามช่วงหยุดก่อนถอด แบบที่เซิร์ฟเวอร์ที่แนบมาทำ แท็บ "เสียงยาวทั้งไฟล์" แสดงเหตุผล
วิธีรัน
- NeMo, ไฟล์เสียง
- เซิร์ฟเวอร์ สตรีมสด
- ONNX บน CPU
ติดตั้ง NVIDIA NeMo (Speech) ตามที่การ์ดโมเดลอธิบาย แล้วถอดรายการไฟล์ 16 kHz โมโนด้วยสคริปต์สตรีมมิงของ NeMo ตัวเลขทุกตัวในหน้านี้วัดด้วยวิธีนี้
hf download iapp/OpenThai2.0-ASR-Streaming --local-dir OpenThai2.0-ASR-Streaming
echo '{"audio_filepath": "a.wav", "duration": 8.8, "text": ""}' > in.jsonl
python <NeMo Speech>/examples/asr/asr_cache_aware_streaming/speech_to_text_cache_aware_streaming_infer.py \
model_path=OpenThai2.0-ASR-Streaming/openthai2.0-asr-streaming_bias-1.0.nemo \
dataset_manifest=in.jsonl output_path=out att_context_size="[56,6]" \
target_lang=th-TH strip_lang_tags=true rnnt_decoding.greedy.max_symbols_per_step=2
att_context_size กำหนดความหน่วง: [56,0] 80 ms, [56,3] 320 ms, [56,6] 560 ms, [56,13] 1120 ms และ target_lang=th-mix เขียนคำภาษาอังกฤษเป็นอักษรละติน
รีโพมีเซิร์ฟเวอร์ขนาดเล็กมาให้: POST /v1/transcribe สำหรับไฟล์ และ WebSocket /v1/live สำหรับเสียงสดยาวเท่าใดก็ได้ ซึ่งตัดตามช่วง ที่หยุดพูด (/v1/stream รับเสียงพูดสั้นครั้งละหนึ่งประโยค) พร้อมโหมดสำหรับเสียงพูดทั่วไป บทสนทนา และการประชุม
cd OpenThai2.0-ASR-Streaming/serve
CHINDA_DEVICE=cuda python -m uvicorn app:app --port 18081
curl -F file=@a.wav -F mode=conversation http://127.0.0.1:18081/v1/transcribe
WebSocket รับเสียง PCM 16 บิต 16 kHz โมโน แล้วตอบข้อความที่ถอดได้ถึงตอนนั้น และข้อความสุดท้ายเมื่อจบ การ์ดโมเดลมีตัวอย่างไคลเอนต์ครบ
มีเวอร์ชัน ONNX ที่รันด้วย ONNX Runtime อย่างเดียวบน CPU ไม่ต้องมี Python หรือ PyTorch เป็นชุดเดียวกับที่ Chinda Bot ดาวน์โหลดไปใช้กับปุ่มไมโครโฟน มีทั้งแบบความละเอียดเต็ม (น้ำหนัก 2.45 GB) และแบบ int8 (0.88 GB) ทั้งสองแบบตั้งความหน่วงไว้ที่ 560 มิลลิวินาที สำหรับแบบความละเอียดเต็ม:
hf download iapp/OpenThai2.0-ASR-Streaming-ONNX encoder.onnx.data openthai2.0-asr-streaming-fp32.asr.zip --local-dir OpenThai2.0-ASR-Streaming-ONNX
cd OpenThai2.0-ASR-Streaming-ONNX && unzip openthai2.0-asr-streaming-fp32.asr.zip
ในคลิปที่เราตรวจ แบบความละเอียดเต็มให้ข้อความตรงกับโมเดลด้านบนทุกโทเคน และบน CPU ของ Apple M3 Max ถอดเสียงพูด 3.5 วินาทีได้ใน 0.16 วินาที ส่วนแบบ int8 ยังไม่ได้วัดความแม่นยำกับเสียงจริง ถ้าไม่แน่ใจให้ใช้แบบความละเอียดเต็ม การ์ดของ repository อธิบายอินพุตและเอาต์พุตของ encoder และ decoder ไว้สำหรับเขียนลูปถอดเสียงเอง
ทดสอบกับ NeMo Speech cf724ac, PyTorch 2.13 และ Python 3.12
หากต้องการบริการที่โฮสต์ให้ OpenThai ASR Realtime ให้บริการโมเดลนี้ผ่าน WebSocket API และ Chinda ASR Pro v2 คือบริการของ iApp ที่แม่นกว่าสำหรับไฟล์บันทึกเสียง
ข้อจำกัด
- เสียงยาว หากถอดทั้งไฟล์ต่อเนื่องในรอบเดียว โมเดลจะตกหล่นคำหลังช่วงที่เงียบ วิดีโอของ TVSpeech ที่ต่อคลิปใหม่โดยคั่นด้วยความเงียบหนึ่งวินาที ได้ค่าผิดพลาด 23.54% เมื่อถอดต่อเนื่อง และ 12.66% เมื่อตัดตามช่วงหยุด เซิร์ฟเวอร์ที่แนบมาตัดตามช่วงหยุดให้อัตโนมัติ
- รายการทอล์กทางทีวีและ YouTube Typhoon ASR Streaming 0.6B แม่นยำกว่าบน TVSpeech ส่วนหนึ่งของช่องว่างมาจากเสียงลังเลอย่าง เอ่อ ซึ่งคำถอดความของ TVSpeech เก็บไว้แต่โมเดลนี้ตัดออก ที่เหลือส่วนใหญ่เป็นคำภาษาอังกฤษ
- คำภาษาอังกฤษ เมื่อใช้
th-THคำเหล่านี้จะออกมาเป็นอักษรไทย เมื่อใช้th-mixคำภาษาอังกฤษใน TVSpeech ออกมาเป็นอักษรละติน 13.7% เทียบกับ 16.1% ของ Typhoon ASR Streaming 0.6B - ภาษาถิ่น รองรับเฉพาะภาษาไทยกลาง กับภาษาอีสานผิดพลาด 34.9% ของตัวอักษร ใกล้เคียงกับ Typhoon ASR Streaming 0.6B
- ระยะห่างจากไมโครโฟน ในการประชุมของ LOTUSDIS ที่ 1120 ms ไมโครโฟนกลางโต๊ะผิดพลาด 20.3% ส่วนช่องไกล bt3m และ bt10m ผิดพลาด 56.5% และ 53.5%
- ยังไม่ได้วัด: เสียงโทรศัพท์ (8 kHz) ยังไม่มี: การเพิ่มคำศัพท์เฉพาะสำหรับชื่อ
การเทรน
เสียงพูดภาษาไทย 12,373 ชั่วโมง และภาษาอังกฤษ 961 ชั่วโมง ในส่วนภาษาไทย 10,400 ชั่วโมงเป็นเสียงจาก YouTube ในชุด train ของ GigaSpeech2 พร้อมคำถอดความอัตโนมัติของชุดนั้น ที่เหลือถอดความโดยคน ได้แก่ Thai Dialect Corpus (เฉพาะภาษากลาง) เสียงที่ iApp บันทึกเอง Common Voice, WanJuan-SiLu, THAI SER, LOTUSDIS, ชุดข้อมูล Som TTS, LOTUS และ TSync ของ NECTEC, Thai Elderly Speech, Gowajee และชุด train ของ FLEURS เราขยาย tokenizer ของ NVIDIA ด้วยหน่วยคำภาษาไทย เทรน decoder ใหม่บนคำศัพท์ชุดนั้น โดยเริ่มจาก encoder ของ NVIDIA เทรนทั้งหมด 115,000 ขั้น เห็นเสียงรวมราว 30,700 ชั่วโมง ค่าตั้งทุกค่า รวมถึง blank offset ที่เก็บไว้ในไฟล์ที่เผยแพร่ เลือกจากข้อมูลชุดพัฒนา และไม่มีคลิปใดจากชุดทดสอบข้างต้นถูกใช้เทรน แหล่งข้อมูล จำนวนชั่วโมง และสูตรการเทรนอยู่ในการ์ดโมเดล