Omnilingual ASR CTC 300M — ONNX
ONNX conversion of Meta's Omnilingual ASR CTC model at the 300M scale
(omniASR_CTC_300M_v2), packaged for
onnx-asr.
Omnilingual ASR covers more than 1600 languages. For several hundred of them it is the first speech recognition model that exists at all. Aragonese, Mirandese, Sardinian, Ligurian, Neapolitan, Cornish, Navajo, Cherokee and Inuktitut are in the list, and none of them has another open route to speech recognition today.
This is the recommended CPU default of the family. It is the smallest CTC scale Meta released, it fits comfortably in RAM as a single ~1.3 GB file (no external-data split needed), and on ordinary CPU hardware it runs at roughly 10-15x real time, an order of magnitude faster than the 1B scale. Reach for the 1B model only if 300M accuracy is not enough for a given language.
Model and weights are by Meta Platforms, Inc. and released under Apache-2.0.
This repository redistributes them in ONNX form. The LICENSE file is Meta's
verbatim.
Files
| File | Size | Note |
|---|---|---|
model.onnx |
1.3 GB | FP32, single file, no external data |
model.int8.onnx |
328 MB | Dynamic INT8, quantized locally — upstream's INT8 sibling repo is empty |
tokens.txt |
90 KB | One shared vocabulary, 10288 tokens |
config.json |
— | onnx-asr model type and subsampling factor |
test_wavs/ |
— | The four upstream sample clips |
Usage
import onnx_asr
model = onnx_asr.load_model("omnilingual-ctc", "OpenVoiceOS/omnilingual-asr-ctc-300m-onnx")
print(model.recognize("audio.wav"))
# INT8
model = onnx_asr.load_model(
"omnilingual-ctc", "OpenVoiceOS/omnilingual-asr-ctc-300m-onnx", quantization="int8"
)
Needs the omnilingual-ctc model type, which is in the
TigreGotico onnx-asr fork, integration
branch.
Graph
| Item | Value |
|---|---|
| Input | x, float32, [batch, num_samples], raw 16 kHz waveform |
| Output | logits, float32, [batch, num_frames, 10288], unnormalized |
| Feature frontend | none needed — the wav2vec2 convolutional extractor is in the graph |
| Subsampling | 320 samples per frame (20 ms) |
| Blank | index 0, the <s> token |
| Language selection | none — the CTC family is not language-conditioned |
The vocabulary holds real spaces, not the ▁ marker, so the decoder joins tokens
without substitution. Same graph contract as the 1B export, verified against it
directly (see below).
Verification
Sanity check: the four upstream sample clips (German, English, Spanish, French) transcribe correctly in both FP32 and INT8, matching the 1B model's behaviour on the same clips.
Spot check: four Common Voice 17 clips across two out-of-domain languages, reused
from the 1B campaign's staged set, decoded with greedy CTC through onnx-asr on
CPU. CER/WER after NFC normalization, lowercasing and punctuation removal.
| Clip | Language | Reference | FP32 hypothesis | CER | WER |
|---|---|---|---|---|---|
por_0 |
Portuguese (por) |
"Estamos aqui para pedir emprestado" | "estamos aqui para pedir em prestado" | 0.03 | 0.40 |
por_1 |
Portuguese (por) |
"Graças a Deus você está aqui!" | (wrong script — Arabic) | 0.93 | 1.00 |
swh_0 |
Swahili (swh) |
"Wanatokea katika Afrika kusini kwa Sahara tu, mara nyingi milimani." | "wanatokea katika afrika kusimi kwa sahara tu mara nyingi milimani" | 0.02 | 0.10 |
swh_1 |
Swahili (swh) |
"Uzito una uwiano sawa na masi." | "uzito wana waino sawa na masi" | 0.17 | 0.33 |
INT8 tracks FP32 closely on every clip (same wrong-script failure on por_1,
CER/WER within a few points elsewhere). This is the same pattern documented for
the 1B model, at smaller scale and lower accuracy overall — 300M trades some
accuracy for a large speed win, which is the point of publishing it as the
default.
Speed
AMD Ryzen 5 7600 (6 cores), CPU only, 6 intra-op threads, on a shared box.
| Runtime | RTF |
|---|---|
| ONNX FP32, box quiet | 0.07 – 0.09 |
| ONNX FP32, this run (box busy, other tenants active) | 0.10 – 0.43 |
| ONNX INT8, this run (box busy, other tenants active) | 0.12 – 0.17 |
Compare to the 1B model on the same box: RTF 0.84 – 1.9 (FP32, box busy). 300M is roughly an order of magnitude faster, which is why it is the recommended CPU default rather than 1B.
Limits
- Upstream accepts audio shorter than 40 seconds. Longer clips degrade badly. Use a VAD to cut long audio.
- No punctuation and no capitalization for most languages.
- The graph takes no length input, so decode one waveform at a time.
- The CTC family cannot be told which language to expect, and — as shown above — a short, unclear clip can come back transcribed in the wrong script entirely. This is a known upstream limitation of the CTC family, not specific to this export. Use the LLM variants of Omnilingual ASR if you need language conditioning.
- 300M trades accuracy for speed relative to the 1B and larger scales. If a target language needs more accuracy than this spot check suggests, try 1B.
Credits
- Model and weights: Meta Omnilingual ASR, Apache-2.0
- ONNX export: sherpa-onnx by Fangjun Kuang
- INT8 quantization: dynamic quantization (
onnxruntime.quantization.quantize_dynamic), done locally for this repository since upstream's INT8 sibling repo ships no weights - Paper: arXiv:2511.09690
@misc{omnilingualasrteam2025omnilingualasropensourcemultilingual,
title={Omnilingual ASR: Open-Source Multilingual Speech Recognition for 1600+ Languages},
author={Omnilingual ASR team},
year={2025},
eprint={2511.09690},
archivePrefix={arXiv},
url={https://arxiv.org/abs/2511.09690},
}
- Downloads last month
- 28
Model tree for OpenVoiceOS/omnilingual-asr-ctc-300m-onnx
Base model
facebook/omniASR-CTC-300M