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

Model tree for OpenVoiceOS/omnilingual-asr-ctc-300m-onnx

Quantized
(3)
this model

Dataset used to train OpenVoiceOS/omnilingual-asr-ctc-300m-onnx

Collections including OpenVoiceOS/omnilingual-asr-ctc-300m-onnx

Paper for OpenVoiceOS/omnilingual-asr-ctc-300m-onnx