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 ไม่เปลี่ยนแปลง
การล้างพูลบัฟเฟอร์ช่วยลดหน่วยความจำที่เก็บไว้ แต่คำขอถัดไปต้องจัดสรรใหม่ จึงอาจทำให้คำขอสั้นใช้เวลานานขึ้น การรอให้งานตัวถอดรหัสที่ส่งไปแล้วเสร็จสิ้นช่วยให้การล้างหน่วยความจำแน่นอน รวมถึงเมื่อยกเลิกด้วย เวลาแฝงและหน่วยความจำของโปรเซสขึ้นอยู่กับฮาร์ดแวร์ โมเดล และเสียง
การจัดการโมเดลแบบเลือกใช้
SpeechRuntime รองรับการโหลดร่วมกัน การรับงาน FIFO ที่ยกเลิกได้ และการรันตามลำดับ Qwen3ASRRuntime เลือก MLX หรือ CoreML แบบเต็มผ่านตัวอธิบายที่ชัดเจน โดยยังใช้ API ดั้งเดิมและตัวเลือก CLI ได้
เซิร์ฟเวอร์ถือสิทธิ์รันตลอดคำขอ รวมถึงเอาต์พุตสตรีม และให้รอได้สูงสุด 32 คำขอ ความล้มเหลว ASR ส่งเป็นข้อผิดพลาด HTTP หรือเหตุการณ์ผิดพลาด WebSocket ส่วนผลถอดเสียงว่างที่ถูกต้องยังสำเร็จ การเล่นเสียงเก็บตัวอย่างที่ล้นไว้ โมเดลในแคชและเสียงรอเล่นยังใช้หน่วยความจำ
การถอดเสียง CoreML แบบมีตัวจัดการจะคืนหน่วยความจำบัฟเฟอร์ชั่วคราวหลังแต่ละคำขอ รวมถึงการเรียกซ้ำจากงานเบื้องหลัง
import Qwen3ASRRuntime
let runtime = Qwen3ASRRuntime(descriptor: Qwen3ASRDescriptors.small)
let text = try await runtime.transcribe(audio: samples, sampleRate: 16000)
try await runtime.unload()