Qwen3-ASR
Qwen3-ASR은 최첨단 다언어 자동 음성 인식 모델입니다. MLX를 통한 Metal GPU 가속으로 온디바이스에서 실행되며, 효율적인 메모리 사용을 위해 4비트 양자화를 지원합니다. 0.6B와 1.7B 파라미터 변형으로 제공됩니다.
파이프라인
Qwen3-ASR 추론 파이프라인은 오디오를 4단계로 처리합니다:
| 단계 | 설명 |
|---|---|
| 오디오 입력 | 원본 오디오를 16 kHz 모노로 리샘플링 |
| 멜 스펙트로그램 | 파형에서 128 빈 멜 필터뱅크 특징 추출 |
| 오디오 인코더 | 블록 어텐션을 사용하는 18 레이어 트랜스포머, 멜 프레임을 오디오 임베딩으로 처리 |
| 텍스트 디코더 | 그룹 쿼리 어텐션(GQA)과 로터리 위치 임베딩(RoPE)을 사용하는 28 레이어 Qwen3 트랜스포머, 자동 회귀적으로 텍스트 토큰을 생성 |
성능
| 백엔드 | 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 = 실시간보다 빠름.
모델 변형
| 모델 | 백엔드 | 크기 | HuggingFace |
|---|---|---|---|
| Qwen3-ASR-0.6B (4비트) | MLX | 680 MB | aufklarer/Qwen3-ASR-0.6B-MLX-4bit |
| Qwen3-ASR-0.6B (8비트) | 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비트) | MLX | 2.1 GB | aufklarer/Qwen3-ASR-1.7B-MLX-4bit |
| Qwen3-ASR-1.7B (8비트) | 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
Swift API
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 인코더 (Neural Engine)
MLX를 통해 텍스트 디코더를 GPU에서 실행하면서, CoreML을 통해 오디오 인코더를 Neural Engine에서 실행합니다. 이 하이브리드 방식은 전력 소비를 낮추고 동시 작업을 위해 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 팔레타이즈(180 MB, 코사인 유사도 > 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 플래그는 최대 청크 길이를 초 단위로 제어합니다. --partial 플래그는 디코딩된 단어를 표시하는 부분 결과 출력을 활성화합니다.
지원 포맷
Qwen3-ASR은 다음 오디오 포맷을 수용합니다. 모든 입력은 내부적으로 자동으로 16 kHz 모노로 리샘플링됩니다.
- WAV — 비압축 PCM
- M4A — AAC 인코딩 오디오
- MP3 — MPEG Layer III
- CAF — Apple Core Audio Format
모델은 첫 사용 시 HuggingFace에서 다운로드되어 ~/Library/Caches/qwen3-speech/에 캐시됩니다. 4비트 0.6B 모델은 약 1.5 GB입니다.
선택에 집중한 가이드는 Qwen3-ASR vs Whisper: 정확도, 속도, 메모리를 보세요.
협력적 취소
MLX 전사에서 Qwen3ASRModel.transcribeCheckingCancellation(audio:sampleRate:options:)는 특징 추출, 인코딩, 디코더 프리필 또는 디코딩 단계 전에 작업 취소를 감지하면 CancellationError를 던집니다. 이미 제출된 GPU 작업은 완료될 수 있습니다. 동기 transcribe 및 transcribeBatch API는 오류를 던지지 않는 동작을 유지하며 작업 취소를 무시합니다. speech-server는 Qwen3-ASR에 취소를 지원하는 진입점을 사용합니다.
MLX 캐시 한도
Qwen3-ASR을 로드하면 프로세스 전체에서 공유하는 MLX의 재사용 가능한 Metal 버퍼 풀에 한도가 설정됩니다. 0.6B는 min(1 GiB, RAM / 8), 1.7B는 min(4 GiB, RAM / 4)를 사용합니다. 다른 MLX 모델도 이 풀을 공유합니다. 이 한도는 캐시된 임시 버퍼에 적용되며, 사용 중인 가중치나 프로세스의 전체 메모리 사용량을 제한하지 않습니다.
실제 한도는 호출자가 설정한 MLX.Memory.cacheLimit와 로드된 모든 ASR 인스턴스의 한도 중 가장 작은 값입니다. 인스턴스는 어떤 순서로든 언로드할 수 있습니다. 마지막 인스턴스가 언로드되거나 소멸하면 호출자의 한도가 복원됩니다. 모델을 로드한 동안 호출자가 설정한 더 엄격한 한도도 유지됩니다.
단일 입력 전사는 디코더가 반환하거나 오류를 던질 때 재사용 가능한 버퍼를 정리합니다. 디코딩 중 취소도 포함됩니다. 사용 중인 배열과 모델 가중치는 그대로 유지됩니다. 탐욕적 transcribeBatch 디코더는 배치 사이에도 한도가 적용된 풀을 유지합니다. API 옵션이나 CLI 플래그는 바뀌지 않습니다.
버퍼 풀을 비우면 유지되는 메모리는 줄지만 이후 요청에서 새로 할당해야 하므로 짧은 요청은 더 오래 걸릴 수 있습니다. 이미 제출된 디코더 작업이 끝날 때까지 기다리면 취소 시에도 정리 결과를 보장할 수 있습니다. 실제 지연 시간과 프로세스 메모리는 하드웨어, 모델, 오디오에 따라 달라집니다.