การปรับแนวบังคับ
Qwen3-ForcedAligner ให้บริการการปรับแนวไทม์สแตมป์ระดับคำสำหรับเสียง โดยทำ forward pass แบบไม่ใช่ autoregressive เพียงครั้งเดียวเพื่อปรับแนวแต่ละคำในข้อความถอดเสียงให้ตรงกับตำแหน่งที่แม่นยำในรูปคลื่นเสียง
หลักการทำงาน
Aligner ใช้การปรับแนว CTC (Connectionist Temporal Classification) ร่วมกับขั้นตอนแก้ไขความเป็นโมโนโทนิกด้วย LIS (Longest Increasing Subsequence) ซึ่งทำให้ไทม์สแตมป์เรียงลำดับเสมอ แม้ว่าผลลัพธ์ CTC ดิบจะมีความไม่สอดคล้องเล็กน้อย
| คุณสมบัติ | ค่า |
|---|---|
| วิธีการปรับแนว | CTC พร้อมการแก้ไขความเป็นโมโนโทนิก LIS |
| ความละเอียดไทม์สแตมป์ | 80 ms |
| คลาสเอาต์พุต | 5000 |
| โหมดอินเฟอเรนซ์ | ไม่ใช่ autoregressive (forward pass ครั้งเดียว) |
การใช้งาน CLI
ปรับแนวไฟล์เสียง หากไม่ให้ข้อความถอดเสียงไว้ ระบบจะถอดเสียงโดยอัตโนมัติก่อนด้วย Qwen3-ASR
.build/release/speech align recording.wav
ให้ข้อความถอดเสียงที่ทราบล่วงหน้าเพื่อข้ามการถอดเสียงอัตโนมัติ:
.build/release/speech align recording.wav --text "The quick brown fox jumps over the lazy dog"
ตัวเลือก
# Specify transcript text directly
.build/release/speech align recording.wav --text "known transcript"
# Choose ASR model for auto-transcription step
.build/release/speech align recording.wav --model 1.7b
# Specify aligner model variant
.build/release/speech align recording.wav --aligner-model default
# Set language
.build/release/speech align recording.wav --language en
การรองรับภาษา
ส่ง --language ให้ตรงกับภาษาของเสียง โมเดลถูกฝึกอย่างเป็นทางการบน 11 ภาษา (en, zh, ja, ko, es, fr, de, ru, it, pt, ar); ตัวประมวลผลล่วงหน้ายังสามารถแบ่ง morpheme ภาษาญี่ปุ่น คำภาษาเกาหลี ตัวอักษรแต่ละตัวภาษาจีน และภาษาไทย / ลาว / เขมร / พม่า / ทิเบต ได้แบบเนทีฟผ่าน NLTokenizer ของ Apple เครื่องหมายประกอบ (สระ Devanagari, สระไทย ฯลฯ) จะคงสภาพไว้เพื่อให้คำอย่าง नमस्ते และ สวัสดี ยังสมบูรณ์
ตัวแปรของโมเดล
มีตัวแปรของโมเดลหลายแบบให้เลือก แลกขนาดกับความแม่นยำ:
| ตัวแปร | Model ID | ขนาด |
|---|---|---|
| MLX 4-bit (ดีฟอลต์) | aufklarer/Qwen3-ForcedAligner-0.6B-4bit | ~979 MB |
| MLX 8-bit | aufklarer/Qwen3-ForcedAligner-0.6B-8bit | ~1.3 GB |
| MLX bf16 | aufklarer/Qwen3-ForcedAligner-0.6B-bf16 | ~1.8 GB |
| CoreML INT4 | aufklarer/Qwen3-ForcedAligner-0.6B-CoreML-INT4 | ~662 MB |
| CoreML INT8 | aufklarer/Qwen3-ForcedAligner-0.6B-CoreML-INT8 | ~1.1 GB |
เลือกตัวแปรด้วย --aligner-model:
.build/release/speech align recording.wav --aligner-model aufklarer/Qwen3-ForcedAligner-0.6B-8bit
รูปแบบเอาต์พุต
Aligner แสดงผลหนึ่งบรรทัดต่อคำพร้อมไทม์สแตมป์เริ่มต้นและสิ้นสุดเป็นวินาที:
[0.24 - 0.48] The
[0.48 - 0.72] quick
[0.72 - 1.04] brown
[1.04 - 1.36] fox
[1.36 - 1.68] jumps
[1.68 - 1.92] over
[1.92 - 2.08] the
[2.08 - 2.40] lazy
[2.40 - 2.80] dog
คู่ไทม์สแตมป์แต่ละคู่บ่งบอกเวลาเริ่มต้นและสิ้นสุดของคำในเสียง ที่ความละเอียด 80 ms
การจัดการเสียงยาว
หัว classify สามารถระบุได้สูงสุด 400 วินาทีในหลักการ (5000 คลาส × 80 ms) แต่บน Qwen3-ForcedAligner-0.6B ที่เผยแพร่จริงนั้น โมเดลถูกฝึกอย่างเชื่อถือได้ถึงประมาณ 270 วินาที เท่านั้น เมื่อเกินจุดนี้ โมเดลจะส่งดัชนีไทม์สแตมป์ที่มีสัญญาณรบกวน และการประมวลผลหลัง LIS จะรวบทุกคำท้ายให้อยู่ที่ไทม์สแตมป์เดียวกัน
CLI จัดการเรื่องนี้โดยอัตโนมัติ: เสียงยาวจะถูกแบ่ง chunk ที่จุดอิ่มตัวและปรับแนวใหม่ คุณจะเห็นข้อความบรรทัดเดียวเมื่อการแบ่ง chunk เริ่มทำงาน:
Audio 306.2s saturated after word 690 (272.6s); chunking remaining 33.6s (pass 2)
ตั้งค่า ALIGN_DEBUG=1 เพื่อ dump ดัชนีไทม์สแตมป์ดิบและที่แก้ไขแล้วเมื่อสืบสวนเอาต์พุตที่เลื่อนตำแหน่ง
ข้อจำกัดที่ทราบ: ส่วนที่ไม่มีเสียงพูดนำหน้า
เมื่อเสียงเริ่มต้นด้วยส่วนที่ไม่มีเสียงพูด (อินโทรเพลง ความเงียบยาว) โมเดลมักจะปั๊มไทม์สแตมป์ของคำแรกใกล้ 0 วินาที เพราะตัวแบ่งประเภทไม่มีแนวคิดเรื่อง "เสียงพูดยังไม่เริ่ม" วิธีแก้: ตัดส่วนที่ไม่มีเสียงพูดนำหน้าก่อนการปรับแนว หรือใช้ VAD รอบแรกด้วย Silero เพื่อค้นหาจุดเริ่มต้นเสียงพูดจริง
เมื่อไม่ได้ระบุ --text aligner จะรันการถอดเสียง Qwen3-ASR แบบเต็มรอบก่อน แล้วจึงปรับแนวข้อความที่ได้ ซึ่งหมายความว่ารอบแรกจะโหลดทั้งโมเดล ASR และโมเดล aligner การระบุ --text จะข้ามขั้นตอน ASR และโหลดเฉพาะ aligner เท่านั้น