OpenVoiceOS/omnilingual-asr-ctc-300m-onnx
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
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
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.
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.
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},
}