uzasr 0.2.0: KenLM beam-search decoding for Uzbek ASR
Adding a 4-gram KenLM language model to CTC decoding cut WER without retraining. This release was withdrawn a day later — the LM corpus overlapped the benchmark.
- WERuzasr-large12,2%10,2%
- WERuzasr-base13,9%10,8%
Withdrawn on 2026-10-17. The WER numbers below are inflated: the language model's text corpus overlapped our benchmark. The corrected numbers and the full story are in uzasr 0.2.1. We keep this entry as published so the history stays complete.
In short. We added a word-level language model to decoding without changing the acoustic weights. As published, WER dropped from 12.2% to 10.2% for uzasr-large and from 13.9% to 10.8% for uzasr-base.
What changed
- CTC beam search with a 4-gram KenLM. We built the LM from the text of our training data. Two parameters (LM weight and word bonus) were tuned with 2-fold cross-validation: chosen on one half of the benchmark and measured on the other.
- The smaller model gained more.
uzasr-basegained 3.1 points versus 2.0 foruzasr-large. A weaker acoustic model leaves more errors for the LM to fix, so the cheaper tier briefly outscored the old greedy 600M model. - Speed. Beam search runs on CPU next to the GPU model. Throughput went from 163× to 122× real time, which is acceptable for synchronous requests.
What didn't work: bf16 inference
We also tested bf16 autocast to make inference faster and lighter. WER moved by 0.06 points, which is noise. But speed and VRAM didn't change either: for single requests the GPU waits on kernel launches and Python overhead, not on arithmetic. Production stays on float32. The real levers are batching requests together and storing the weights in bf16, and both are on the list.
Why it was withdrawn
A code review raised a narrow question about how benchmark sentences were filtered out of the LM corpus. Answering it turned up a broader problem: the LM had seen a fifth of the benchmark. See 0.2.1.
