Omnilingual ASR
O Omnilingual ASR da Meta e uma familia de reconhecimento de fala agnostica de idioma cobrindo 1.672 idiomas em 32 escritas distintas — a cobertura de idiomas mais ampla de qualquer modelo ASR no dispositivo em Apple Silicon. O Soniqo porta a variante CTC para CoreML (Neural Engine) e MLX (GPU Metal), com quatro tamanhos de modelo de 300M a 7B parametros.
Diferentemente do Qwen3-ASR ou Parakeet TDT, o Omnilingual CTC nao aceita um language hint em tempo de inferencia — ele usa um vocabulario SentencePiece compartilhado de 10.288 entradas abrangendo todos os idiomas suportados. Passe qualquer audio em qualquer idioma suportado e o modelo produz a escrita correta automaticamente.
Arquitetura
Omnilingual CTC e um fine-tune supervisionado do backbone wav2vec 2.0 da Meta com uma cabeca linear CTC sobre um vocabulario multilingue compartilhado. O pipeline e paralelo e nao autoregressivo — um forward pass por enunciado, sem loop de decodificador.
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]
Com entrada de 16 kHz, o codificador com downsample de 320x produz frame rate de 50 Hz. Um clipe de 10 segundos produz 499 frames de logits. A decodificacao greedy CTC colapsa duplicatas consecutivas e pula tokens especiais via o tokenizer SentencePiece.
Variantes do modelo
Dez variantes sao publicadas sob o namespace aufklarer no HuggingFace — dois tamanhos de janela CoreML mais oito combinacoes de quantizacao MLX:
| Variante | Camadas | Dim | Heads | Tamanho | Runtime |
|---|---|---|---|---|---|
| CTC-300M-CoreML-INT8 (janela 5 s) | 24 | 1024 | 16 | 312 MB | Neural Engine |
| CTC-300M-CoreML-INT8 (janela 10 s) | 24 | 1024 | 16 | 312 MB | Neural Engine |
| CTC-300M-MLX-4bit | 24 | 1024 | 16 | 193 MB | GPU Metal |
| CTC-300M-MLX-8bit | 24 | 1024 | 16 | 342 MB | GPU Metal |
| CTC-1B-MLX-4bit | 48 | 1280 | 20 | 549 MB | GPU Metal |
| CTC-1B-MLX-8bit | 48 | 1280 | 20 | 1006 MB | GPU Metal |
| CTC-3B-MLX-4bit | 60 | 2048 | 32 | 1.71 GB | GPU Metal |
| CTC-3B-MLX-8bit | 60 | 2048 | 32 | 3.16 GB | GPU Metal |
| CTC-7B-MLX-4bit | 128 | 2048 | 32 | 3.55 GB | GPU Metal |
| CTC-7B-MLX-8bit | 128 | 2048 | 32 | 6.63 GB | GPU Metal |
Uso do CLI
CoreML (Neural Engine)
# 10 s window (default)
.build/release/audio transcribe recording.wav --engine omnilingual
# 5 s window (lower memory, faster cold start)
.build/release/audio transcribe recording.wav --engine omnilingual --window 5
MLX (GPU Metal)
# 300M @ 4-bit (default MLX variant)
.build/release/audio transcribe recording.wav --engine omnilingual --backend mlx
# 1B @ 4-bit — higher accuracy
.build/release/audio transcribe recording.wav --engine omnilingual --backend mlx --variant 1B
# 3B @ 8-bit — approaching reference quality
.build/release/audio transcribe recording.wav --engine omnilingual --backend mlx --variant 3B --bits 8
# 7B @ 4-bit — largest CTC variant, best accuracy
.build/release/audio transcribe recording.wav --engine omnilingual --backend mlx --variant 7B
API Swift
Backend 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)
Backend MLX
import OmnilingualASR
// Default: 300M @ 4-bit
let model = try await OmnilingualASRMLXModel.fromPretrained()
// Larger variants
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 vs MLX
Ambos os backends produzem transcricoes essencialmente identicas modulo 1-2 caracteres (diferencas de quantizacao e runtime). Escolha com base no seu alvo de implantacao:
| CoreML | MLX | |
|---|---|---|
| Alvo de computacao | Neural Engine | GPU Metal |
| Comprimento de entrada | Janela fixa (5 s ou 10 s) | Qualquer comprimento ate 40 s |
| Tamanhos de modelo | Somente 300M | 300M / 1B / 3B / 7B |
| Quantizacao | Palletizacao INT8 | QuantizedLinear 4-bit ou 8-bit |
| Roda em paralelo com TTS na GPU | Sim (ANE e independente) | Disputa com TTS na GPU |
| Suporte iOS | iOS 17+ | Qualquer iOS em Apple Silicon |
Detalhes de pre-processamento
O Omnilingual requer layer-norm por enunciado na waveform bruta, correspondendo ao apply_audio_normalization do fairseq2:
normalized = (audio - mean(audio)) / sqrt(variance(audio) + 1e-5)
A porta Swift normaliza o conteudo real de audio antes do zero-padding para a janela fixa CoreML, entao entradas sub-janela correspondem exatamente as estatisticas do pipeline de referencia. Esta e a armadilha mais comum de porta — a implementacao wav2vec2 do HuggingFace faz group-norm por feature, nao layer-norm por enunciado.
O pipeline de referencia aplica um limite rigido de 40 segundos (MAX_ALLOWED_AUDIO_SEC) no audio de entrada. A porta Swift aplica o mesmo limite — entradas mais longas lancam um erro claro apontando para SpeechVAD ou ParakeetStreamingASR para processamento segmentado.
Cobertura de idiomas
O Omnilingual suporta 1.672 idiomas em 32 escritas, incluindo mais de 500 idiomas de baixos recursos adicionados via coleta de dados comunitaria. Cobertura de amostra:
| Escrita | Idiomas | Codigos de exemplo |
|---|---|---|
| Latim | 1.398 | eng_Latn, fra_Latn, spa_Latn, pcm_Latn, swh_Latn, zul_Latn, … |
| Arabe | 70 | arb_Arab, arz_Arab, ary_Arab, arq_Arab, fas_Arab, urd_Arab, ckb_Arab, uig_Arab, … |
| Devanagari | 65 | hin_Deva, mar_Deva, nep_Deva, bho_Deva, mai_Deva, awa_Deva, brx_Deva, … |
| Cirilico | 51 | rus_Cyrl, ukr_Cyrl, bel_Cyrl, bul_Cyrl, srp_Cyrl, mkd_Cyrl, kaz_Cyrl, … |
| Etiopico | 10 | amh_Ethi, tir_Ethi, wal_Ethi, sgw_Ethi, … |
| Bengali | 8 | ben_Beng, asm_Beng, mni_Beng, … |
| Tailandes / Lao / Mianmar / Tibetano | 9 / 1 / 3 / 6 | tha_Thai, lao_Laoo, mya_Mymr, bod_Tibt, dzo_Tibt, … |
| Han (simplificado / tradicional) | 6 | cmn_Hans, cmn_Hant, yue_Hans, yue_Hant, cdo_Hans, … |
| Japones / Coreano | 1 / 1 | jpn_Jpan, kor_Hang |
| Armenio, Georgiano, Hebraico, Grego, Gujarati, Gurmukhi, Kannada, Malaiala, Oriya, Sinhala, Tamil, Telugu, Tifinagh, Thaana, mais 4 | 48 | Veja lista completa → |
Lista completa de codigos ISO 639-3 + ISO 15924 com nomes em ingles no codigo-fonte lang_ids.py, e agrupada por escrita com dicas de pais no model card.
Saida verificada
Transcricoes da porta Swift no benchmark FLEURS, CoreML 300M:
| Idioma | Referencia | Saida |
|---|---|---|
| Ingles | Fellow wrestlers also paid tribute to Luna. | fellow wrestlers also paid tribute to luna |
| Arabe | كما أثنى الزملاء المصارعون على لونا | كما أثنى الزملاء المصارعون على لونا |
| Hindi | लूना को साथी पहलवानों ने भी श्रद्धांजलि दी | लूना को साथी पहलवानों ने भी सरधांजलीदी |
| Frances | 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 |
A variante MLX 300M-4bit produz saida essencialmente identica modulo 1-2 caracteres. Variantes maiores (1B, 3B, 7B) reduzem erros residuais progressivamente.
Referencia
- Paper: Omnilingual ASR (arXiv 2511.09690)
- Implementacao upstream: facebookresearch/omnilingual-asr (Apache 2.0)
- Codigo da porta Swift: speech-swift/Sources/OmnilingualASR
- Model card: docs/models/omnilingual-asr.md