feat(tts): emotion tags reach the model, long scripts are chunked

The upstream Chatterbox README documents paralinguistic tags ([laugh],
[chuckle], [sigh], ...) as native to the Turbo family, and the vendored
Turbo pack passes them straight to the tokenizer -- it never parses them.
Our engine deleted them before the model saw them, so the feature looked
implemented and was inaudible.

* the text engine keeps a Turbo tag verbatim and records its name; on any
  other pack the nine Turbo names stay literal text instead of being
  swallowed as a voice name, and the run says so
* the v2 angle tokens are re-spelled for Turbo (<giggle> -> [giggle]) and
  left untouched everywhere else
* generate_audio now builds one plan for every family, synthesises one
  chunk per model call and joins the chunks; the classic path goes through
  the engine too, which is what makes "[Alice]" open a character segment
* per-chunk seeds (seed + index) keep a chunked run reproducible without
  giving every chunk the same prosody
* four appended widgets on ChatterboxTTS: enable_chunking,
  max_chars_per_chunk, chunk_combination_method, silence_between_chunks_ms
* chunk boundaries prefer a sentence end and never land inside a tag
* Turbo's exaggeration is passed as 0.0: the family ignores it for
  sampling and upstream warns about every non-zero value, once per chunk
This commit is contained in:
WildAi
2026-10-22 15:01:53 +03:00
parent 4597af8f59
commit ceea0c71cf
13 changed files with 1332 additions and 128 deletions
+10 -2
View File
@@ -313,7 +313,11 @@
1000,
true,
10,
1
1,
true,
400,
"auto",
100
],
"widgets_values_named": {
"model_pack_name": "chatterbox",
@@ -335,7 +339,11 @@
"top_k": 1000,
"normalize_loudness": true,
"num_steps": 10,
"cfg_scale": 1
"cfg_scale": 1,
"enable_chunking": true,
"max_chars_per_chunk": 400,
"chunk_combination_method": "auto",
"silence_between_chunks_ms": 100
},
"color": "#232",
"bgcolor": "#353"