# East Africa OmniASR 300M
A compact, unified CTC speech-recognition system for Swahili, Kikuyu, Dholuo, Somali, Kalenjin, and Maasai, developed for the AfriVoices EAC ASR Hackathon.
The final system fine-tunes Meta's `omniASR_CTC_300M`, then applies a separately tuned word-level 5-gram KenLM decoder for each known language. It stays under the competition's one-billion-parameter limit and has a CPU/ONNX deployment path.
- Model weights and ONNX exports: mutaician/east-africa-omniasr-300m
- Interactive demo: mutaician/east-africa-omniasr
- Full methodology: writeup.md
- Compute accounting: COMPUTE.md
## Results
| Result | WER | Status |
|---|---:|---|
| First fine-tuned checkpoint, greedy CTC | 0.53561 | Kaggle submission |
| Best submission before the deadline | 0.41409 | Official competition result, rank 9/23 |
| Checkpoint 10,000 + KenLM | 0.38956 | Post-deadline late-submission leaderboard |
The final 10,000-step checkpoint improved greedy development WER across all six languages relative to the original controlled step-1,500 checkpoint. The largest unresolved errors remain in Kalenjin and Maasai.
## What is in this repository
Only the successful path and its direct helpers are included:
| File | Purpose |
|---|---|
| `01_download_data.py` | Download the gated training data and Kaggle evaluation data to Modal |
| `02_ingest_data.py` | Decode/resample audio, normalize labels, create OmniASR mixture parquet, and audit Kikuyu orthography |
| `03_train.py` | Reproduce the 0→2,000→5,000→10,000 fairseq2 training lineage |
| `04_dump_dev_emissions.py` | Run the acoustic model once on development audio and cache float16 CTC emissions |
| `05_build_kenlm.py` | Build normalized, pruned per-language 5-gram KenLM models |
| `06_tune_decoder.py` | Tune or benchmark the pyctcdecode/KenLM beam decoder |
| `07_dump_test_emissions.py` | Cache test-set emissions on A10 GPUs |
| `08_make_submission.py` | Decode cached test emissions and create the 41,733-row Kaggle CSV |
| …