Add OmniVoice to benchmark tables; new headline; clearer WHO wording
#4
by zeroweightai - opened
README.md
CHANGED
|
@@ -100,7 +100,7 @@ model-index:
|
|
| 100 |
|
| 101 |
# ZeroTTS
|
| 102 |
|
| 103 |
-
###
|
| 104 |
|
| 105 |
**The most accurate open Vietnamese TTS we know of — 13× fewer word errors than
|
| 106 |
the next open model**, and it runs faster than real time on a laptop CPU.
|
|
@@ -142,8 +142,11 @@ for chunk in tts.synthesize_stream("Một đoạn văn bản dài hơn…", voic
|
|
| 142 |
## Benchmarks
|
| 143 |
|
| 144 |
Measured on **[ZeroBench-TTS](https://huggingface.co/datasets/zeroweight-ai/ZeroBench-TTS)** —
|
| 145 |
-
137 items, 59 held-out reference voices × 4 subsets — against
|
| 146 |
-
|
|
|
|
|
|
|
|
|
|
| 147 |
|
| 148 |
**Scored by the benchmark, not by us.** ZeroTTS synthesizes the clips and hands
|
| 149 |
them to `zerobench_eval`, the official scorer published inside the benchmark
|
|
@@ -157,34 +160,37 @@ the same input, so the comparison is like-for-like.
|
|
| 157 |
|
| 158 |
This is the condition a Vietnamese TTS system meets in production, where a text
|
| 159 |
frontend runs ahead of the model. ZeroTTS ships one — `normalize_vi_text`,
|
| 160 |
-
applied by default (see the [GitHub README](https://github.com/zeroweight-ai/ZeroTTS#usage)) — which
|
| 161 |
-
on
|
| 162 |
-
|
| 163 |
-
|
| 164 |
-
|
| 165 |
-
| | **ZeroTTS** | XTTS-v2-vietnamse | viXTTS |
|
| 166 |
-
|---|:-:|:-:|:-:|
|
| 167 |
-
| **WER** ↓ | **0.56 %** | 7.27 % | 8.61 % |
|
| 168 |
-
| **Naturalness** (UTMOS) ↑ | **2.91** | 2.
|
| 169 |
-
| **Voice similarity** (SSIM) ↑ | 0.
|
| 170 |
-
| **Dead air** (excess silence) ↓ | **0.029 s** | 0.
|
| 171 |
-
|
| 172 |
-
|
| 173 |
-
|
| 174 |
-
|
|
|
|
|
|
|
|
|
|
| 175 |
|
| 176 |
### WER — normalized text
|
| 177 |
|
| 178 |
The headline condition: numbers and dates already spoken out, as the shipped
|
| 179 |
normalizer produces.
|
| 180 |
|
| 181 |
-
| Subset | what it tests | **ZeroTTS** | XTTS-v2-vietnamse | viXTTS |
|
| 182 |
-
|---|---|:-:|:-:|:-:|
|
| 183 |
-
| `vietnamese` | monolingual Vietnamese | **0.21 %** | 7.21 % | 7.54 % |
|
| 184 |
-
| `code_switch` | Vietnamese + embedded English | **0.
|
| 185 |
-
| `cross_lingual` | foreign voice prompt → Vietnamese | **0.38 %** | 4.94 % | 6.61 % |
|
| 186 |
-
| `challenging` | acronyms, dates, %, currency | **0.61 %** | 5.63 % | 13.44 % |
|
| 187 |
-
| **overall** | | **0.56 %** | **7.27 %** | **8.61 %** |
|
| 188 |
|
| 189 |
### WER — raw text
|
| 190 |
|
|
@@ -192,37 +198,50 @@ The harder condition: the model is handed `31/12/2025` and `ChatGPT` verbatim
|
|
| 192 |
and has to read them itself, with no normalizer in front. This is what a system
|
| 193 |
with no Vietnamese text frontend faces.
|
| 194 |
|
| 195 |
-
| Subset | what it tests | **ZeroTTS** | XTTS-v2-vietnamse | viXTTS |
|
| 196 |
-
|---|---|:-:|:-:|:-:|
|
| 197 |
-
| `vietnamese` | monolingual Vietnamese | **0.16 %** | 7.92 % | 9.56 % |
|
| 198 |
-
| `code_switch` | Vietnamese + embedded English | **0.
|
| 199 |
-
| `cross_lingual` | foreign voice prompt → Vietnamese | **1.42 %** | 21.37 % | 27.27 % |
|
| 200 |
-
| `challenging` | acronyms, dates, %, currency | **1.75 %** | 27.86 % | 31.85 % |
|
| 201 |
-
| **overall** | | **1.03 %** | **16.42 %** | **18.40 %** |
|
| 202 |
|
| 203 |
**Reading these fairly:**
|
| 204 |
|
| 205 |
-
* **
|
| 206 |
-
|
| 207 |
-
|
| 208 |
-
|
| 209 |
-
|
| 210 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 211 |
* **`vietnamese` barely moves for anyone** (0.16 % → 0.21 % for ZeroTTS). It has
|
| 212 |
no digits or acronyms, so there is nothing to normalize — which is the control
|
| 213 |
showing the other subsets' gains are real and not a scoring artifact.
|
| 214 |
-
* **
|
| 215 |
-
|
| 216 |
-
|
| 217 |
-
while winning that subset's WER by 15×.
|
| 218 |
* **The WER definition matters more than the WER.** ZeroBench scores every clip
|
| 219 |
with **two ASRs** (`whisper-large-v3` + `PhoWhisper-large`, min taken — neither
|
| 220 |
can judge Vietnamese code-switch TTS alone) against **every acceptable
|
| 221 |
-
reading** of the target text
|
| 222 |
-
|
|
|
|
|
|
|
| 223 |
* **Our remaining errors are published, not hidden.** Every item scoring above
|
| 224 |
-
0.00 is audited in [docs/BENCHMARKS.md](https://github.com/zeroweight-ai/ZeroTTS/blob/main/docs/BENCHMARKS.md)
|
| 225 |
-
|
|
|
|
|
|
|
|
|
|
| 226 |
|
| 227 |
Reproduce, or score your own system:
|
| 228 |
|
|
|
|
| 100 |
|
| 101 |
# ZeroTTS
|
| 102 |
|
| 103 |
+
### 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.
|
| 104 |
|
| 105 |
**The most accurate open Vietnamese TTS we know of — 13× fewer word errors than
|
| 106 |
the next open model**, and it runs faster than real time on a laptop CPU.
|
|
|
|
| 142 |
## Benchmarks
|
| 143 |
|
| 144 |
Measured on **[ZeroBench-TTS](https://huggingface.co/datasets/zeroweight-ai/ZeroBench-TTS)** —
|
| 145 |
+
137 items, 59 held-out reference voices × 4 subsets — against
|
| 146 |
+
[OmniVoice](https://huggingface.co/k2-fsa/OmniVoice) and the two public
|
| 147 |
+
Vietnamese XTTS-v2 finetunes. 137/137 scored for every system, 0 empty
|
| 148 |
+
generations. OmniVoice is given its optional `language="vi"` hint, which its
|
| 149 |
+
model card recommends and which measurably helps it.
|
| 150 |
|
| 151 |
**Scored by the benchmark, not by us.** ZeroTTS synthesizes the clips and hands
|
| 152 |
them to `zerobench_eval`, the official scorer published inside the benchmark
|
|
|
|
| 160 |
|
| 161 |
This is the condition a Vietnamese TTS system meets in production, where a text
|
| 162 |
frontend runs ahead of the model. ZeroTTS ships one — `normalize_vi_text`,
|
| 163 |
+
applied by default (see the [GitHub README](https://github.com/zeroweight-ai/ZeroTTS#usage)) — which reproduces the benchmark's
|
| 164 |
+
reading on 34 of the 35 items that need normalization. Neither baseline ships a
|
| 165 |
+
Vietnamese frontend at all, which is why the raw-text table below is so much
|
| 166 |
+
harsher on them.
|
| 167 |
+
|
| 168 |
+
| | **ZeroTTS** | OmniVoice | XTTS-v2-vietnamse | viXTTS |
|
| 169 |
+
|---|:-:|:-:|:-:|:-:|
|
| 170 |
+
| **WER** ↓ | **0.56 %** | 2.12 % | 7.27 % | 8.61 % |
|
| 171 |
+
| **Naturalness** (UTMOS) ↑ | **2.91** | 2.75 | 2.49 | 2.34 |
|
| 172 |
+
| **Voice similarity** (SSIM) ↑ | 0.938 | **0.951** | 0.941 | 0.935 |
|
| 173 |
+
| **Dead air** (excess silence) ↓ | **0.029 s** | 0.386 s | 0.568 s | 0.215 s |
|
| 174 |
+
| Size | **81 M**, CPU | 3.1 GB, GPU | 1.9 GB, GPU | 1.9 GB, GPU |
|
| 175 |
+
|
| 176 |
+
**4× fewer word errors than the next-best system**, ~0.2 MOS more natural, an
|
| 177 |
+
order of magnitude less dead air — from a model small enough to run real-time
|
| 178 |
+
on a laptop CPU. Median WER is **0.00 %** on all four subsets: the typical
|
| 179 |
+
generation is transcribed exactly. (Every figure is from the same
|
| 180 |
+
normalized-text runs, so the rows are mutually consistent.)
|
| 181 |
|
| 182 |
### WER — normalized text
|
| 183 |
|
| 184 |
The headline condition: numbers and dates already spoken out, as the shipped
|
| 185 |
normalizer produces.
|
| 186 |
|
| 187 |
+
| Subset | what it tests | **ZeroTTS** | OmniVoice | XTTS-v2-vietnamse | viXTTS |
|
| 188 |
+
|---|---|:-:|:-:|:-:|:-:|
|
| 189 |
+
| `vietnamese` | monolingual Vietnamese | **0.21 %** | 0.50 % | 7.21 % | 7.54 % |
|
| 190 |
+
| `code_switch` | Vietnamese + embedded English | 0.95 % | **0.46 %** | 10.14 % | 5.86 % |
|
| 191 |
+
| `cross_lingual` | foreign voice prompt → Vietnamese | **0.38 %** | 9.60 % | 4.94 % | 6.61 % |
|
| 192 |
+
| `challenging` | acronyms, dates, %, currency | **0.61 %** | 1.56 % | 5.63 % | 13.44 % |
|
| 193 |
+
| **overall** | | **0.56 %** | **2.12 %** | **7.27 %** | **8.61 %** |
|
| 194 |
|
| 195 |
### WER — raw text
|
| 196 |
|
|
|
|
| 198 |
and has to read them itself, with no normalizer in front. This is what a system
|
| 199 |
with no Vietnamese text frontend faces.
|
| 200 |
|
| 201 |
+
| Subset | what it tests | **ZeroTTS** | OmniVoice | XTTS-v2-vietnamse | viXTTS |
|
| 202 |
+
|---|---|:-:|:-:|:-:|:-:|
|
| 203 |
+
| `vietnamese` | monolingual Vietnamese | **0.16 %** | 0.50 % | 7.92 % | 9.56 % |
|
| 204 |
+
| `code_switch` | Vietnamese + embedded English | 0.97 % | **0.46 %** | 10.94 % | 9.25 % |
|
| 205 |
+
| `cross_lingual` | foreign voice prompt → Vietnamese | **1.42 %** | 17.71 % | 21.37 % | 27.27 % |
|
| 206 |
+
| `challenging` | acronyms, dates, %, currency | **1.75 %** | 4.46 % | 27.86 % | 31.85 % |
|
| 207 |
+
| **overall** | | **1.03 %** | **4.13 %** | **16.42 %** | **18.40 %** |
|
| 208 |
|
| 209 |
**Reading these fairly:**
|
| 210 |
|
| 211 |
+
* **OmniVoice beats us on two things, and they are worth naming.** Its speaker
|
| 212 |
+
similarity is the best of the four (0.951 vs our 0.938), and on `code_switch`
|
| 213 |
+
it is roughly half our error rate (0.46 % vs 0.95 %). If cloning fidelity or
|
| 214 |
+
English-in-Vietnamese is your priority, it is a genuinely strong option — at
|
| 215 |
+
3.1 GB on a GPU.
|
| 216 |
+
* **OmniVoice's overall figure is dominated by one subset.** `cross_lingual`
|
| 217 |
+
(foreign voice prompt, Vietnamese text) costs it 17.71 % raw against our
|
| 218 |
+
1.42 %, and it is language-dependent — German 0.00 %, Korean 0.13 %, Japanese
|
| 219 |
+
0.41 %. Excluding that subset it lands near 1.7 % raw. Both ASRs agree the
|
| 220 |
+
audio genuinely degrades there, so it is the model, not the scorer.
|
| 221 |
+
* **Normalization is where the weakest systems gain most, and the order does not
|
| 222 |
+
change.** The XTTS tokenizers have no Vietnamese number expansion, so raw text
|
| 223 |
+
punishes them hard (`challenging` 27.86 %) and the normalized column is the
|
| 224 |
+
fairest comparison available — it improves XTTS 2.3× and viXTTS 2.1×, against
|
| 225 |
+
1.8× for us. What remains is the acoustic model.
|
| 226 |
* **`vietnamese` barely moves for anyone** (0.16 % → 0.21 % for ZeroTTS). It has
|
| 227 |
no digits or acronyms, so there is nothing to normalize — which is the control
|
| 228 |
showing the other subsets' gains are real and not a scoring artifact.
|
| 229 |
+
* **On `cross_lingual` our voice similarity is the weak spot** (0.911 vs
|
| 230 |
+
~0.935 for the others): ZeroTTS carries a foreign speaker's timbre into
|
| 231 |
+
Vietnamese slightly less faithfully, while winning that subset's WER by 12×.
|
|
|
|
| 232 |
* **The WER definition matters more than the WER.** ZeroBench scores every clip
|
| 233 |
with **two ASRs** (`whisper-large-v3` + `PhoWhisper-large`, min taken — neither
|
| 234 |
can judge Vietnamese code-switch TTS alone) against **every acceptable
|
| 235 |
+
reading** of the target text, so a system is never charged for an ASR's
|
| 236 |
+
choice between "31/12/2025" and "ba mươi mốt tháng mười hai". Its test suite
|
| 237 |
+
pins that in both directions: format differences must score 0, real
|
| 238 |
+
mispronunciations must still cost.
|
| 239 |
* **Our remaining errors are published, not hidden.** Every item scoring above
|
| 240 |
+
0.00 is audited in [docs/BENCHMARKS.md](https://github.com/zeroweight-ai/ZeroTTS/blob/main/docs/BENCHMARKS.md). The two recurring
|
| 241 |
+
ones: a leading zero read aloud (`18/04` → "tháng **không** tư"), and the
|
| 242 |
+
letters `W` and `H` coming out wrong when an acronym has to be spelled —
|
| 243 |
+
`WHO` should be spelled out letter by letter, and instead comes out as
|
| 244 |
+
something like "Hall".
|
| 245 |
|
| 246 |
Reproduce, or score your own system:
|
| 247 |
|