Google WAXAL ASR Challenge phase 2 (Zindi) - 4th private. Lingala & Shona ASR with audio-only language routing. One-minute md5-exact verification, plus full re-decode from audio on Modal.
# WAXAL ASR Challenge — Phase 2 · Lingala & Shona
**4th place, private leaderboard 0.771848284** (public 0.762400298) · Google WAXAL ASR Challenge, hosted by Zindi.
892 test clips, two African languages, **no metadata**: the system has to hear which language is
being spoken, not be told. Score is `1 − (WER + CER) / 2` on raw text — punctuation and case count.
| | WER | CER | score |
|---|---|---|---|
| submitted `20260809_p2new_qlvoter_t20.csv` | 0.365492 | 0.109707 | **0.762400** public · 0.771848 private |
---
## Table of contents
- Solution overview
- Quick start — verify the submission in one minute
- Full reproduction — re-decode from audio
- Directory structure
- Models and data on the Hub
- Architecture
- Hardware, compute and asset declaration
- Results
- What did not work
- Licences
---
## Solution overview
Audio-only language identification (`facebook/mms-lid-4017`) routes the 892 clips into **lin (447)**
and **sna (445)**. Nothing downstream is conditioned on metadata — phase 2 withholds it, and phase 1
metadata would not transfer anyway.
**lin** is transcribed by a full fine-tune of `facebook/mms-1b-all`, **started from Meta's pretrained
lin adapter and never re-initialised**, then refined with pseudo-labels on the test audio and a
per-speaker adaptation pass, and decoded with a 5-gram KenLM built from the training transcripts.
**sna** is transcribed by `Sunbird/asr-whisper-51-african-languages`, domain-adapted with
pseudo-labels and a per-speaker micro-fine-tune.
Eight deterministic **arbitration** stages then edit the merged text, using ~15 secondary systems as
witnesses: word-level voting under a frequency gate, insertion/deletion arcs behind consensus and
language-model margins, a lexical form gate, and a tail merge for clips longer than whisper's 30 s
encoder window.
### Key techniques
- **Never re-initialise a pretrained adapter.** The standard MMS fine-tuning recipe calls
`init_adapter …