uzasr-large v0.3.0: domain training, a 10M-sentence language model, 163× real time
How we cut Uzbek ASR error from 11.5% to 10.8% WER and made decoding 40% faster: spontaneous-speech training, an agreement-filtered YouTube corpus, a larger KenLM, and the experiments that didn't help.
- WERuzasr-large11,5%10,8%
- CERuzasr-large3,4%3,3%
- Скоростьuzasr-large×114×163
In short. uzasr-large-v0.3.0 lowers WER from 11.5% to 10.8% on benchmark v2 and raises throughput from 114× to 163× real time. The gain comes from three changes: further training on spontaneous speech, a new self-built corpus of YouTube segments where independent transcripts agree, and a language model 26 times larger. uzasr-base stays at v0.2.1.
What changed
1. Domain training on spontaneous speech
Our benchmark is conversational: podcasts, interviews, lectures. Most open Uzbek data is read speech. We continued training the 0.2.1 checkpoint for 3,000 steps on about 536 hours of conversational audio: podcasts, IT lectures and machine-transcribed YouTube speech.
Of that mix, 19% was read-speech "replay" (Common Voice, UzbekVoice), so the model would not forget clean speech. All training text was decontaminated against the benchmark first, using the same rule as in 0.2.1.
Greedy WER: 11.9% → 11.5%.
2. An agreement corpus from our own pipeline
We transcribed a large set of Uzbek YouTube videos with our model and compared the result with the videos' auto-generated captions. Where the two independent transcripts agreed, the segment was kept. Remaining doubtful spots were corrected with an LLM and spot-checked by a human. The result is ~250 hours of conversational speech with reliable text, split by video so that no recording appears in both training and validation.
Greedy WER: 11.5% → 11.25%.
3. A 10-million-sentence language model
The 0.2.1 LM was built from transcripts only: 387k sentences. We added an open web corpus of Uzbek news and Telegram blogs (Apache-2.0), bringing it to 10.2 million sentences. Any document sharing a 10-gram with the benchmark was removed whole. The LM is pruned and 8-bit quantised, so it takes 248 MB on disk.
WER with LM: 10.9% → 10.66%, from text alone.
4. Faster decoding
We measured beam widths 256, 64 and 16 on the new model. Beam 64 is exactly as accurate as 256 and twice as fast, so production now uses beam 64. Beam 16 is twice as fast again for +0.13 points, an option for latency-critical use.
Experiments that didn't help
Each of these was run under the same protocol and landed within ±0.05 points of the release checkpoint. That is noise, so none of them shipped:
- Checkpoint averaging of the last three checkpoints: 10.63% vs 10.62%.
- Model soup with a sibling run: 10.59%, inside the noise.
- A looser speaking-rate filter, which admits 23 more hours: +0.42 points worse. The extra segments were mostly mis-cut at the boundaries.
- Adding the agreement corpus text to the LM, at 1× and 10× weight: no gain. The acoustic model had already learned what that text could teach.
- Picking the best validation checkpoint instead of the last one: worse on the benchmark. Our 300-sentence validation set is too small to choose checkpoints, so we now ship the final step.
Publishing these saves anyone working on Uzbek ASR from repeating them.
Results (benchmark v2, production path)
| Version | Decoding | WER | CER | Speed |
|---|---|---|---|---|
| uzasr-large v0.2.1 | KenLM 387k sentences, beam 256 | 11.5% | 3.4% | 114× |
| uzasr-large v0.3.0 | KenLM 10.2M sentences, beam 64 | 10.8% | 3.3% | 163× |
Measured on the production worker: float32, 25-second chunking, single RTX 5060 Ti. Chunking costs about 0.17 points compared with decoding whole clips. We report the production number.
Where the remaining errors are
At this point data and decoding tricks had plateaued, so we analysed the errors instead of training blindly. 44% of the remaining WER was "near-misses": one or two letters off. A large share of those turned out not to be model errors at all. That led to the next update, benchmark v3.
