Qwen3-ASR
Qwen3-ASR est un modèle de reconnaissance automatique de la parole multilingue à la pointe de la technologie. Il s'exécute sur l'appareil avec accélération GPU Metal via MLX, avec quantification 4 bits pour une utilisation mémoire efficace. Disponible en variantes de 0,6 Mrd et 1,7 Mrd de paramètres.
Pipeline
Le pipeline d'inférence de Qwen3-ASR traite l'audio en quatre étapes :
| Étape | Description |
|---|---|
| Entrée audio | Audio brut rééchantillonné à 16 kHz mono |
| Spectrogramme mel | Caractéristiques de banc de filtres mel à 128 bins extraites de la forme d'onde |
| Encodeur audio | Transformeur à 18 couches avec attention par blocs, transforme les trames mel en embeddings audio |
| Décodeur de texte | Transformeur Qwen3 à 28 couches avec attention à requêtes groupées (GQA) et embeddings de position rotatifs (RoPE), génère les tokens de texte de façon autorégressive |
Performance
| Backend | RTF | Mémoire de pointe | Notes |
|---|---|---|---|
| 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 Go. LibriSpeech test-clean n=200, un processus par moteur. RTF < 1,0 = plus rapide que le temps réel.
Variantes du modèle
| Modèle | Backend | Taille | HuggingFace |
|---|---|---|---|
| Qwen3-ASR-0.6B (4-bit) | MLX | 680 Mo | aufklarer/Qwen3-ASR-0.6B-MLX-4bit |
| Qwen3-ASR-0.6B (8-bit) | MLX | 1,0 Go | aufklarer/Qwen3-ASR-0.6B-MLX-8bit |
| Qwen3-ASR-0.6B (CoreML INT8) | CoreML | 180 Mo | aufklarer/Qwen3-ASR-CoreML |
| Qwen3-ASR-1.7B (4-bit) | MLX | 2,1 Go | aufklarer/Qwen3-ASR-1.7B-MLX-4bit |
| Qwen3-ASR-1.7B (8-bit) | MLX | 3,2 Go | aufklarer/Qwen3-ASR-1.7B-MLX-8bit |
Utilisation en CLI
Transcrivez un fichier audio avec le modèle Qwen3-ASR par défaut :
.build/release/speech transcribe recording.wav
Options
# 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
Utilisez le module Qwen3ASR pour transcrire l'audio par programmation :
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)
Encodeur CoreML (Neural Engine)
Exécutez l'encodeur audio sur le Neural Engine via CoreML, avec le décodeur de texte sur GPU via MLX. Cette approche hybride réduit la consommation d'énergie et libère le GPU pour les charges de travail concurrentes.
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 palettisé (180 Mo, similarité cosinus > 0,999) est le choix par défaut. Une variante INT4 (90 Mo) est également disponible pour les déploiements contraints en taille.
Mode streaming
Le mode streaming utilise la VAD (détection d'activité vocale) pour segmenter l'audio en fragments et les transcrire de façon incrémentale. Utile pour les enregistrements longs ou le traitement temps réel.
# 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
L'option --max-segment contrôle la durée maximale des fragments en secondes. L'option --partial active la sortie des résultats partiels, affichant les mots à mesure qu'ils sont décodés.
Formats pris en charge
Qwen3-ASR accepte les formats audio suivants. Toutes les entrées sont automatiquement rééchantillonnées à 16 kHz mono en interne.
- WAV — PCM non compressé
- M4A — audio encodé en AAC
- MP3 — MPEG Layer III
- CAF — Apple Core Audio Format
Les modèles sont téléchargés depuis HuggingFace à la première utilisation et mis en cache dans ~/Library/Caches/qwen3-speech/. Le modèle 0.6B 4 bits occupe environ 1,5 Go.
Pour un guide de choix ciblé, consultez Qwen3-ASR vs Whisper : précision, vitesse et mémoire.
Annulation coopérative
Pour la transcription MLX, Qwen3ASRModel.transcribeCheckingCancellation(audio:sampleRate:options:) lève CancellationError si une annulation est détectée avant l’extraction des caractéristiques, l’encodage, le préremplissage du décodeur ou une étape de décodage. Le travail déjà soumis au GPU peut se terminer. Les API synchrones transcribe et transcribeBatch conservent leur comportement sans exception et ignorent l’annulation. speech-server utilise le point d’entrée prenant en charge l’annulation pour Qwen3-ASR.
Budget du cache MLX
Le chargement de Qwen3-ASR limite le pool de tampons Metal réutilisables de MLX, partagé par tout le processus : min(1 GiB, RAM / 8) pour 0.6B et min(4 GiB, RAM / 4) pour 1.7B. Les autres modèles MLX partagent ce pool. Ces plafonds concernent les tampons temporaires en cache, pas les poids actifs ni la mémoire totale du processus.
La limite effective est le minimum entre le MLX.Memory.cacheLimit défini par l’appelant et les plafonds de toutes les instances ASR chargées. Les instances peuvent être déchargées dans n’importe quel ordre. Le déchargement ou la destruction de la dernière instance restaure le budget de l’appelant. Une limite plus stricte définie par l’appelant pendant le chargement des modèles est conservée.
La transcription d’une seule entrée libère les tampons réutilisables lorsque le décodeur retourne ou lève une exception, y compris lors d’une annulation pendant le décodage. Les tableaux actifs et les poids du modèle restent chargés. Le décodeur glouton de transcribeBatch conserve le pool limité entre les lots. Les options de l’API et les paramètres CLI ne changent pas.
Vider le pool de tampons réduit la mémoire conservée, mais impose de nouvelles allocations aux requêtes suivantes ; les requêtes courtes peuvent donc prendre plus de temps. Attendre la fin du travail du décodeur déjà soumis garantit le nettoyage, y compris lors d’une annulation. La latence et la mémoire du processus dépendent du matériel, du modèle et de l’audio.