Qwen3-ASR
Qwen3-ASR เป็นโมเดลการรู้จำเสียงพูดอัตโนมัติหลายภาษาที่ทันสมัยที่สุด ทำงานบนอุปกรณ์โดยใช้การเร่งความเร็ว GPU แบบ Metal ผ่าน MLX พร้อมการควอนไทซ์ 4-bit เพื่อใช้หน่วยความจำอย่างมีประสิทธิภาพ มีให้เลือกสองรุ่นคือ 0.6B และ 1.7B พารามิเตอร์
Pipeline
Pipeline การอนุมานของ Qwen3-ASR ประมวลผลเสียงผ่านสี่ขั้นตอน:
| ขั้นตอน | คำอธิบาย |
|---|---|
| อินพุตเสียง | เสียงดิบถูกสุ่มตัวอย่างใหม่เป็น 16 kHz mono |
| Mel Spectrogram | คุณลักษณะ mel filterbank แบบ 128 bin สกัดจากรูปคลื่น |
| Audio Encoder | Transformer 18 ชั้นพร้อม block attention ประมวลผลเฟรม mel เป็น audio embeddings |
| Text Decoder | Transformer Qwen3 28 ชั้นพร้อม grouped-query attention (GQA) และ rotary position embeddings (RoPE) สร้าง token ข้อความแบบ autoregressive |
ประสิทธิภาพ
| Backend | RTF | หน่วยความจำสูงสุด | หมายเหตุ |
|---|---|---|---|
| Qwen3-ASR 1.7B MLX 5-bit | 0.027 | 1.92 GB | WER 1.32% (new accuracy leader) |
| Qwen3-ASR 1.7B MLX 8-bit | 0.033 | 2.7 GB | WER 1.52% |
| Qwen3-ASR 0.6B MLX 8-bit | 0.015 | 1.3 GB | WER 1.82% |
| Qwen3-ASR 0.6B MLX 5-bit | 0.014 | 1.03 GB | WER 1.74% (near-8-bit at ~4-bit RAM) |
| Qwen3-ASR 0.6B MLX 4-bit | 0.012 | 1.0 GB | WER 2.20% |
| Qwen3-ASR 0.6B CoreML INT8 | 0.098 | 1.4 GB | WER 3.02% (chunked-attn rebuild) |
Apple M5 Pro, 48 GB. LibriSpeech test-clean n=200, isolated per-engine. RTF < 1.0 = เร็วกว่าเรียลไทม์
รุ่นของโมเดล
| โมเดล | Backend | ขนาด | HuggingFace |
|---|---|---|---|
| Qwen3-ASR-0.6B (4-bit) | MLX | 680 MB | aufklarer/Qwen3-ASR-0.6B-MLX-4bit |
| Qwen3-ASR-0.6B (5-bit) | MLX | 1.0 GB | aufklarer/Qwen3-ASR-0.6B-MLX-5bit |
| Qwen3-ASR-0.6B (8-bit) | MLX | 1.0 GB | aufklarer/Qwen3-ASR-0.6B-MLX-8bit |
| Qwen3-ASR-0.6B (CoreML INT8) | CoreML | 180 MB | aufklarer/Qwen3-ASR-CoreML |
| Qwen3-ASR-1.7B (4-bit) | MLX | 2.1 GB | aufklarer/Qwen3-ASR-1.7B-MLX-4bit |
| Qwen3-ASR-1.7B (5-bit) | MLX | 2.3 GB | aufklarer/Qwen3-ASR-1.7B-MLX-5bit |
| Qwen3-ASR-1.7B (8-bit) | MLX | 3.2 GB | aufklarer/Qwen3-ASR-1.7B-MLX-8bit |
การใช้งาน CLI
ถอดเสียงจากไฟล์เสียงด้วยโมเดล Qwen3-ASR ค่าเริ่มต้น:
.build/release/speech transcribe recording.wav
ตัวเลือก
# Use the larger 1.7B model
.build/release/speech transcribe recording.wav --model 1.7b
# Specify language
.build/release/speech transcribe recording.wav --language en
# Streaming mode with partial results
.build/release/speech transcribe recording.wav --stream --partial
API ของ Swift
ใช้โมดูล Qwen3ASR เพื่อถอดเสียงจากโค้ด:
import Qwen3ASR
// Load the model (downloads from HuggingFace on first use)
let model = try await Qwen3ASRModel.fromPretrained()
// Transcribe audio samples (16 kHz mono Float)
let text = model.transcribe(audio: audioSamples, sampleRate: 16000)
print(text)
CoreML Encoder (Neural Engine)
รัน audio encoder บน Neural Engine ผ่าน CoreML ส่วน text decoder รันบน GPU ผ่าน MLX วิธีไฮบริดนี้ช่วยลดการใช้พลังงานและปลดปล่อย GPU สำหรับงานคู่ขนาน
import Qwen3ASR
let encoder = try await CoreMLASREncoder.fromPretrained()
let model = try await Qwen3ASRModel.fromPretrained()
let text = try model.transcribe(
audio: samples, sampleRate: 16000,
coremlEncoder: encoder
)
# CLI
.build/release/speech transcribe recording.wav --engine qwen3-coreml
รุ่น INT8 palettized (180 MB, cosine similarity > 0.999) เป็นค่าเริ่มต้น ส่วนรุ่น INT4 (90 MB) มีให้ใช้สำหรับการดีพลอยที่จำกัดขนาด
โหมดสตรีมมิ่ง
โหมดสตรีมมิ่งใช้ VAD (การตรวจจับกิจกรรมเสียงพูด) เพื่อตัดเสียงออกเป็นช่วง ๆ และถอดเสียงทีละส่วน เหมาะกับการบันทึกเสียงยาว ๆ หรือการประมวลผลแบบเรียลไทม์
# Stream with default segment size
.build/release/speech transcribe recording.wav --stream
# Control maximum segment duration
.build/release/speech transcribe recording.wav --stream --max-segment 15
# Show partial (in-progress) results as they arrive
.build/release/speech transcribe recording.wav --stream --partial
แฟล็ก --max-segment ควบคุมระยะเวลาสูงสุดของ chunk เป็นวินาที แฟล็ก --partial เปิดการแสดงผลลัพธ์บางส่วน โดยแสดงคำตามที่ถูกถอดออกมา
ฟอร์แมตที่รองรับ
Qwen3-ASR รองรับฟอร์แมตเสียงต่อไปนี้ ทุกอินพุตจะถูกสุ่มตัวอย่างใหม่เป็น 16 kHz mono ภายในโดยอัตโนมัติ
- WAV — PCM ที่ไม่มีการบีบอัด
- M4A — เสียงที่เข้ารหัสด้วย AAC
- MP3 — MPEG Layer III
- CAF — Apple Core Audio Format
โมเดลถูกดาวน์โหลดจาก HuggingFace ในการใช้งานครั้งแรกและถูกแคชไว้ที่ ~/Library/Caches/qwen3-speech/ โมเดล 0.6B แบบ 4-bit มีขนาดประมาณ 1.5 GB
หากต้องการคู่มือเลือกแบบเจาะจง ดู Qwen3-ASR vs Whisper: ความแม่นยำ ความเร็ว และหน่วยความจำ
การยกเลิกแบบร่วมมือ
สำหรับการถอดเสียงด้วย MLX เมธอด Qwen3ASRModel.transcribeCheckingCancellation(audio:sampleRate:options:) จะโยน CancellationError เมื่อตรวจพบการยกเลิกงานก่อนการสกัดคุณลักษณะ การเข้ารหัส การเติมข้อมูลล่วงหน้าให้ตัวถอดรหัส หรือขั้นตอนการถอดรหัส งานที่ส่งไปยัง GPU แล้วอาจทำงานจนเสร็จ API แบบซิงโครนัส transcribe และ transcribeBatch ยังคงไม่โยนข้อผิดพลาดและไม่สนใจการยกเลิกงาน speech-server ใช้จุดเรียกเข้าที่รองรับการยกเลิกสำหรับ Qwen3-ASR
ขีดจำกัดแคช MLX
การโหลด Qwen3-ASR จะจำกัดพูลบัฟเฟอร์ Metal ที่นำกลับมาใช้ได้ของ MLX ซึ่งใช้ร่วมกันทั้งโปรเซส: min(1 GiB, RAM / 8) สำหรับ 0.6B และ min(4 GiB, RAM / 4) สำหรับ 1.7B โมเดล MLX อื่นใช้พูลนี้ร่วมกัน ขีดจำกัดนี้ใช้กับบัฟเฟอร์ชั่วคราวที่เก็บในแคช ไม่ใช่น้ำหนักที่ใช้งานอยู่หรือหน่วยความจำรวมของโปรเซส
ขีดจำกัดจริงคือค่าต่ำสุดระหว่าง MLX.Memory.cacheLimit ที่ผู้เรียกกำหนดไว้กับขีดจำกัดของอินสแตนซ์ ASR ที่โหลดอยู่ทั้งหมด สามารถยกเลิกการโหลดอินสแตนซ์ในลำดับใดก็ได้ เมื่อยกเลิกการโหลดหรือทำลายอินสแตนซ์สุดท้าย จะคืนค่าขีดจำกัดของผู้เรียก หากผู้เรียกกำหนดขีดจำกัดที่เข้มงวดกว่าในขณะที่โมเดลยังโหลดอยู่ ค่านั้นจะยังคงอยู่
การถอดเสียงจากอินพุตเดียวจะปล่อยบัฟเฟอร์ที่นำกลับมาใช้ได้เมื่อดีโคเดอร์คืนค่าหรือโยนข้อผิดพลาด รวมถึงเมื่อยกเลิกระหว่างการถอดรหัส อาร์เรย์ที่ใช้งานอยู่และน้ำหนักโมเดลยังคงโหลดอยู่ ดีโคเดอร์แบบ greedy ของ transcribeBatch จะเก็บพูลที่มีขีดจำกัดไว้ระหว่างแบตช์ ตัวเลือก API และแฟล็ก CLI ไม่เปลี่ยนแปลง
การล้างพูลบัฟเฟอร์ช่วยลดหน่วยความจำที่เก็บไว้ แต่คำขอถัดไปต้องจัดสรรใหม่ จึงอาจทำให้คำขอสั้นใช้เวลานานขึ้น การรอให้งานตัวถอดรหัสที่ส่งไปแล้วเสร็จสิ้นช่วยให้การล้างหน่วยความจำแน่นอน รวมถึงเมื่อยกเลิกด้วย เวลาแฝงและหน่วยความจำของโปรเซสขึ้นอยู่กับฮาร์ดแวร์ โมเดล และเสียง