Qwen3-ASR
Qwen3-ASR ist ein hochmodernes mehrsprachiges automatisches Spracherkennungsmodell. Es läuft auf dem Gerät mit Metal-GPU-Beschleunigung über MLX, mit 4-Bit-Quantisierung für effiziente Speichernutzung. Verfügbar in Varianten mit 0,6B und 1,7B Parametern.
Pipeline
Die Inferenz-Pipeline von Qwen3-ASR verarbeitet Audio in vier Stufen:
| Stufe | Beschreibung |
|---|---|
| Audio-Eingabe | Rohaudio, neu abgetastet auf 16 kHz Mono |
| Mel-Spektrogramm | Merkmale einer 128-Bin-Mel-Filterbank, aus der Wellenform extrahiert |
| Audio-Encoder | 18-lagiger Transformer mit Block-Attention, verarbeitet Mel-Frames zu Audio-Embeddings |
| Text-Decoder | 28-lagiger Qwen3-Transformer mit Grouped-Query-Attention (GQA) und rotatorischen Positions-Embeddings (RoPE), erzeugt autoregressiv Text-Tokens |
Leistung
| Backend | RTF | Spitzenspeicher | Hinweise |
|---|---|---|---|
| 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 = schneller als Echtzeit.
Modellvarianten
| Modell | Backend | Größe | HuggingFace |
|---|---|---|---|
| Qwen3-ASR-0.6B (4-bit) | MLX | 680 MB | aufklarer/Qwen3-ASR-0.6B-MLX-4bit |
| 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 (8-bit) | MLX | 3,2 GB | aufklarer/Qwen3-ASR-1.7B-MLX-8bit |
CLI-Verwendung
Transkribiere eine Audiodatei mit dem Standard-Qwen3-ASR-Modell:
.build/release/speech transcribe recording.wav
Optionen
# 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
Verwende das Modul Qwen3ASR, um Audio programmatisch zu transkribieren:
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)
Führe den Audio-Encoder über CoreML auf der Neural Engine aus, während der Text-Decoder über MLX auf der GPU läuft. Dieser hybride Ansatz senkt den Energieverbrauch und hält die GPU für parallele Arbeitslasten frei.
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 palettiert (180 MB, Kosinus-Ähnlichkeit > 0,999) ist die Standardeinstellung. Für speicherbeschränkte Bereitstellungen ist außerdem eine INT4-Variante (90 MB) verfügbar.
Streaming-Modus
Der Streaming-Modus verwendet VAD (Sprachaktivitätserkennung), um Audio in Abschnitte zu segmentieren und diese inkrementell zu transkribieren. Das eignet sich gut für lange Aufnahmen oder Echtzeit-Verarbeitung.
# 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
Der Schalter --max-segment steuert die maximale Segmentdauer in Sekunden. Der Schalter --partial aktiviert die Ausgabe von Teilergebnissen und zeigt Wörter an, sobald sie dekodiert werden.
Unterstützte Formate
Qwen3-ASR akzeptiert die folgenden Audioformate. Alle Eingaben werden intern automatisch auf 16 kHz Mono neu abgetastet.
- WAV — unkomprimiertes PCM
- M4A — AAC-kodiertes Audio
- MP3 — MPEG Layer III
- CAF — Apple Core Audio Format
Modelle werden beim ersten Gebrauch von HuggingFace heruntergeladen und in ~/Library/Caches/qwen3-speech/ zwischengespeichert. Das 4-Bit-0,6B-Modell ist ungefähr 1,5 GB groß.
Für eine fokussierte Entscheidungshilfe siehe Qwen3-ASR vs Whisper: Genauigkeit, Tempo und Speicher.
Kooperative Abbruchbehandlung
Bei der MLX-Transkription wirft Qwen3ASRModel.transcribeCheckingCancellation(audio:sampleRate:options:) einen CancellationError, wenn vor der Merkmalsextraktion, der Kodierung, dem Decoder-Prefill oder einem Decodierschritt ein Task-Abbruch erkannt wird. Bereits an die GPU übergebene Arbeit kann noch abgeschlossen werden. Die synchronen APIs transcribe und transcribeBatch bleiben nicht werfend und ignorieren Task-Abbrüche. speech-server nutzt für Qwen3-ASR den Einstiegspunkt mit Abbruchprüfung.
MLX-Cache-Budget
Beim Laden von Qwen3-ASR wird der prozessweit geteilte MLX-Pool wiederverwendbarer Metal-Puffer begrenzt: min(1 GiB, RAM / 8) für 0.6B und min(4 GiB, RAM / 4) für 1.7B. Andere MLX-Modelle nutzen denselben Pool. Die Grenzen gelten für zwischengespeicherte Arbeitspuffer, nicht für aktive Gewichte oder den gesamten Speicherbedarf des Prozesses.
Die wirksame Grenze ist das Minimum aus dem vom Aufrufer gesetzten MLX.Memory.cacheLimit und den Grenzen aller geladenen ASR-Instanzen. Instanzen können in beliebiger Reihenfolge entladen werden. Beim Entladen oder Zerstören der letzten Instanz wird das Budget des Aufrufers wiederhergestellt. Eine währenddessen vom Aufrufer gesetzte strengere Grenze bleibt erhalten.
Bei der Transkription einer einzelnen Eingabe werden wiederverwendbare Puffer freigegeben, wenn der Decoder zurückkehrt oder einen Fehler wirft, auch bei Abbruch während der Decodierung. Aktive Arrays und Modellgewichte bleiben geladen. Der Greedy-Decoder von transcribeBatch behält den begrenzten Pool zwischen Batches. API-Optionen und CLI-Flags ändern sich nicht.
Das Leeren des Pufferpools reduziert den zurückgehaltenen Speicher, erfordert bei späteren Anfragen aber neue Zuweisungen. Kurze Anfragen können deshalb länger dauern. Das Warten auf bereits übermittelte Decoder-Arbeit stellt eine zuverlässige Bereinigung sicher, auch bei einem Abbruch. Latenz und Prozessspeicher hängen von Hardware, Modell und Audio ab.
Optionale Modellverwaltung
SpeechRuntime bietet gemeinsames Laden, abbrechbare FIFO-Zulassung und serielle Ausführung. Qwen3ASRRuntime wählt MLX oder vollständiges CoreML über explizite Deskriptoren; native APIs und CLI-Optionen bleiben verfügbar.
Der Server hält eine Ausführungsfreigabe während der gesamten Anfrage einschließlich Streaming-Ausgabe und lässt bis zu 32 Anfragen warten. ASR-Fehler ergeben HTTP-Fehler oder WebSocket-Fehlerereignisse; gültige leere Transkripte bleiben erfolgreich. Die Wiedergabe behält überzählige Samples. Modelle im Cache und wartende Audiodaten belegen weiterhin Speicher.
Die verwaltete CoreML-Transkription gibt temporäre Puffer nach jeder Anfrage frei, auch bei wiederholten Aufrufen aus einer Hintergrundaufgabe.
import Qwen3ASRRuntime
let runtime = Qwen3ASRRuntime(descriptor: Qwen3ASRDescriptors.small)
let text = try await runtime.transcribe(audio: samples, sampleRate: 16000)
try await runtime.unload()