Omnilingual ASR
Omnilingual ASR от Meta — это семейство языконезависимого распознавания речи, охватывающее 1 672 языка в 32 различных письменностях — самое широкое языковое покрытие среди всех on-device ASR-моделей на Apple Silicon. Soniqo портирует CTC-вариант как на CoreML (Neural Engine), так и на MLX (Metal GPU) в четырёх размерах от 300M до 7B параметров.
В отличие от Qwen3-ASR или Parakeet TDT, Omnilingual CTC не принимает подсказку языка во время инференса — он использует общий SentencePiece-словарь из 10 288 записей, охватывающий все поддерживаемые языки. Подайте любое аудио на любом поддерживаемом языке, и модель автоматически выдаст правильную письменность.
Архитектура
Omnilingual CTC — это supervised fine-tune бэкбона wav2vec 2.0 от Meta с линейной CTC-головой над общим многоязычным словарём. Пайплайн параллельный и неавторегрессивный — один прямой проход на реплику, без цикла декодера.
raw audio [1, samples]
→ wav2vec2 feature extractor (7 strided CNN layers, ×320 downsample)
→ weight-normalised Conv1d positional encoder
→ N × pre-norm Transformer encoder layers
→ final layer norm
→ linear CTC head → logits [1, T, 10288]
При входе 16 кГц даунсэмплированный в 320 раз encoder выдаёт частоту кадров 50 Гц. 10-секундный клип даёт 499 кадров логитов. Жадное CTC-декодирование сливает подряд идущие дубликаты и пропускает специальные токены через SentencePiece-токенизатор.
Варианты модели
Десять вариантов опубликованы под namespace aufklarer на HuggingFace — два размера CoreML-окна плюс восемь комбинаций квантизации MLX:
| Вариант | Слои | Dim | Heads | Размер | Runtime |
|---|---|---|---|---|---|
| CTC-300M-CoreML-INT8 (окно 5 с) | 24 | 1024 | 16 | 312 МБ | Neural Engine |
| CTC-300M-CoreML-INT8 (окно 10 с) | 24 | 1024 | 16 | 312 МБ | Neural Engine |
| CTC-300M-MLX-4bit | 24 | 1024 | 16 | 193 МБ | Metal GPU |
| CTC-300M-MLX-8bit | 24 | 1024 | 16 | 342 МБ | Metal GPU |
| CTC-1B-MLX-4bit | 48 | 1280 | 20 | 549 МБ | Metal GPU |
| CTC-1B-MLX-8bit | 48 | 1280 | 20 | 1006 МБ | Metal GPU |
| CTC-3B-MLX-4bit | 60 | 2048 | 32 | 1.71 ГБ | Metal GPU |
| CTC-3B-MLX-8bit | 60 | 2048 | 32 | 3.16 ГБ | Metal GPU |
| CTC-7B-MLX-4bit | 128 | 2048 | 32 | 3.55 ГБ | Metal GPU |
| CTC-7B-MLX-8bit | 128 | 2048 | 32 | 6.63 ГБ | Metal GPU |
Использование CLI
CoreML (Neural Engine)
# Окно 10 с (по умолчанию)
.build/release/audio transcribe recording.wav --engine omnilingual
# Окно 5 с (меньше памяти, быстрее холодный старт)
.build/release/audio transcribe recording.wav --engine omnilingual --window 5
MLX (Metal GPU)
# 300M @ 4-bit (MLX-вариант по умолчанию)
.build/release/audio transcribe recording.wav --engine omnilingual --backend mlx
# 1B @ 4-bit — выше точность
.build/release/audio transcribe recording.wav --engine omnilingual --backend mlx --variant 1B
# 3B @ 8-bit — приближается к качеству референса
.build/release/audio transcribe recording.wav --engine omnilingual --backend mlx --variant 3B --bits 8
# 7B @ 4-bit — крупнейший CTC-вариант, лучшая точность
.build/release/audio transcribe recording.wav --engine omnilingual --backend mlx --variant 7B
Swift API
Бэкенд CoreML
import OmnilingualASR
import AudioCommon
let model = try await OmnilingualASRModel.fromPretrained()
let audio = try AudioFileLoader.load(url: url, targetSampleRate: 16000)
let text = try model.transcribeAudio(audio, sampleRate: 16000)
print(text)
Бэкенд MLX
import OmnilingualASR
// По умолчанию: 300M @ 4-bit
let model = try await OmnilingualASRMLXModel.fromPretrained()
// Большие варианты
let big = try await OmnilingualASRMLXModel.fromPretrained(variant: .b1, bits: 4)
let huge = try await OmnilingualASRMLXModel.fromPretrained(variant: .b3, bits: 8)
let max = try await OmnilingualASRMLXModel.fromPretrained(variant: .b7, bits: 4)
let text = try model.transcribeAudio(audio, sampleRate: 16000)
CoreML против MLX
Оба бэкенда создают по сути идентичные транскрипты с точностью до 1-2 символов (разница в квантизации и runtime). Выбирайте по целевой платформе развёртывания:
| CoreML | MLX | |
|---|---|---|
| Цель вычислений | Neural Engine | Metal GPU |
| Длина входа | Фиксированное окно (5 с или 10 с) | Любая длина до 40 с |
| Размеры модели | Только 300M | 300M / 1B / 3B / 7B |
| Квантизация | INT8 palettization | 4-bit или 8-bit QuantizedLinear |
| Параллельно с GPU-TTS | Да (ANE независим) | Конкурирует с GPU-TTS |
| Поддержка iOS | iOS 17+ | Любой Apple Silicon iOS |
Детали предобработки
Omnilingual требует layer-norm на уровне реплики для сырой волны, совпадая с apply_audio_normalization из fairseq2:
normalized = (audio - mean(audio)) / sqrt(variance(audio) + 1e-5)
Swift-порт нормализует реальное аудио-содержимое до нулевого дополнения до фиксированного окна CoreML, так что входы меньше окна точно совпадают со статистикой референсного пайплайна. Это самая частая ловушка портирования — реализация wav2vec2 из HuggingFace делает group-norm по признакам, а не layer-norm по реплике.
Референсный пайплайн обеспечивает жёсткий лимит 40 секунд (MAX_ALLOWED_AUDIO_SEC) на входное аудио. Swift-порт обеспечивает тот же лимит — более длинные входы выбрасывают понятную ошибку с указанием на SpeechVAD или ParakeetStreamingASR для сегментированной обработки.
Языковое покрытие
Omnilingual поддерживает 1 672 языка в 32 письменностях, включая 500+ языков с ограниченными ресурсами, добавленных через сбор данных сообществом. Выборка покрытия:
| Письменность | Языки | Примеры кодов |
|---|---|---|
| Латиница | 1 398 | eng_Latn, fra_Latn, spa_Latn, pcm_Latn, swh_Latn, zul_Latn, … |
| Арабская | 70 | arb_Arab, arz_Arab, ary_Arab, arq_Arab, fas_Arab, urd_Arab, ckb_Arab, uig_Arab, … |
| Деванагари | 65 | hin_Deva, mar_Deva, nep_Deva, bho_Deva, mai_Deva, awa_Deva, brx_Deva, … |
| Кириллица | 51 | rus_Cyrl, ukr_Cyrl, bel_Cyrl, bul_Cyrl, srp_Cyrl, mkd_Cyrl, kaz_Cyrl, … |
| Эфиопская | 10 | amh_Ethi, tir_Ethi, wal_Ethi, sgw_Ethi, … |
| Бенгальская | 8 | ben_Beng, asm_Beng, mni_Beng, … |
| Тайская / Лаосская / Мьянманская / Тибетская | 9 / 1 / 3 / 6 | tha_Thai, lao_Laoo, mya_Mymr, bod_Tibt, dzo_Tibt, … |
| Хань (упрощённый / традиционный) | 6 | cmn_Hans, cmn_Hant, yue_Hans, yue_Hant, cdo_Hans, … |
| Японский / Корейский | 1 / 1 | jpn_Jpan, kor_Hang |
| Армянская, грузинская, еврейская, греческая, гуджарати, гурмукхи, каннада, малаялам, ория, сингальская, тамильская, телугу, тифинаг, тхаана и ещё 4 | 48 | См. полный список → |
Полный список кодов ISO 639-3 + ISO 15924 с английскими названиями в исходнике lang_ids.py, и сгруппировано по письменности со страновыми подсказками в карточке модели.
Проверенный вывод
Транскрипты со Swift-порта на бенчмарке FLEURS, CoreML 300M:
| Язык | Референс | Вывод |
|---|---|---|
| Английский | Fellow wrestlers also paid tribute to Luna. | fellow wrestlers also paid tribute to luna |
| Арабский | كما أثنى الزملاء المصارعون على لونا | كما أثنى الزملاء المصارعون على لونا |
| Хинди | लूना को साथी पहलवानों ने भी श्रद्धांजलि दी | लूना को साथी पहलवानों ने भी सरधांजलीदी |
| Французский | Pensez à l'itinéraire de ski comme à un itinéraire de randonnée similaire. | pense à létineraire desqui comme un étineraire de rent donner similaire |
MLX-вариант 300M-4bit выдаёт по сути идентичный вывод с точностью до 1-2 символов. Более крупные варианты (1B, 3B, 7B) постепенно уменьшают остаточные ошибки.
Ссылки
- Статья: Omnilingual ASR (arXiv 2511.09690)
- Исходная реализация: facebookresearch/omnilingual-asr (Apache 2.0)
- Исходник Swift-порта: speech-swift/Sources/OmnilingualASR
- Карточка модели: docs/models/omnilingual-asr.md