Open-source multilingual TTS with Voice Cloning support for 150+ languages, built on Neucodec as the speech tokenizer at 50 TPS.
| Model | Link | Purpose |
|---|---|---|
| Multilingual-TTS-0.6B-Base | π€ | Base |
| Multilingual-TTS-1.7B-Base | π€ | Base |
| Multilingual-Expressive-TTS-0.6B | π€ | Post-training TTS |
| Multilingual-Expressive-TTS-1.7B | π€ | Post-training TTS |
CER and MOS across 76 languages, compared against: Dia TTS, Orpheus, Chatterbox (23 languages), Fish Audio S2 Pro, Qwen3 TTS (11 languages).
| Model | Languages | CER β | MOS β |
|---|---|---|---|
| Dia TTS | 76 | 0.8131 | 1.8575 |
| Multilingual TTS 0.6B | 76 | 0.2384 | 3.2273 |
| Multilingual TTS 1.7B | 76 | 0.2362 | 3.2330 |
| Orpheus | 76 | 0.6075 | 2.7267 |
| Chatterbox | 23 | 0.1698 | 2.8405 |
| Fish Audio S2 Pro | 76 | 0.2370 | 2.9698 |
| Qwen3 TTS | 11 | 0.1064 | 2.6073 |
Chatterbox covers 23 languages only; Qwen3 TTS covers 11 languages only. Their averages are not directly comparable to 76-language models.
Speaker similarity and CER across 76 languages, compared against: Dia TTS, Orpheus, Chatterbox (23 languages), Fish Audio S2 Pro.
| Model | Languages | Similarity β | CER β |
|---|---|---|---|
| Dia TTS | 76 | 0.3416 | 0.6867 |
| Multilingual TTS 0.6B | 76 | 0.5051 | 0.2733 |
| Multilingual TTS 1.7B | 76 | 0.5036 | 0.2656 |
| Orpheus | 76 | 0.4002 | 0.6771 |
| Chatterbox | 23 | 0.6704 | 0.1099 |
| Fish Audio S2 Pro | 76 | 0.6097 | 0.2283 |
Chatterbox covers 23 languages only; its averages are not directly comparable to 76-language models.
Sources
Size
Preparation: preparation
Natural-language descriptions of speech audio generated by computing acoustic statistics and categories, then prompting an LLM to summarise them.
Sources
Size
Pipeline
audio + transcript
β
βΌ
speech_categories.py β categories (emotion, gender, fluency, accent, quality)
β speech_stats_func β pitch, SNR, speaking rate, SQUIM
βΌ
calculate_bins.py β bin continuous stats, merge into a single parquet
β
βΌ
synthetic.py β LLM generates a natural-language description per row
Uses Qwen/Qwen2.5-72B-Instruct via DeepInfra by default. Any OpenAI-compatible endpoint works β set API_KEY, BASE_URL, and MODEL_NAME.
Preparation: synthetic-description
Inline non-verbal event tags (laughter, cough, sigh, ...) mined from the Emilia-style corpora with
PANNs SED + CLAP verification + whisper word-timestamp placement, in two renderings per row:
Higgs-TTS style (<|sfx:laughter|>Haha) and Emilia-NV style ([Laughter]).
Sources β outputs
Preparation: nonverbal-tagging
One-epoch results used conservative learning rates, so we ran a focused search:
The original grid scripts only covered Muon+AdamW, so the harness was rebuilt around a pluggable-optimizer trainer: hyperparameter_search.py drives qwen3_optimizer_search.py and sweeps each optimizer over its own LR grid under the identical 100-step setup above.
| optimizer | placement | swept LRs |
|---|---|---|
adamw | everything | 5e-4 Β· 1e-3 Β· 2e-3 |
muon | 2D hidden weights (AdamW on embeddings/head/rest) | matrix 5e-3 Β· 1e-2 Β· 2e-2 |
shampoo (ScalableShampoo) | 2D hidden weights (AdamW on rest) | matrix 5e-4 Β· 1e-3 Β· 3e-3 |
soap | 2D hidden weights (AdamW on rest) | matrix 1e-3 Β· 3e-3 Β· 1e-2 |
lion | everything | 1e-4 Β· 3e-4 (wd 0.1) |
ademamix | everything | 5e-4 Β· 1e-3 |
Hybrid optimizers use the same 2D-hidden-weight/AdamW split as Muon
("Muon is Scalable for LLM Training", arXiv:2502.16982), so the comparison is
apples-to-apples. Runs resume by name (search_state/<run>.json) and the harness ranks
finished runs by mean train loss over the last 10 steps into search_state/summary.json.
pip install pytorch_optimizer # needed for shampoo / soap / lion / ademamix
# everything, or a subset:
python hyperparameter_search.py --train-file <multipacking dir>
python hyperparameter_search.py --train-file <multipacking dir> --optimizers muon shampoo soap
python hyperparameter_search.py --train-file <multipacking dir> --dry-run # print commands only
The train file must be a ChiniDataset multipacking directory (see
preparation); custom grids go in --grid-json.
# 0.6B
bash 0.6B.sh
# 1.7B
bash 1.7B.sh
# 0.6B
bash 0.6B-expressive.sh
# 1.7B
bash 1.7B-expressive.sh
For better concurrency, you can use https://github.com/Scicom-AI-Enterprise-Organization/TTS-API-Neucodec
Jupyter Notebook
98.4%
Python
1.5%
Open-source multilingual TTS with Voice Cloning support for 150+ languages, built on Neucodec as the speech tokenizer at 50 TPS.
| Model | Link | Purpose |
|---|---|---|
| Multilingual-TTS-0.6B-Base | π€ | Base |
| Multilingual-TTS-1.7B-Base | π€ | Base |
| Multilingual-Expressive-TTS-0.6B | π€ | Post-training TTS |
| Multilingual-Expressive-TTS-1.7B | π€ | Post-training TTS |
CER and MOS across 76 languages, compared against: Dia TTS, Orpheus, Chatterbox (23 languages), Fish Audio S2 Pro, Qwen3 TTS (11 languages).
| Model | Languages | CER β | MOS β |
|---|---|---|---|
| Dia TTS | 76 | 0.8131 | 1.8575 |
| Multilingual TTS 0.6B | 76 | 0.2384 | 3.2273 |
| Multilingual TTS 1.7B | 76 | 0.2362 | 3.2330 |
| Orpheus | 76 | 0.6075 | 2.7267 |
| Chatterbox | 23 | 0.1698 | 2.8405 |
| Fish Audio S2 Pro | 76 | 0.2370 | 2.9698 |
| Qwen3 TTS | 11 | 0.1064 | 2.6073 |
Chatterbox covers 23 languages only; Qwen3 TTS covers 11 languages only. Their averages are not directly comparable to 76-language models.
Speaker similarity and CER across 76 languages, compared against: Dia TTS, Orpheus, Chatterbox (23 languages), Fish Audio S2 Pro.
| Model | Languages | Similarity β | CER β |
|---|---|---|---|
| Dia TTS | 76 | 0.3416 | 0.6867 |
| Multilingual TTS 0.6B | 76 | 0.5051 | 0.2733 |
| Multilingual TTS 1.7B | 76 | 0.5036 | 0.2656 |
| Orpheus | 76 | 0.4002 | 0.6771 |
| Chatterbox | 23 | 0.6704 | 0.1099 |
| Fish Audio S2 Pro | 76 | 0.6097 | 0.2283 |
Chatterbox covers 23 languages only; its averages are not directly comparable to 76-language models.
Sources
Size
Preparation: preparation
Natural-language descriptions of speech audio generated by computing acoustic statistics and categories, then prompting an LLM to summarise them.
Sources
Size
Pipeline
audio + transcript
β
βΌ
speech_categories.py β categories (emotion, gender, fluency, accent, quality)
β speech_stats_func β pitch, SNR, speaking rate, SQUIM
βΌ
calculate_bins.py β bin continuous stats, merge into a single parquet
β
βΌ
synthetic.py β LLM generates a natural-language description per row
Uses Qwen/Qwen2.5-72B-Instruct via DeepInfra by default. Any OpenAI-compatible endpoint works β set API_KEY, BASE_URL, and MODEL_NAME.
Preparation: synthetic-description
Inline non-verbal event tags (laughter, cough, sigh, ...) mined from the Emilia-style corpora with
PANNs SED + CLAP verification + whisper word-timestamp placement, in two renderings per row:
Higgs-TTS style (<|sfx:laughter|>Haha) and Emilia-NV style ([Laughter]).
Sources β outputs
Preparation: nonverbal-tagging
One-epoch results used conservative learning rates, so we ran a focused search:
The original grid scripts only covered Muon+AdamW, so the harness was rebuilt around a pluggable-optimizer trainer: hyperparameter_search.py drives qwen3_optimizer_search.py and sweeps each optimizer over its own LR grid under the identical 100-step setup above.
| optimizer | placement | swept LRs |
|---|---|---|
adamw | everything | 5e-4 Β· 1e-3 Β· 2e-3 |
muon | 2D hidden weights (AdamW on embeddings/head/rest) | matrix 5e-3 Β· 1e-2 Β· 2e-2 |
shampoo (ScalableShampoo) | 2D hidden weights (AdamW on rest) | matrix 5e-4 Β· 1e-3 Β· 3e-3 |
soap | 2D hidden weights (AdamW on rest) | matrix 1e-3 Β· 3e-3 Β· 1e-2 |
lion | everything | 1e-4 Β· 3e-4 (wd 0.1) |
ademamix | everything | 5e-4 Β· 1e-3 |
Hybrid optimizers use the same 2D-hidden-weight/AdamW split as Muon
("Muon is Scalable for LLM Training", arXiv:2502.16982), so the comparison is
apples-to-apples. Runs resume by name (search_state/<run>.json) and the harness ranks
finished runs by mean train loss over the last 10 steps into search_state/summary.json.
pip install pytorch_optimizer # needed for shampoo / soap / lion / ademamix
# everything, or a subset:
python hyperparameter_search.py --train-file <multipacking dir>
python hyperparameter_search.py --train-file <multipacking dir> --optimizers muon shampoo soap
python hyperparameter_search.py --train-file <multipacking dir> --dry-run # print commands only
The train file must be a ChiniDataset multipacking directory (see
preparation); custom grids go in --grid-json.
# 0.6B
bash 0.6B.sh
# 1.7B
bash 1.7B.sh
# 0.6B
bash 0.6B-expressive.sh
# 1.7B
bash 1.7B-expressive.sh
For better concurrency, you can use https://github.com/Scicom-AI-Enterprise-Organization/TTS-API-Neucodec
Jupyter Notebook
98.4%
Python
1.5%