Peacockery/omni-ctc-300m-farsi
omni-ctc-300m-farsi
A Farsi fine-tune of facebook/omniASR-CTC-300M, trained on 985 hours of Farsi speech across seven corpora. It reaches 8.5% WER on FLEURS fa_ir test and beat a 1B fine-tune of the same family on every benchmark split.
Files
model.pt: fairseq2 checkpoint (CTC head, 300M parameters)omniASR_tokenizer_written_v2.model: the character tokenizer the checkpoint expects
Training data
985 hours (Peacockery/farsi-asr-corpus-v4): Common Voice 25 (324 h), Thomcles Farsi speech (298 h), Farsi YouTube (205 h), Mana TTS (97 h), Neyshekar (37 h), FLEURS (13 h), WorldSpeech (11 h). Web-scraped portions carry machine labels verified against an independent Scribe pass.
Recipe
Two stages: a 34,000-step fine-tune from the base model, then a 10,000-step warm restart from its best checkpoint with a fresh optimizer at peak LR 2e-6 (tri-stage). Best checkpoint at step 7,000 of the restart, dev WER 11.15.
Benchmarks
Test splits, corpus-level jiwer after shared normalization (WER %):
Usage
from omnilingual_asr.models.inference.pipeline import ASRInferencePipeline
# Register model.pt + the tokenizer as a fairseq2 asset card, then:
pipe = ASRInferencePipeline("your_card_name", device="cuda")
texts = pipe.transcribe([audio], lang=["fas_Arab"], batch_size=8)The checkpoint loads through fairseq2 0.8.x with the omnilingual-asr inference stack. Audio must be 16 kHz mono; clips above 40 s exceed the pipeline cap.
Checkpoint
omni_ctc_300m_v2_farsi_v4_step_41000. Trained on the scribe-v4 corpus to step 34,000, then a warm restart (lr 2e-6) loaded those weights and ran to its best at +7,000 steps — 41,000 cumulative training steps (the run dir labels it step_7000 because the restart reset the counter). FLEURS fa_ir test WER 8.51%.
