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.
Male:
Female:
pip install git+https://github.com/SWivid/F5-TTS.git
pip install git+https://github.com/btseee/oron-tts.git
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)
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.
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.
| male | female | |
|---|---|---|
| CER | 0.0564 [0.0520–0.0605] | 0.0630 [0.0585–0.0676] |
| UTMOS | 2.98 [2.95–3.01] | 2.95 [2.92–2.98] |
| speaker similarity to own prompt | 0.741 | 0.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.
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.
370 commits
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.
Male:
Female:
pip install git+https://github.com/SWivid/F5-TTS.git
pip install git+https://github.com/btseee/oron-tts.git
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)
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.
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.
| male | female | |
|---|---|---|
| CER | 0.0564 [0.0520–0.0605] | 0.0630 [0.0585–0.0676] |
| UTMOS | 2.98 [2.95–3.01] | 2.95 [2.92–2.98] |
| speaker similarity to own prompt | 0.741 | 0.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.
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.
370 commits