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-bit0.0271.92 GBWER 1.32% (new accuracy leader)
Qwen3-ASR 1.7B MLX 8-bit0.0332.7 GBWER 1.52%
Qwen3-ASR 0.6B MLX 8-bit0.0151.3 GBWER 1.82%
Qwen3-ASR 0.6B MLX 5-bit0.0141.03 GBWER 1.74% (near-8-bit at ~4-bit RAM)
Qwen3-ASR 0.6B MLX 4-bit0.0121.0 GBWER 2.20%
Qwen3-ASR 0.6B CoreML INT80.0981.4 GBWER 3.02% (chunked-attn rebuild)

Apple M5 Pro, 48 ГБ. LibriSpeech test-clean n=200, по одному движку на процесс. RTF < 1.0 = быстрее реального времени.

Варианты модели

МодельБэкендРазмерHuggingFace
Qwen3-ASR-0.6B (4-bit)MLX680 МБaufklarer/Qwen3-ASR-0.6B-MLX-4bit
Qwen3-ASR-0.6B (8-bit)MLX1.0 ГБaufklarer/Qwen3-ASR-0.6B-MLX-8bit
Qwen3-ASR-0.6B (CoreML INT8)CoreML180 МБaufklarer/Qwen3-ASR-CoreML
Qwen3-ASR-1.7B (4-bit)MLX2.1 ГБaufklarer/Qwen3-ASR-1.7B-MLX-4bit
Qwen3-ASR-1.7B (8-bit)MLX3.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 кГц.

Важно

Модели скачиваются с 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 не меняются.

Очистка пула буферов уменьшает удерживаемую память, но требует новых выделений при следующих запросах, поэтому короткие запросы могут занимать больше времени. Ожидание завершения уже отправленной работы декодера обеспечивает надёжную очистку, в том числе при отмене. Задержка и память процесса зависят от оборудования, модели и аудио.