Add OmniVoice to benchmark tables; new headline; clearer WHO wording

#4
Files changed (1) hide show
  1. README.md +65 -46
README.md CHANGED
@@ -100,7 +100,7 @@ model-index:
100
 
101
  # ZeroTTS
102
 
103
- ### Ultra-natural Vietnamese speech, cloned from seconds of audio streaming, real-time on a CPU
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 the two public
146
- Vietnamese XTTS-v2 finetunes. 137/137 scored, 0 empty generations.
 
 
 
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 reaches the benchmark's reading
161
- on 27 of the 35 items that need normalization; the remaining gaps are date
162
- separators and alphanumeric codes. Neither baseline ships a Vietnamese frontend
163
- at all, which is why the raw-text table below is so much harsher on them.
164
-
165
- | | **ZeroTTS** | XTTS-v2-vietnamse | viXTTS |
166
- |---|:-:|:-:|:-:|
167
- | **WER** ↓ | **0.56 %** | 7.27 % | 8.61 % |
168
- | **Naturalness** (UTMOS) ↑ | **2.91** | 2.43 | 2.35 |
169
- | **Voice similarity** (SSIM) ↑ | 0.936 | **0.940** | 0.935 |
170
- | **Dead air** (excess silence) ↓ | **0.029 s** | 0.532 s | 0.233 s |
171
-
172
- **13× fewer word errors**, ~0.5 MOS more natural, an order of magnitude less
173
- dead air. Median WER is **0.00 %** on all four subsets — the typical generation
174
- is transcribed exactly.
 
 
 
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.95 %** | 10.14 % | 5.86 % |
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.97 %** | 10.94 % | 9.25 % |
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
- * **Normalization is where the baselines gain most, and we still win.** Their
206
- tokenizers genuinely have no Vietnamese number expansion, so raw text punishes
207
- them hard (`challenging` 27.86 %) and the normalized column is the fairest
208
- comparison available it improves XTTS 2.3× and viXTTS 2.1×, against 1.8× for
209
- us. The gap narrows from 16× to 13× and stops there, because what remains is
210
- the acoustic model.
 
 
 
 
 
 
 
 
 
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
- * **Voice similarity is a tie, not a win.** 0.936 / 0.940 / 0.935 is within
215
- noise. On `cross_lingual` ZeroTTS is genuinely behind (0.911 vs ~0.935): it
216
- carries a foreign speaker's timbre into Vietnamese slightly less faithfully,
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. Its test suite pins the policy in both
222
- directions: format artifacts must score 0, real defects must still cost.
 
 
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) mostly voiced
225
- leading zeros in dates and `W`/`H` acronym letter names.
 
 
 
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