🇹🇲 TurkmenAI stack
Evaluation
Protocol. The eval set is the first 300 clips of the corpus,
frozen and identical in every session — the model never trains on them
(hard-example mining draws only from the training pool). Base and fine-tuned
numbers come from the same clips, same model, same decoder — the only
difference is whether the LoRA adapter is active. Decoding: beam search (num_beams=5).
Text normalization. WER/CER use one normalizer applied identically to
hypothesis and reference (Unicode NFC, whitespace, and Turkmen orthography:
clitic particles -da/-de written joined, postposition ýaly written
separate) — the same idea as Whisper's EnglishTextNormalizer. We report both
the normalized WER (headline) and the verbatim WER (raw decode) so the
effect of normalization is fully transparent.
Table with columns: Model, WER (normalized), %, CER, %, WER (verbatim), %| Model | WER (normalized), % | CER, % | WER (verbatim), % |
|---|
| Whisper large-v3-turbo, zero-shot | 124.61 | 90.58 | 124.61 |
| This model (fine-tuned) | 24.44 [95% CI 22.5–26.6] | 5.08 | 24.58 |
| Improvement | −100.2 pts (80% relative) | | |

Error analysis (fine-tuned, normalized)
Word-level error decomposition on the fixed eval set — shows what kind of
errors remain, not just how many:
Table with columns: Substitutions, Deletions, Insertions| Substitutions | Deletions | Insertions |
|---|
| 21.07% | 2.00% | 1.37% |
Substitutions dominate for this model — mostly close phonetic/orthographic
letter confusions (voicing d/t, b/p, g/k) rather than dropped or invented
words, which is the expected failure mode for a well-aligned ASR system.
Progress across sessions
Table with columns: Session, WER, %, CER, %| Session | WER, % | CER, % |
|---|
| 2 | 39.75 | 8.60 |
| 3 | 34.74 | 7.30 |
| 5 | 29.51 | 6.26 |
| 6 | 27.89 | 6.23 |
| 7 | 24.44 | 5.08 |
Best WER so far: 24.44% ·
Sessions: 7 · Corpus position: 72750 files ·
This session: 13164 train clips.

Qualitative examples (held-out eval, verbatim decode)
Table with columns: Reference (human), Base Whisper (zero-shot), This model| Reference (human) | Base Whisper (zero-shot) | This model |
|---|
| esalawmalikim hürmeti adamlar garaşsyz baky bitarap ýurdumyzdaky | Assalamualaikum warimata adammar gharas shada, bachibi tarabi yorna muddhaqe. | suluwmalikim hürmetli adamlar garaşşjada baky bitarap ýurdumyzdaky |
| dürdäne sygyrlaryny içgin öwrenýärler | Дұрдайна сығырларын, ечкейна оранярларын, | dürdäne sygyrlaryny içgine öwrenýärler |
| öz dillerine terjime edýärler | Öz dillerinə tercüm etdiərlər, | öz dillerine terjime etýärler |
| çünki arkadagly gahrymançy ýerdarymyzyň | Tшоң кей, арқыда алғы ақыл мансиердармыдың, | çünki arkadagly gahryman serdarymyzyň |
| bu ajaýyp kitabyndade bellenişi ýaly | Bu acayip kıtahmla de bellensiali, |
Full per-clip data (both decodes, all metrics): benchmark_samples.json.
Training configuration
Table | |
|---|
| Base model | openai/whisper-large-v3-turbo (809M params) |
| Adaptation | LoRA (r=32, α=64, dropout=0.05) on q/k/v/o + fc1/fc2 |
| Precision | bf16 (AMP) + gradient checkpointing |
| Optimizer schedule | cosine, warmup 100 steps, LR 5e-5 (continued) |
| Epochs / session | 2 |
| Effective batch | ~32 |
| Regularization | SpecAugment (time/feature masking p=0.05) |
| Hard-example mining (OHEM) | up to 250 training clips in the WER band [0.15,0.85], upweighted ×2–8 ∝ error severity (substitution-heavy clips boosted) |
Data & preprocessing
Source: mamed0v/TurkmenSpeech. Every clip passes a quality gate before training:
duration 1.0–30.0s · chars-per-second 2.0–35.0 (catches
audio/text misalignment) · RMS silence filter · peak loudness normalization ·
Unicode NFC + orthographic normalization · transcript de-duplication.
How it improves on its own mistakes (OHEM)
Each session, before training, the current model transcribes a random sample of
up to 4000 clips from the training pool and scores per-clip WER.
Selection is deliberately principled rather than "just take the worst":
- Productive-difficulty band
[0.15, 0.85] WER — clips
the model already gets right (nothing to learn) and clips it gets almost
entirely wrong (usually mislabeled/noisy audio, not genuine difficulty) are
both excluded. Upweighting the latter would amplify label noise
(confirmation bias), which is the classic failure mode of self-training.
- Severity-proportional replication — harder in-band clips are duplicated
more (×2–8), not a flat factor.
- Substitution targeting — clips whose errors are dominated by
substitutions (close-letter orthography: voicing d/t, b/p, g/k) get an
extra ×1.25 — that is the model's main, and most learnable,
error mode.
The eval set is never mined, so the benchmark stays honest.
Usage
from transformers import pipeline
asr = pipeline("automatic-speech-recognition", model="Slavik2009/whisper-large-v3-turbo-turkmen")
print(asr("audio.mp3"))
Intended use & limitations
Transcribes Latin-script spoken Turkmen (broadcast/podcast-style audio,
1–30s clips at 16 kHz). Quality degrades on heavy dialects, far-field or noisy
audio, and code-switched speech. The eval set is an in-domain held-out slice
of the training corpus, not an independent test set — treat the numbers as an
upper bound of in-domain quality; expect higher WER on out-of-domain audio.
Reported CIs are bootstrap estimates over 300 clips and quantify
eval-set sampling noise only, not distribution shift.
Reproducibility
Fixed seed (42), deterministic corpus ordering, and a public train_state.json
(session count, corpus position, per-corpus indices, benchmark) let anyone
resume or audit the exact training trajectory.
Citation
@misc{whisperturbotk,
title = {whisper-large-v3-turbo-turkmen: Whisper large-v3-turbo fine-tuned for Turkmen ASR},
author = {Slavik2009},
year = {2026},
url = {https://huggingface.co/Slavik2009/whisper-large-v3-turbo-turkmen}
}