Update README (intro bullets, trimmed benchmark section, voice example) and banner image
aba7690 verified | license: mit | |
| language: | |
| - vi | |
| library_name: onnx | |
| pipeline_tag: text-to-speech | |
| tags: | |
| - text-to-speech | |
| - tts | |
| - vietnamese | |
| - onnx | |
| - onnxruntime | |
| - zero-shot | |
| - speech-synthesis | |
| - voice-cloning | |
| - vietnamese-tts | |
| - tieng-viet | |
| metrics: | |
| - wer | |
| model-index: | |
| - name: ZeroTTS | |
| results: | |
| - task: | |
| type: text-to-speech | |
| name: Zero-Shot Text-to-Speech | |
| dataset: | |
| type: zeroweight-ai/ZeroBench-TTS | |
| name: ZeroBench-TTS | |
| split: test | |
| metrics: | |
| - type: wer | |
| value: 0.56 | |
| name: WER (%) — normalized text | |
| - type: utmos | |
| value: 2.91 | |
| name: UTMOSv2 naturalness MOS | |
| - type: speaker_similarity | |
| value: 0.936 | |
| name: Speaker similarity (WavLM-SV cosine) | |
| - type: excess_silence | |
| value: 0.029 | |
| name: Excess silence (s) | |
| - task: | |
| type: text-to-speech | |
| name: Zero-Shot TTS — monolingual Vietnamese | |
| dataset: | |
| type: zeroweight-ai/ZeroBench-TTS | |
| name: ZeroBench-TTS (vietnamese) | |
| config: vietnamese | |
| split: test | |
| metrics: | |
| - type: wer | |
| value: 0.21 | |
| name: WER (%) — normalized text | |
| - task: | |
| type: text-to-speech | |
| name: Zero-Shot TTS — Vietnamese/English code-switching | |
| dataset: | |
| type: zeroweight-ai/ZeroBench-TTS | |
| name: ZeroBench-TTS (code_switch) | |
| config: code_switch | |
| split: test | |
| metrics: | |
| - type: wer | |
| value: 0.95 | |
| name: WER (%) — normalized text | |
| - task: | |
| type: text-to-speech | |
| name: Zero-Shot TTS — cross-lingual voice prompt | |
| dataset: | |
| type: zeroweight-ai/ZeroBench-TTS | |
| name: ZeroBench-TTS (cross_lingual) | |
| config: cross_lingual | |
| split: test | |
| metrics: | |
| - type: wer | |
| value: 0.38 | |
| name: WER (%) — normalized text | |
| - task: | |
| type: text-to-speech | |
| name: Zero-Shot TTS — acronyms, dates, numbers | |
| dataset: | |
| type: zeroweight-ai/ZeroBench-TTS | |
| name: ZeroBench-TTS (challenging) | |
| config: challenging | |
| split: test | |
| metrics: | |
| - type: wer | |
| value: 0.61 | |
| name: WER (%) — normalized text | |
| <img src="banner.png" alt="ZeroTTS — Vietnamese zero-shot text-to-speech" width="100%"> | |
| # ZeroTTS | |
| ### Vietnamese Zero-Shot Text-to-Speech (TTS) with real-time streaming and voice cloning from seconds of audio. Fast, natural, and optimised for CPU inference. | |
| **The most accurate open Vietnamese TTS we know of — 13× fewer word errors than | |
| the next open model**, and it runs faster than real time on a laptop CPU. | |
| * 🎯 **Ultra-natural** — 2.91 UTMOS, ~0.5 MOS above every other open Vietnamese | |
| system, with near-zero dead air (0.029 s vs 0.23–0.53 s). | |
| * 🗣️ **Zero-shot voice cloning** — a voice is a small latent array; drop it in | |
| and the model speaks in it, cloned from as little as 3 seconds of reference | |
| audio (up to 30 seconds). No fine-tuning, no per-speaker training. | |
| * ⚡ **Real-time on CPU, streaming** — ~2× faster than real time (RTF 0.5×), | |
| first audio chunk in ~70 ms. No GPU required. | |
| * 🇻🇳 **Built for Vietnamese** — tones, code-switched English, and a built-in | |
| normalizer that reads `31/12/2025` and `1.250 tỷ` the way a person would. | |
| * Code, examples, browser demo: **https://github.com/zeroweight-ai/ZeroTTS** | |
| * Benchmark dataset: **https://huggingface.co/datasets/zeroweight-ai/ZeroBench-TTS** | |
| ```python | |
| pip install zerotts | |
| ``` | |
| ```python | |
| from zerotts import ZeroTTS | |
| tts = ZeroTTS.from_pretrained("zeroweight-ai/ZeroTTS") | |
| audio = tts.synthesize("Xin chào các bạn, mình là ZeroTTS.", voice="maichi") | |
| tts.save_audio(audio, "out.wav") | |
| ``` | |
| Streaming, with first audio in roughly 70 ms: | |
| ```python | |
| for chunk in tts.synthesize_stream("Một đoạn văn bản dài hơn…", voice="maichi"): | |
| play(chunk) # (1, n) float32 at 48 kHz | |
| ``` | |
| ## Benchmarks | |
| Measured on **[ZeroBench-TTS](https://huggingface.co/datasets/zeroweight-ai/ZeroBench-TTS)** | |
| against OmniVoice, XTTS-v2-vietnamse and viXTTS, on normalized text (dates, | |
| numbers and acronyms already spoken out): **0.56 % WER** (4× fewer errors than | |
| the next-best system, median 0.00 % on all four subsets), **2.91 UTMOS**, and | |
| **0.029 s** of dead air. On CPU it runs ~2× faster than real time (RTF 0.5×) | |
| with first audio in ~70 ms of streaming. | |
| Full comparison tables, per-subset breakdowns, and CPU speed methodology: | |
| **[docs/BENCHMARKS.md](https://github.com/zeroweight-ai/ZeroTTS/blob/main/docs/BENCHMARKS.md)** | |
| on GitHub. | |
| ## Voices, and voice cloning | |
| A voice is a small array of speaker latents, `(1, n_voice_queries, d_model)`, | |
| shipped as a `.npz` under `voices/`. That array is the entire speaker | |
| conditioning — no reference transcript, no audio prompt. | |
| > **Voice cloning is not available in this release.** Those latents come from a | |
| > voice encoder that reads a reference clip, and that encoder is not published. | |
| > This repository ships ready-to-use voices; it cannot create new ones from | |
| > audio. | |
| > | |
| > To get latents for your own speaker, see **[zeroweight.ai](https://zeroweight.ai)** | |
| > or get in touch. | |
| Because a voice is just an array, latents obtained that way drop into | |
| `voices/<name>/voice.npz` and work with no code change. | |
| ## Intended use and limitations | |
| Built for **Vietnamese**. It handles English words embedded in Vietnamese text | |
| (`code_switch`), but it is not an English TTS system and is not evaluated as one. | |
| Do not use it to impersonate a real person, to generate speech attributed to | |
| someone without their consent, or to produce audio intended to deceive. The | |
| shipped voices are for evaluation and demos. | |
| Synthetic speech should be disclosed as synthetic wherever a listener might | |
| reasonably assume otherwise. | |
| ## Credits | |
| Speech codec: **MOSS-Audio-Tokenizer-Nano** by the OpenMOSS team, Apache-2.0. | |
| Its ONNX **decoder** graphs are redistributed under `onnx/codec/` so ZeroTTS has | |
| no external runtime dependency; the encoder is not included. See | |
| `onnx/codec/LICENSE-Apache-2.0.txt`. | |
| ```bibtex | |
| @misc{gong2026mossaudiotokenizerscalingaudiotokenizers, | |
| title={MOSS-Audio-Tokenizer: Scaling Audio Tokenizers for Future Audio Foundation Models}, | |
| author={Yitian Gong and Kuangwei Chen and Zhaoye Fei and Xiaogui Yang and Ke Chen | |
| and Yang Wang and Kexin Huang and Mingshu Chen and Ruixiao Li | |
| and Qingyuan Cheng and Shimin Li and Xipeng Qiu}, | |
| year={2026}, eprint={2602.10934}, archivePrefix={arXiv}, primaryClass={cs.SD} | |
| } | |
| ``` | |
| ## License | |
| ZeroTTS weights and code: **MIT**. | |
| The ZeroBench-TTS *dataset* is CC-BY-NC-4.0 because it redistributes reference | |
| audio from VIVOS, viVoice, phoaudiobook and Emilia. That license applies to the | |
| benchmark dataset only — **not** to these weights. | |