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 has neutral until 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

  1. αžŸαž½αžŸαŸ’αžαžΈ αžαžΎαž’αŸ’αž“αž€αžŸαž»αžαžŸαž”αŸ’αž”αžΆαž™αž‡αžΆαž‘αŸ β€” samples/sample1.wav
  2. αžαŸ’αž„αŸƒαž“αŸαŸ‡αž’αžΆαž€αžΆαžŸαž’αžΆαžαž»αž›αŸ’αž’αžŽαžΆαžŸαŸ‹ β€” samples/sample2.wav
  3. αž˜αŸ’αž αžΌαž”αž“αŸαŸ‡αžαž˜αŸ’αž›αŸƒ αŸ₯αŸ αŸ αŸ αŸ› β€” samples/sample3.wav
  4. αž€αž˜αŸ’αž–αž»αž‡αžΆαž‡αžΆαž”αŸ’αžšαž‘αŸαžŸαž˜αžΆαž“αž”αŸ’αžšαžœαžαŸ’αžαž·αžŸαžΆαžŸαŸ’αžαŸ’αžšαž™αžΌαžšαž›αž„αŸ‹ β€” 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
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support

Dataset used to train sombochea/zio-tts

Paper for sombochea/zio-tts