Zio TTS β Khmer text-to-speech
A small VITS model that speaks Khmer at 24 kHz, with several voices, ONNX export, and an easy fine-tuning path. Part of the open Zio project.
Research release. Understandable Khmer with some mispronunciations; not studio quality. Khmer only, neutral voices, no published evaluation yet. Listen to
samples/, which were generated by this exact checkpoint.
Use
git clone https://github.com/sombochea/zio-tts && cd zio-tts && uv sync --extra tts # Python 3.12+, ffmpeg
hf download sombochea/zio-tts --local-dir zio-tts
uv run zio speak "αα½ααααΈ ααΎα’ααααα»ααααααΆαααΆαα" hello.wav --run zio-tts
| Option | |
|---|---|
--voice km_7548__neutral |
voice id <speaker>__<emotion>; all ids are in vocab.json β voices (default km_6753__neutral) |
--speed 1.2 |
faster (>1) or slower (<1) |
--expressive 0.8 |
livelier prosody; 0.4 = steadier (default 0.667) |
Python: from zio.tts.infer import synthesize; synthesize("zio-tts", "αααααααα’αΆααΆαααΆαα»ααα’ααΆαα", "out.wav", voice="km_6753__neutral")
ONNX (no PyTorch): python examples/onnx_infer.py zio-tts.onnx vocab.json "αα½ααααΈ" out.wav km_6753__neutral. Inputs: input (int64 ids, blank_id between characters), input_lengths, scales = [expressive, 1/speed, 0.8], sid (from vocab.json β voices).
Text is normalized (digits, α, $ β words) and word-segmented automatically. The model was trained on word-spaced Khmer.
Fine-tune
Bring ~30 min of consented audio and start from best_model.pth. New voices get fresh embeddings, and everything else is reused. Recipe: training docs.
Details
| Architecture | VITS (coqui-tts) on graphemes (Khmer characters + aβz); no phonemizer, since espeak-ng has no Khmer |
| Data | subsets of sombochea/zio-tts-data (OpenSLR 42, seanghay/km-speech-corpus, ...). The checkpoint note below says which subsets and steps this release used |
| Files | best_model.pth (weights only), config.json, speakers.pth, zio-tts.onnx, vocab.json |
Limitations
- Khmer only. Some voices come from 16 kHz or noisy sources and sound duller. Long or rare words may be mispronounced; keep sentences under ~15 s.
- No emotion control yet: the
__<emotion>slot only hasneutraluntil emotional recordings are contributed. - Numbers are read up to 999,999,999; dates, units and mixed Khmer/English text are not handled.
- Don't use it to impersonate anyone. Disclose that the speech is synthetic.
Evaluation
None yet (no MOS, no CER). Treat quality claims as unverified.
License
CC BY-SA 4.0, because parts of the training data are share-alike (a precaution, not legal advice). Code: Apache-2.0. Credits: VITS (Kim et al., 2021), coqui-tts, OpenSLR 42 (Google), seanghay/km-speech-corpus, Digital Divide Data.
Checkpoint
v2, step 16,000 (~10 epochs on ~40 h: SLR42 + seanghay + DDD), initialised from v1. One Kaggle T4 session.
Sample sentences
- αα½ααααΈ ααΎα’ααααα»ααααααΆαααΆαα β
samples/sample1.wav - αααααααα’αΆααΆαααΆαα»ααα’ααΆαα β
samples/sample2.wav - ααα αΌααααααααα α₯α α α α β
samples/sample3.wav - ααααα»ααΆααΆααααααααΆααααααααα·ααΆαααααααΌαααα β
samples/sample4.wav
Same sentence 1 in other voices:
- voice
km_6753__neutralβsamples/voice_km_6753__neutral.wav - voice
km_7548__neutralβsamples/voice_km_7548__neutral.wav - voice
seanghay__neutralβsamples/voice_seanghay__neutral.wav - voice
ddd_f-adt1-0002__neutralβsamples/voice_ddd_f-adt1-0002__neutral.wav
- Downloads last month
- 5