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

@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
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for OpenVoiceOS/omnilingual-asr-ctc-1b-onnx

Quantized
(2)
this model

Dataset used to train OpenVoiceOS/omnilingual-asr-ctc-1b-onnx

Collections including OpenVoiceOS/omnilingual-asr-ctc-1b-onnx

Paper for OpenVoiceOS/omnilingual-asr-ctc-1b-onnx