KASEKOR ASR v0.0 β€” Khmer speech-to-text

A fine-tune of openai/whisper-small for Khmer (αžαŸ’αž˜αŸ‚αžš).

Training, evaluation, and inference code: github.com/chamroeunhongleng/kaskor-asr Β· Case study: chamroeunhongleng.me/projects/kaskor-asr

This is an early, self-labelled v0.0 research checkpoint by a student, not a production transcription service. The numbers below are self-reported: there is no third-party benchmark result for this model.

Results

Checkpoint Epoch CER ↓ WER ↓ Eval loss
checkpoint-27050 5 3.74% 57.2% 0.0356

Measured 2026-08-05 by the repository's own scripts/run_eval.py on the validation split: a fixed-seed 800-utterance subsample (seed 1234), greedy decoding, 448-token decode limit.

python scripts/run_eval.py --split val --beams 1 --eval-samples 800 \
  --checkpoint checkpoints/checkpoint-27050

Character Error Rate is the primary metric. Khmer does not put spaces between words, so word-level WER punishes segmentation choices rather than recognition quality; WER is reported only as a secondary number, and it is not comparable to WER figures for space-delimited languages.

What this number does not mean

  • It is not a speaker-independent result. The splits are stratified by speaker, so the same voices appear in training and evaluation. 4,813 of the 4,815 test utterances come from speakers the model trained on. This CER estimates accuracy on already-heard voices, not on a new speaker. A speaker-held-out evaluation is the priority for the next version.
  • It is not the test split. test has not yet been re-scored at the corrected decode limit.
  • The training voices are not diverse. All 86,550 training utterances come from 6 speakers, every one labelled female in the corpus manifests, and a single speaker accounts for 80% of them. Expect degradation on male speakers, children, other dialects, telephone audio, and noisy field recordings.
  • It has not been evaluated by province, recording device, or noise condition.

Correction: the 17.48% previously reported for these weights

Earlier documentation of this model reported 17.48% CER. That was a measurement artifact, not a model result. Decoding was capped at 225 tokens β€” roughly 102 Khmer characters, because byte-fallback BPE spends about 2.2 tokens per Khmer character β€” while more than half the references are longer, so complete references were being scored against hypotheses truncated mid-word.

Raising the cap to 448 (max_target_positions) gives 3.74% on the same weights. The same cap was shipping in the kaskor CLI, so real transcriptions were being cut off too; both are fixed, and run_eval.py now records the split, sample count, beam width, and decode limit with every result so numbers from different settings are never compared.

If you are calling this model yourself, set max_new_tokens to 440 (448 minus the 4-token prompt prefix). The default of 225 in older Whisper example code will silently truncate Khmer output.

Usage

import soundfile as sf
from transformers import WhisperProcessor, WhisperForConditionalGeneration

processor = WhisperProcessor.from_pretrained("Hongleng/kasekor-asr-v0.0")
model = WhisperForConditionalGeneration.from_pretrained("Hongleng/kasekor-asr-v0.0")

audio, sr = sf.read("audio.wav")          # 16 kHz mono, up to 30 s
inputs = processor(audio, sampling_rate=16_000, return_tensors="pt").input_features
ids = model.generate(inputs, language="km", task="transcribe",
                     num_beams=5, max_new_tokens=440)
print(processor.tokenizer.batch_decode(ids, skip_special_tokens=True)[0])

Or use the CLI from the training repository:

pip install git+https://github.com/chamroeunhongleng/kaskor-asr.git
kaskor audio.wav

Audio must be 16 kHz mono, and Whisper's receptive field is 30 seconds β€” longer recordings need chunking.

Intended use

Research and prototyping on Khmer speech interfaces: transcription experiments, a starting checkpoint for further fine-tuning, and voice-input prototypes where a human still reviews the text.

Out of scope: medical, legal, financial, or safety-critical transcription; any decision made about a person from an automatic transcript; and speaker identification. Do not treat output as a record of what someone said without human verification.

Training

Base openai/whisper-small
Data 86,550 Khmer utterances (train), 4,807 (val), 4,815 (test); 16 kHz mono, NFC-normalised
Epochs 5 (checkpoint-27050)
Batch 8 Γ— 2 gradient accumulation (effective 16)
LR / weight decay 1e-5 / 0.01
Augmentation 40% of samples: speed 0.9–1.1, gain Β±6 dB, noise at 15–30 dB SNR
Selection CER-primary on the validation split

The full pipeline β€” dataset inspection, manifest building, resampling, speaker-stratified splitting, mel caching, training, evaluation, export β€” is in the GitHub repository.

Data, licence, and provenance

These weights are a derivative of openai/whisper-small and carry its Apache-2.0 licence. The training and evaluation code in the GitHub repository is MIT.

The raw audio is not published and its provenance is not yet documented. The corpus source, speaker consent, and redistribution terms are unresolved, which is exactly why the recordings stay private and why no dataset is released here. If you need to reproduce training rather than inference, you need your own Khmer speech data.

Contact

Chamroeun Hongleng β€” Phnom Penh, Cambodia Β· chamroeunhongleng.me Β· GitHub

Corrections and speaker-independent evaluations are welcome: open an issue on the training repository.

Downloads last month
-
Safetensors
Model size
0.2B params
Tensor type
F32
Β·
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support

Model tree for Hongleng/kasekor-asr-v0.0

Finetuned
(3680)
this model