Qwen3-ASR
Qwen3-ASR es un modelo de reconocimiento automático del habla multilingüe de última generación. Se ejecuta en el dispositivo con aceleración GPU Metal mediante MLX, con cuantización de 4 bits para un uso eficiente de memoria. Disponible en variantes de 0.6B y 1.7B parámetros.
Pipeline
El pipeline de inferencia de Qwen3-ASR procesa el audio en cuatro etapas:
| Etapa | Descripción |
|---|---|
| Entrada de audio | Audio en bruto remuestreado a 16 kHz mono |
| Espectrograma mel | Características del banco de filtros mel de 128 bins extraídas de la forma de onda |
| Codificador de audio | Transformer de 18 capas con atención por bloques, procesa los fotogramas mel en embeddings de audio |
| Decodificador de texto | Transformer Qwen3 de 28 capas con atención de consulta agrupada (GQA) y embeddings de posición rotatorios (RoPE), genera tokens de texto de forma autorregresiva |
Rendimiento
| Backend | RTF | Memoria pico | Notas |
|---|---|---|---|
| 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 = más rápido que tiempo real.
Variantes del modelo
| Modelo | Backend | Tamaño | 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 |
Uso de CLI
Transcribe un archivo de audio con el modelo Qwen3-ASR por defecto:
.build/release/speech transcribe recording.wav
Opciones
# 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
Usa el módulo Qwen3ASR para transcribir audio programáticamente:
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)
Codificador CoreML (Neural Engine)
Ejecuta el codificador de audio en el Neural Engine mediante CoreML, con el decodificador de texto en GPU mediante MLX. Este enfoque híbrido reduce el consumo de energía y libera la GPU para cargas de trabajo 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 con paleta (180 MB, similitud coseno > 0.999) es la opción por defecto. También está disponible una variante INT4 (90 MB) para despliegues con restricciones de tamaño.
Modo streaming
El modo streaming usa VAD (detección de actividad vocal) para segmentar el audio en chunks y transcribirlos de forma incremental. Es útil para grabaciones largas o procesamiento en tiempo real.
# 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
El flag --max-segment controla la duración máxima del chunk en segundos. El flag --partial habilita la salida de resultados parciales, mostrando palabras a medida que se decodifican.
Formatos soportados
Qwen3-ASR acepta los siguientes formatos de audio. Toda la entrada se remuestrea automáticamente a 16 kHz mono internamente.
- WAV — PCM sin comprimir
- M4A — audio codificado en AAC
- MP3 — MPEG Layer III
- CAF — Apple Core Audio Format
Los modelos se descargan desde HuggingFace en el primer uso y se almacenan en caché en ~/Library/Caches/qwen3-speech/. El modelo 0.6B de 4 bits ocupa aproximadamente 1.5 GB.
¿Necesitas una guía centrada en la decisión? Consulta Qwen3-ASR vs Whisper: precisión, velocidad y memoria.
Cancelación cooperativa
Para la transcripción MLX, Qwen3ASRModel.transcribeCheckingCancellation(audio:sampleRate:options:) lanza CancellationError si detecta la cancelación de la tarea antes de extraer características, codificar, precargar el decodificador o ejecutar un paso de decodificación. El trabajo ya enviado a la GPU puede terminar. Las API síncronas transcribe y transcribeBatch siguen sin lanzar errores e ignoran la cancelación. speech-server usa la entrada compatible con cancelación para Qwen3-ASR.
Presupuesto de caché MLX
Al cargar Qwen3-ASR se limita el conjunto de búferes Metal reutilizables de MLX para todo el proceso: min(1 GiB, RAM / 8) para 0.6B y min(4 GiB, RAM / 4) para 1.7B. Otros modelos MLX comparten este conjunto. Los límites se aplican a los búferes temporales en caché, no a los pesos activos ni al consumo total de memoria del proceso.
El límite efectivo es el menor entre el MLX.Memory.cacheLimit del llamador y los límites de todas las instancias ASR cargadas. Las instancias pueden descargarse en cualquier orden; al descargar o destruir la última, se restaura el presupuesto del llamador. Se conserva cualquier límite más estricto que el llamador establezca mientras los modelos estén cargados.
La transcripción de una sola entrada libera los búferes reutilizables cuando el decodificador retorna o lanza una excepción, incluida la cancelación durante la decodificación. Los arrays activos y los pesos del modelo siguen cargados. El decodificador voraz de transcribeBatch conserva el conjunto limitado entre lotes. No cambian las opciones de la API ni las flags de la CLI.
Vaciar el grupo de búferes reduce la memoria retenida, pero exige nuevas asignaciones en las siguientes solicitudes, por lo que las solicitudes cortas pueden tardar más. Esperar a que termine el trabajo del decodificador ya enviado garantiza la limpieza, incluso al cancelar. La latencia y la memoria del proceso dependen del hardware, del modelo y del audio.