การปรับแนวบังคับ

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-bitaufklarer/Qwen3-ForcedAligner-0.6B-8bit~1.3 GB
MLX bf16aufklarer/Qwen3-ForcedAligner-0.6B-bf16~1.8 GB
CoreML INT4aufklarer/Qwen3-ForcedAligner-0.6B-CoreML-INT4~662 MB
CoreML INT8aufklarer/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 เท่านั้น