Qwen3-ASR
Qwen3-ASR — это современная многоязычная модель автоматического распознавания речи. Она работает на устройстве с ускорением на Metal GPU через MLX и использует 4-битную квантизацию для эффективного расхода памяти. Доступна в вариантах на 0.6B и 1.7B параметров.
Пайплайн
Пайплайн инференса Qwen3-ASR обрабатывает аудио в четыре этапа:
| Этап | Описание |
|---|---|
| Аудиовход | Исходное аудио ресемплируется в моно 16 кГц |
| Мел-спектрограмма | 128-канальные признаки мел-фильтрбанка, извлечённые из сигнала |
| Аудиоэнкодер | 18-слойный трансформер с блочным вниманием, преобразует мел-фреймы в аудиоэмбеддинги |
| Текстовый декодер | 28-слойный трансформер Qwen3 с grouped-query attention (GQA) и rotary position embeddings (RoPE), авторегрессивно генерирует текстовые токены |
Производительность
| Бэкенд | 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 ГБ. LibriSpeech test-clean n=200, по одному движку на процесс. RTF < 1.0 = быстрее реального времени.
Варианты модели
| Модель | Бэкенд | Размер | HuggingFace |
|---|---|---|---|
| Qwen3-ASR-0.6B (4-bit) | MLX | 680 МБ | aufklarer/Qwen3-ASR-0.6B-MLX-4bit |
| Qwen3-ASR-0.6B (8-bit) | MLX | 1.0 ГБ | aufklarer/Qwen3-ASR-0.6B-MLX-8bit |
| Qwen3-ASR-0.6B (CoreML INT8) | CoreML | 180 МБ | aufklarer/Qwen3-ASR-CoreML |
| Qwen3-ASR-1.7B (4-bit) | MLX | 2.1 ГБ | aufklarer/Qwen3-ASR-1.7B-MLX-4bit |
| Qwen3-ASR-1.7B (8-bit) | MLX | 3.2 ГБ | 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)
Запускайте аудиоэнкодер на Neural Engine через CoreML, а текстовый декодер — на 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 (180 МБ, косинусное сходство > 0.999) используется по умолчанию. Также доступен вариант INT4 (90 МБ) для развёртываний с ограничениями по размеру.
Потоковый режим
Потоковый режим использует 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 кГц.
- WAV — несжатый PCM
- M4A — аудио, закодированное в AAC
- MP3 — MPEG Layer III
- CAF — Apple Core Audio Format
Модели скачиваются с HuggingFace при первом использовании и кэшируются в ~/Library/Caches/qwen3-speech/. 4-битная модель 0.6B весит примерно 1.5 ГБ.
Для сфокусированного выбора смотрите 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. Экземпляры можно выгружать в любом порядке. После выгрузки или уничтожения последнего экземпляра восстанавливается бюджет вызывающей стороны. Более строгий лимит, установленный ею во время работы моделей, сохраняется.
При транскрипции одного входа повторно используемые буферы освобождаются при возврате из декодера или выбросе ошибки, включая отмену во время декодирования. Активные массивы и веса модели остаются загруженными. Жадный декодер transcribeBatch сохраняет ограниченный пул между пакетами. Параметры API и флаги CLI не меняются.
Очистка пула буферов уменьшает удерживаемую память, но требует новых выделений при следующих запросах, поэтому короткие запросы могут занимать больше времени. Ожидание завершения уже отправленной работы декодера обеспечивает надёжную очистку, в том числе при отмене. Задержка и память процесса зависят от оборудования, модели и аудио.