Omnilingual ASR CTC 1B — ONNX
ONNX conversion of Meta's Omnilingual ASR CTC model at the 1B scale
(omniASR_CTC_1B_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.
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 + model.onnx.data |
3.9 GB | FP32 |
model.int8.onnx |
1.0 GB | Dynamic INT8 |
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-1b-onnx")
print(model.recognize("audio.wav"))
# INT8
model = onnx_asr.load_model(
"omnilingual-ctc", "OpenVoiceOS/omnilingual-asr-ctc-1b-onnx", quantization="int8"
)
Needs the omnilingual-ctc model type, which is in the
TigreGotico onnx-asr fork.
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.
Verification
Every number below comes from greedy CTC decoding through onnx-asr on CPU, on
five clips per language. CER and WER are computed after lowercasing and removal of
punctuation. This is a small spot check, not a benchmark.
| Language | Source | Verification level | CER FP32 | CER INT8 | WER FP32 |
|---|---|---|---|---|---|
Swahili (swh) |
FLEURS-style, Common Voice 17 sw |
Against reference text | 0.052 | 0.056 | 0.133 |
Portuguese (por) |
Common Voice 17 pt |
Against reference text | 0.242 | 0.300 | 0.362 |
Ligurian (lij) |
facebook/omnilingual-asr-corpus |
Against reference text, in-domain | 0.044 | 0.046 | 0.185 |
Occitan (oci) |
Common Voice 17 oc |
Against reference text | 0.141 | 0.135 | 0.517 |
Sardinian (srd) |
Common Voice 17 sc |
Against reference text | 0.335 | 0.340 | 0.840 |
Neapolitan (nap) |
facebook/omnilingual-asr-corpus |
Against reference text, in-domain | 0.521 | 0.514 | 0.796 |
German, English, Spanish and French were also transcribed from the four upstream sample clips, and the output matches the spoken sentence word for word.
Parity against PyTorch
Twelve clips (two per language) were also decoded with
aadel4/omniASR-CTC-1B-v2, a
Wav2Vec2ForCTC port of the same weights, on CPU in float32.
| Comparison | Result |
|---|---|
| FP32 ONNX vs PyTorch | 12 / 12 exact string match |
| INT8 ONNX vs PyTorch | 2.7 % mean character difference |
The FP32 graph reproduces the reference implementation exactly.
Read the table with care:
- Ligurian and Neapolitan come from Meta's own corpus. The model was very probably trained on that data, so the score is optimistic. Ligurian reads cleanly. Neapolitan does not: the output is recognisable Neapolitan, but the corpus writes it in a dense apostrophe-heavy orthography that the model only partly reproduces, and the speech is fast and spontaneous.
- Occitan and Sardinian are honest out-of-domain checks. Occitan output is readable and close to the reference. Sardinian is much weaker: the reference spelling and the model spelling disagree on most words, though the phonetic shape survives.
- Portuguese shows the main failure mode. One 4-second clip came back written in Arabic script. Nothing conditions the CTC models on a language, so a short clip can land in the wrong writing system. Use the LLM variants of Omnilingual ASR if you need language conditioning.
INT8 tracks FP32 closely everywhere. The 4x smaller file costs almost no accuracy.
Speed
AMD Ryzen 5 7600 (6 cores), CPU only, 6 intra-op threads, on a shared box.
| Runtime | RTF |
|---|---|
| ONNX INT8 | 0.25 – 1.05 |
| ONNX FP32 | 0.84 – 1.9 |
| PyTorch FP32 (reference) | 0.38 mean |
The machine was busy during the ONNX runs and quiet during the PyTorch run, and the FP32 ONNX evaluation ran with graph optimizations disabled to fit in memory, so the ONNX figures are pessimistic. Treat them as upper bounds.
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.
Credits
- Model and weights: Meta Omnilingual ASR, Apache-2.0
- ONNX export: sherpa-onnx by Fangjun Kuang, repacked here for
onnx-asrexternal-data naming - 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
- 32
Model tree for OpenVoiceOS/omnilingual-asr-ctc-1b-onnx
Base model
facebook/omniASR-CTC-1B