btsee/oron-tts

Model

OronTTS — Mongolian text to speech

1

370 commits

3 linked in READMEs

updated Sep 8, 2026

See the code

README

OronTTS — Mongolian text to speech

Speaks Mongolian (Khalkha, Cyrillic) in two fixed voices, one male and one female. A finetune of F5-TTS on cleaned Mongolian speech from three public corpora.

Listen

Male:

Female:

Install

pip install git+https://github.com/SWivid/F5-TTS.git
pip install git+https://github.com/btseee/oron-tts.git

Use

import soundfile as sf
from huggingface_hub import hf_hub_download
from f5_tts.api import F5TTS
from oron_tts.text import MongolianNormalizer

VOICE = "female"          # or "male"

ckpt  = hf_hub_download("btsee/oron-tts", "model.safetensors")
vocab = hf_hub_download("btsee/oron-tts", "vocab.txt")
ref   = hf_hub_download("btsee/oron-tts", f"voices/{VOICE}.wav")
rtxt  = hf_hub_download("btsee/oron-tts", f"voices/{VOICE}.txt")

tts = F5TTS(model="F5TTS_v1_Base", ckpt_file=ckpt, vocab_file=vocab, use_ema=False)
wav, sr, _ = tts.infer(
    ref_file=ref,
    ref_text=open(rtxt, encoding="utf-8").read().strip(),
    gen_text=MongolianNormalizer().normalize("Сайн байна уу. Өнөөдөр цаг агаар сайхан байна.",
                                             strict=True),
    nfe_step=32, cfg_strength=2.0, sway_sampling_coef=-1.0, seed=0)

sf.write("out.wav", wav, sr)

Two things that break it silently

Keep use_ema=False. The EMA weights synthesise fluent non-words, an order of magnitude worse by CER than the raw tensors, while sounding like confident speech -- so you will not hear the mistake.

Normalise the text. Anything outside the vocabulary is read as a space, because unknown ids map to index 0 and index 0 is the space token. Digits, Latin letters and punctuation all need MongolianNormalizer.

Numbers

Measured on the shipped voices/ prompts, over held-out sentences never used to select anything: n=360 per voice. Micro-CER and mean UTMOS, 95% bootstrap intervals.

malefemale
CER0.0564 [0.0520–0.0605]0.0630 [0.0585–0.0676]
UTMOS2.98 [2.95–3.01]2.95 [2.92–2.98]
speaker similarity to own prompt0.7410.717

The voices score 0.105 against each other; here real same-speaker pairs score 0.540–0.833, different speakers 0.034–0.503.

Per-checkpoint numbers in eval.json, curves in TensorBoard.

Limits

  • The output is wideband, roughly 8 kHz -- not full-band: the corpus pipeline decoded to 16 kHz before measuring. Not a limit of Mongolian audio; fixed after this model.
  • The CER above is optimistic: its scorer is fine-tuned on Common Voice, which is most of this model's training data, so read every CER against the ground-truth human floor, never against zero.
  • No listening test has been run -- UTMOS is a proxy trained on English and Japanese MOS data, never validated for Mongolian.
  • There is no watermarking; audio from this model cannot be detected as synthetic by any downstream tool.
  • Consent: Common Voice contributors dedicated their recordings CC0 for speech research and did not consent to having their individual voice cloned.
  • The normaliser refuses numeral case suffixes it cannot expand without guessing, so a little input is rejected rather than mispronounced.

Licence

CC-BY-4.0. Attribution is required because FLEURS is CC-BY-4.0. It does not train on WorldSpeech, so it carries no non-commercial restriction.

cyrillic
f5-tts
flow-matching
khalkha
model-index
mongolian
safetensors
tensorboard
text-to-speech
vocos
voice-cloning

Contributors

btsee

370 commits

btsee/oron-tts

Model

OronTTS — Mongolian text to speech

1

370 commits

3 linked in READMEs

updated Sep 8, 2026

See the code

README

OronTTS — Mongolian text to speech

Speaks Mongolian (Khalkha, Cyrillic) in two fixed voices, one male and one female. A finetune of F5-TTS on cleaned Mongolian speech from three public corpora.

Listen

Male:

Female:

Install

pip install git+https://github.com/SWivid/F5-TTS.git
pip install git+https://github.com/btseee/oron-tts.git

Use

import soundfile as sf
from huggingface_hub import hf_hub_download
from f5_tts.api import F5TTS
from oron_tts.text import MongolianNormalizer

VOICE = "female"          # or "male"

ckpt  = hf_hub_download("btsee/oron-tts", "model.safetensors")
vocab = hf_hub_download("btsee/oron-tts", "vocab.txt")
ref   = hf_hub_download("btsee/oron-tts", f"voices/{VOICE}.wav")
rtxt  = hf_hub_download("btsee/oron-tts", f"voices/{VOICE}.txt")

tts = F5TTS(model="F5TTS_v1_Base", ckpt_file=ckpt, vocab_file=vocab, use_ema=False)
wav, sr, _ = tts.infer(
    ref_file=ref,
    ref_text=open(rtxt, encoding="utf-8").read().strip(),
    gen_text=MongolianNormalizer().normalize("Сайн байна уу. Өнөөдөр цаг агаар сайхан байна.",
                                             strict=True),
    nfe_step=32, cfg_strength=2.0, sway_sampling_coef=-1.0, seed=0)

sf.write("out.wav", wav, sr)

Two things that break it silently

Keep use_ema=False. The EMA weights synthesise fluent non-words, an order of magnitude worse by CER than the raw tensors, while sounding like confident speech -- so you will not hear the mistake.

Normalise the text. Anything outside the vocabulary is read as a space, because unknown ids map to index 0 and index 0 is the space token. Digits, Latin letters and punctuation all need MongolianNormalizer.

Numbers

Measured on the shipped voices/ prompts, over held-out sentences never used to select anything: n=360 per voice. Micro-CER and mean UTMOS, 95% bootstrap intervals.

malefemale
CER0.0564 [0.0520–0.0605]0.0630 [0.0585–0.0676]
UTMOS2.98 [2.95–3.01]2.95 [2.92–2.98]
speaker similarity to own prompt0.7410.717

The voices score 0.105 against each other; here real same-speaker pairs score 0.540–0.833, different speakers 0.034–0.503.

Per-checkpoint numbers in eval.json, curves in TensorBoard.

Limits

  • The output is wideband, roughly 8 kHz -- not full-band: the corpus pipeline decoded to 16 kHz before measuring. Not a limit of Mongolian audio; fixed after this model.
  • The CER above is optimistic: its scorer is fine-tuned on Common Voice, which is most of this model's training data, so read every CER against the ground-truth human floor, never against zero.
  • No listening test has been run -- UTMOS is a proxy trained on English and Japanese MOS data, never validated for Mongolian.
  • There is no watermarking; audio from this model cannot be detected as synthetic by any downstream tool.
  • Consent: Common Voice contributors dedicated their recordings CC0 for speech research and did not consent to having their individual voice cloned.
  • The normaliser refuses numeral case suffixes it cannot expand without guessing, so a little input is rejected rather than mispronounced.

Licence

CC-BY-4.0. Attribution is required because FLEURS is CC-BY-4.0. It does not train on WorldSpeech, so it carries no non-commercial restriction.

cyrillic
f5-tts
flow-matching
khalkha
model-index
mongolian
safetensors
tensorboard
text-to-speech
vocos
voice-cloning

Contributors

btsee

370 commits