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 EncoderTransformer 18 ชั้นพร้อม block attention ประมวลผลเฟรม mel เป็น audio embeddings
Text DecoderTransformer Qwen3 28 ชั้นพร้อม grouped-query attention (GQA) และ rotary position embeddings (RoPE) สร้าง token ข้อความแบบ autoregressive

ประสิทธิภาพ

BackendRTFหน่วยความจำสูงสุดหมายเหตุ
Qwen3-ASR 1.7B MLX 5-bit0.0271.92 GBWER 1.32% (new accuracy leader)
Qwen3-ASR 1.7B MLX 8-bit0.0332.7 GBWER 1.52%
Qwen3-ASR 0.6B MLX 8-bit0.0151.3 GBWER 1.82%
Qwen3-ASR 0.6B MLX 5-bit0.0141.03 GBWER 1.74% (near-8-bit at ~4-bit RAM)
Qwen3-ASR 0.6B MLX 4-bit0.0121.0 GBWER 2.20%
Qwen3-ASR 0.6B CoreML INT80.0981.4 GBWER 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)MLX680 MBaufklarer/Qwen3-ASR-0.6B-MLX-4bit
Qwen3-ASR-0.6B (5-bit)MLX1.0 GBaufklarer/Qwen3-ASR-0.6B-MLX-5bit
Qwen3-ASR-0.6B (8-bit)MLX1.0 GBaufklarer/Qwen3-ASR-0.6B-MLX-8bit
Qwen3-ASR-0.6B (CoreML INT8)CoreML180 MBaufklarer/Qwen3-ASR-CoreML
Qwen3-ASR-1.7B (4-bit)MLX2.1 GBaufklarer/Qwen3-ASR-1.7B-MLX-4bit
Qwen3-ASR-1.7B (5-bit)MLX2.3 GBaufklarer/Qwen3-ASR-1.7B-MLX-5bit
Qwen3-ASR-1.7B (8-bit)MLX3.2 GBaufklarer/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 ภายในโดยอัตโนมัติ

ข้อสำคัญ

โมเดลถูกดาวน์โหลดจาก 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()