CoolFace
Modelpublic

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

sourceHugging Faceapache-2.0updated 2mo agoView on Hugging Face
0likes57downloads
Model Card

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

FileSizeNote
model.onnx1.3 GBFP32, single file, no external data
model.int8.onnx328 MBDynamic INT8, quantized locally — upstream's INT8 sibling repo is empty
tokens.txt90 KBOne shared vocabulary, 10288 tokens
config.json—onnx-asr model type and subsampling factor
test_wavs/—The four upstream sample clips

Usage

py
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

ItemValue
Inputx, float32, [batch, num_samples], raw 16 kHz waveform
Outputlogits, float32, [batch, num_frames, 10288], unnormalized
Feature frontendnone needed — the wav2vec2 convolutional extractor is in the graph
Subsampling320 samples per frame (20 ms)
Blankindex 0, the <s> token
Language selectionnone — 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.

ClipLanguageReferenceFP32 hypothesisCERWER
por_0Portuguese (por)"Estamos aqui para pedir emprestado""estamos aqui para pedir em prestado"0.030.40
por_1Portuguese (por)"Graças a Deus você está aqui!"(wrong script — Arabic)0.931.00
swh_0Swahili (swh)"Wanatokea katika Afrika kusini kwa Sahara tu, mara nyingi milimani.""wanatokea katika afrika kusimi kwa sahara tu mara nyingi milimani"0.020.10
swh_1Swahili (swh)"Uzito una uwiano sawa na masi.""uzito wana waino sawa na masi"0.170.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.

RuntimeRTF
ONNX FP32, box quiet0.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
bibtex
@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},
}