Files
wildminder-ComfyUI-Chatterbox/example_workflows/ChatterboxTTS-workflow.json
T
WildAi ceea0c71cf 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
2026-10-22 15:01:53 +03:00

1011 lines
19 KiB
JSON

{
"id": "dba002a2-22d7-4050-a716-4d7196a0d14b",
"revision": 0,
"last_node_id": 47,
"last_link_id": 84,
"nodes": [
{
"id": 30,
"type": "ChatterboxVC",
"pos": [
250,
20
],
"size": [
390,
320
],
"flags": {},
"order": 5,
"mode": 4,
"inputs": [
{
"name": "source_audio",
"type": "AUDIO",
"link": 54
},
{
"name": "target_voice_audio",
"shape": 7,
"type": "AUDIO",
"link": 55
}
],
"outputs": [
{
"name": "converted_audio",
"type": "AUDIO",
"links": [
58
]
}
],
"properties": {
"Node name for S&R": "ChatterboxVC",
"cnr_id": "ComfyUI-ChatterboxTTS",
"ver": "8fc60925cbab607e0f08e0d418c4504e0fcd4842"
},
"widgets_values": [
"chatterbox",
10,
1,
0.7,
false,
"default",
"auto",
"sage",
1,
30,
"smart"
],
"widgets_values_named": {
"model_pack_name": "chatterbox",
"n_timesteps": 10,
"temperature": 1,
"flow_cfg_scale": 0.7,
"use_watermark": false,
"device": "default",
"dtype": "auto",
"attention_mode": "sage",
"refinement_passes": 1,
"max_chunk_duration": 30,
"chunk_method": "smart"
},
"color": "#232",
"bgcolor": "#353"
},
{
"id": 31,
"type": "LoadAudio",
"pos": [
710,
450
],
"size": [
370,
170
],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "AUDIO",
"type": "AUDIO",
"links": [
54,
70,
71,
76,
84
]
}
],
"title": "Source Voice",
"properties": {
"Node name for S&R": "LoadAudio",
"cnr_id": "comfy-core",
"ver": "0.3.52",
"ue_properties": {
"widget_ue_connectable": {
"audio": true,
"audioUI": true,
"upload": true
},
"version": "7.0.1"
}
},
"widgets_values": [
"female_daenerys.mp3",
null
],
"widgets_values_named": {
"audio": "female_daenerys.mp3",
"upload": null
},
"color": "#332922",
"bgcolor": "#593930"
},
{
"id": 32,
"type": "LoadAudio",
"pos": [
260,
450
],
"size": [
370,
170
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "AUDIO",
"type": "AUDIO",
"links": [
55,
77
]
}
],
"title": "Target Voice",
"properties": {
"Node name for S&R": "LoadAudio",
"cnr_id": "comfy-core",
"ver": "0.3.52",
"ue_properties": {
"widget_ue_connectable": {
"audio": true,
"audioUI": true,
"upload": true
},
"version": "7.0.1"
}
},
"widgets_values": [
"male_stewie.mp3",
null
],
"widgets_values_named": {
"audio": "male_stewie.mp3",
"upload": null
},
"color": "#332922",
"bgcolor": "#593930"
},
{
"id": 33,
"type": "SaveAudioAdvanced",
"pos": [
1650,
30
],
"size": [
270,
150
],
"flags": {},
"order": 11,
"mode": 0,
"inputs": [
{
"name": "audio",
"type": "AUDIO",
"link": 68
}
],
"outputs": [
{
"name": "audio",
"type": "AUDIO",
"links": []
}
],
"properties": {
"Node name for S&R": "SaveAudioAdvanced"
},
"widgets_values": [
"audio/chatterbox",
"flac"
],
"widgets_values_named": {
"filename_prefix": "audio/chatterbox",
"format": "flac"
}
},
{
"id": 34,
"type": "SaveAudioAdvanced",
"pos": [
680,
20
],
"size": [
270,
150
],
"flags": {},
"order": 12,
"mode": 4,
"inputs": [
{
"name": "audio",
"type": "AUDIO",
"link": 58
}
],
"outputs": [
{
"name": "audio",
"type": "AUDIO",
"links": []
}
],
"properties": {
"Node name for S&R": "SaveAudioAdvanced"
},
"widgets_values": [
"audio/chatterbox",
"flac"
],
"widgets_values_named": {
"filename_prefix": "audio/chatterbox",
"format": "flac"
}
},
{
"id": 36,
"type": "ChatterboxTTS",
"pos": [
1210,
20
],
"size": [
400,
550
],
"flags": {},
"order": 4,
"mode": 0,
"inputs": [
{
"name": "audio_prompt",
"shape": 7,
"type": "AUDIO",
"link": 84
}
],
"outputs": [
{
"name": "audio",
"type": "AUDIO",
"links": [
68
]
}
],
"properties": {
"Node name for S&R": "ChatterboxTTS",
"cnr_id": "ComfyUI-ChatterboxTTS",
"ver": "8fc60925cbab607e0f08e0d418c4504e0fcd4842"
},
"widgets_values": [
"chatterbox",
"I can't believe you did it again. I waited for two hours. Two hours! Not a single call, not a text. Do you have any idea how embarrassing that was, just sitting there alone?",
1000,
0.7,
0.5,
0.8,
0.5,
1.2,
0.05,
1,
42,
"fixed",
false,
"default",
"auto",
"sdpa",
1000,
true,
10,
1,
true,
400,
"auto",
100
],
"widgets_values_named": {
"model_pack_name": "chatterbox",
"text": "I can't believe you did it again. I waited for two hours. Two hours! Not a single call, not a text. Do you have any idea how embarrassing that was, just sitting there alone?",
"max_new_tokens": 1000,
"flow_cfg_scale": 0.7,
"exaggeration": 0.5,
"temperature": 0.8,
"cfg_weight": 0.5,
"repetition_penalty": 1.2,
"min_p": 0.05,
"top_p": 1,
"seed": 42,
"control_after_generate": "fixed",
"use_watermark": false,
"device": "default",
"dtype": "auto",
"attention_mode": "sdpa",
"top_k": 1000,
"normalize_loudness": true,
"num_steps": 10,
"cfg_scale": 1,
"enable_chunking": true,
"max_chars_per_chunk": 400,
"chunk_combination_method": "auto",
"silence_between_chunks_ms": 100
},
"color": "#232",
"bgcolor": "#353"
},
{
"id": 37,
"type": "ChatterboxMTLTTS",
"pos": [
1190,
810
],
"size": [
400,
480
],
"flags": {},
"order": 2,
"mode": 4,
"inputs": [
{
"name": "audio_prompt",
"shape": 7,
"type": "AUDIO",
"link": 70
}
],
"outputs": [
{
"name": "audio",
"type": "AUDIO",
"links": [
81
]
}
],
"properties": {
"Node name for S&R": "ChatterboxMTLTTS"
},
"widgets_values": [
"chatterbox-multilingual-zh-cmn",
"t3_23lang.safetensors",
"zh",
"以文化滋养精神家园——习近平文化思想引领文化强国建设迈出新步伐",
0.5,
0.8,
0.5,
1.2,
0.05,
1,
660161351559885,
"fixed",
false,
"default",
"auto",
"sage",
"hmm ,, {seg} hmm ,,"
],
"widgets_values_named": {
"model_pack_name": "chatterbox-multilingual-zh-cmn",
"model_version": "t3_23lang.safetensors",
"language": "zh",
"text": "以文化滋养精神家园——习近平文化思想引领文化强国建设迈出新步伐",
"exaggeration": 0.5,
"temperature": 0.8,
"cfg_weight": 0.5,
"repetition_penalty": 1.2,
"min_p": 0.05,
"top_p": 1,
"seed": 660161351559885,
"control_after_generate": "fixed",
"use_watermark": false,
"device": "default",
"dtype": "auto",
"attention_mode": "sage",
"crash_protection_template": "hmm ,, {seg} hmm ,,"
},
"color": "#232",
"bgcolor": "#353"
},
{
"id": 38,
"type": "ChatterboxDialog",
"pos": [
240,
810
],
"size": [
400,
500
],
"flags": {},
"order": 6,
"mode": 4,
"inputs": [
{
"name": "speaker_A_Audio",
"type": "AUDIO",
"link": 76
},
{
"name": "speaker_B_Audio",
"type": "AUDIO",
"link": 77
},
{
"name": "speaker_C_Audio",
"shape": 7,
"type": "AUDIO",
"link": null
},
{
"name": "speaker_D_Audio",
"shape": 7,
"type": "AUDIO",
"link": null
}
],
"outputs": [
{
"name": "dialog_audio",
"type": "AUDIO",
"links": [
78
]
},
{
"name": "speaker_a_audio",
"type": "AUDIO",
"links": null
},
{
"name": "speaker_b_audio",
"type": "AUDIO",
"links": null
},
{
"name": "speaker_c_audio",
"type": "AUDIO",
"links": null
},
{
"name": "speaker_d_audio",
"type": "AUDIO",
"links": null
},
{
"name": "message",
"type": "STRING",
"links": null
}
],
"properties": {
"Node name for S&R": "ChatterboxDialog"
},
"widgets_values": [
"chatterbox",
"t3_mtl23ls_v3.safetensors",
"en",
"SPEAKER A: The first line of the subtitle file.\nSPEAKER B: The second line, three and a half seconds long.\nSPEAKER A: And a third to finish with.",
0.5,
0.5,
0.8,
401053518396655,
"randomize",
false,
"default",
"auto",
"sdpa",
"hmm ,, {seg} hmm ,,"
],
"widgets_values_named": {
"model_pack_name": "chatterbox",
"model_version": "t3_mtl23ls_v3.safetensors",
"language": "en",
"dialog_text": "SPEAKER A: The first line of the subtitle file.\nSPEAKER B: The second line, three and a half seconds long.\nSPEAKER A: And a third to finish with.",
"exaggeration": 0.5,
"cfg_weight": 0.5,
"temperature": 0.8,
"seed": 401053518396655,
"control_after_generate": "randomize",
"use_watermark": false,
"device": "default",
"dtype": "auto",
"attention_mode": "sdpa",
"crash_protection_template": "hmm ,, {seg} hmm ,,"
},
"color": "#232",
"bgcolor": "#353"
},
{
"id": 39,
"type": "SaveAudioAdvanced",
"pos": [
720,
1500
],
"size": [
270,
150
],
"flags": {},
"order": 8,
"mode": 4,
"inputs": [
{
"name": "audio",
"type": "AUDIO",
"link": 72
}
],
"outputs": [
{
"name": "audio",
"type": "AUDIO",
"links": []
}
],
"properties": {
"Node name for S&R": "SaveAudioAdvanced"
},
"widgets_values": [
"audio/chatterbox",
"flac"
],
"widgets_values_named": {
"filename_prefix": "audio/chatterbox",
"format": "flac"
}
},
{
"id": 40,
"type": "ChatterboxSRT",
"pos": [
260,
1500
],
"size": [
400,
690
],
"flags": {},
"order": 3,
"mode": 4,
"inputs": [
{
"name": "audio_prompt",
"shape": 7,
"type": "AUDIO",
"link": 71
}
],
"outputs": [
{
"name": "audio",
"type": "AUDIO",
"links": [
72
]
},
{
"name": "generation_info",
"type": "STRING",
"links": [
79
]
},
{
"name": "timing_report",
"type": "STRING",
"links": [
80
]
},
{
"name": "Adjusted_SRT",
"type": "STRING",
"links": []
}
],
"properties": {
"Node name for S&R": "ChatterboxSRT"
},
"widgets_values": [
"chatterbox",
"1\n00:00:00,000 --> 00:00:03,000\nThe first line of the subtitle file.\n\n2\n00:00:03,000 --> 00:00:09,500\nThe second line, three and a half seconds long.\n\n3\n00:00:09,500 --> 00:00:15,000\nAnd a third to finish with.\n",
"smart_natural",
1000,
0.7,
0.5,
0.8,
42,
"fixed",
false,
2,
1,
0.5,
0.01,
"default",
"auto",
"sdpa",
"hmm ,, {seg} hmm ,,"
],
"widgets_values_named": {
"model_pack_name": "chatterbox",
"srt_content": "1\n00:00:00,000 --> 00:00:03,000\nThe first line of the subtitle file.\n\n2\n00:00:03,000 --> 00:00:09,500\nThe second line, three and a half seconds long.\n\n3\n00:00:09,500 --> 00:00:15,000\nAnd a third to finish with.\n",
"timing_mode": "smart_natural",
"max_new_tokens": 1000,
"flow_cfg_scale": 0.7,
"exaggeration": 0.5,
"temperature": 0.8,
"seed": 42,
"control_after_generate": "fixed",
"use_watermark": false,
"timing_tolerance": 2,
"max_stretch_ratio": 1,
"min_stretch_ratio": 0.5,
"fade_for_StretchToFit": 0.01,
"device": "default",
"dtype": "auto",
"attention_mode": "sdpa",
"crash_protection_template": "hmm ,, {seg} hmm ,,"
}
},
{
"id": 44,
"type": "SaveAudioAdvanced",
"pos": [
700,
810
],
"size": [
270,
150
],
"flags": {},
"order": 13,
"mode": 4,
"inputs": [
{
"name": "audio",
"type": "AUDIO",
"link": 78
}
],
"outputs": [
{
"name": "audio",
"type": "AUDIO",
"links": []
}
],
"properties": {
"Node name for S&R": "SaveAudioAdvanced"
},
"widgets_values": [
"audio/chatterbox",
"flac"
],
"widgets_values_named": {
"filename_prefix": "audio/chatterbox",
"format": "flac"
}
},
{
"id": 45,
"type": "PreviewAny",
"pos": [
720,
1730
],
"size": [
260,
160
],
"flags": {},
"order": 9,
"mode": 4,
"inputs": [
{
"name": "source",
"type": "*",
"link": 79
}
],
"outputs": [
{
"name": "STRING",
"type": "STRING",
"links": null
}
],
"properties": {
"Node name for S&R": "PreviewAny"
},
"widgets_values": [],
"widgets_values_named": {}
},
{
"id": 46,
"type": "PreviewAny",
"pos": [
720,
1950
],
"size": [
260,
160
],
"flags": {},
"order": 10,
"mode": 4,
"inputs": [
{
"name": "source",
"type": "*",
"link": 80
}
],
"outputs": [
{
"name": "STRING",
"type": "STRING",
"links": []
}
],
"properties": {
"Node name for S&R": "PreviewAny"
},
"widgets_values": [],
"widgets_values_named": {}
},
{
"id": 47,
"type": "SaveAudioAdvanced",
"pos": [
1670,
820
],
"size": [
270,
150
],
"flags": {},
"order": 7,
"mode": 4,
"inputs": [
{
"name": "audio",
"type": "AUDIO",
"link": 81
}
],
"outputs": [
{
"name": "audio",
"type": "AUDIO",
"links": []
}
],
"properties": {
"Node name for S&R": "SaveAudioAdvanced"
},
"widgets_values": [
"audio/chatterbox",
"flac"
],
"widgets_values_named": {
"filename_prefix": "audio/chatterbox",
"format": "flac"
}
}
],
"links": [
[
54,
31,
0,
30,
0,
"AUDIO"
],
[
55,
32,
0,
30,
1,
"AUDIO"
],
[
70,
31,
0,
37,
0,
"AUDIO"
],
[
71,
31,
0,
40,
0,
"AUDIO"
],
[
76,
31,
0,
38,
0,
"AUDIO"
],
[
77,
32,
0,
38,
1,
"AUDIO"
],
[
79,
40,
1,
45,
0,
"STRING"
],
[
80,
40,
2,
46,
0,
"STRING"
],
[
84,
31,
0,
36,
0,
"AUDIO"
],
[
68,
36,
0,
33,
0,
"AUDIO"
],
[
58,
30,
0,
34,
0,
"AUDIO"
],
[
72,
40,
0,
39,
0,
"AUDIO"
],
[
78,
38,
0,
44,
0,
"AUDIO"
],
[
81,
37,
0,
47,
0,
"AUDIO"
]
],
"groups": [
{
"id": 1,
"title": "Voice conversion",
"bounding": [
220,
-70,
910,
450
],
"color": "#3f789e",
"flags": {}
},
{
"id": 2,
"title": "Text 2 Voice",
"bounding": [
1180,
-70,
770,
760
],
"color": "#3f789e",
"flags": {}
},
{
"id": 3,
"title": "Group",
"bounding": [
1180,
740,
770,
660
],
"color": "#3f789e",
"flags": {}
},
{
"id": 4,
"title": "Group",
"bounding": [
230,
740,
900,
660
],
"color": "#3f789e",
"flags": {}
},
{
"id": 5,
"title": "Group",
"bounding": [
250,
1430,
750,
770
],
"color": "#3f789e",
"flags": {}
}
],
"config": {},
"extra": {
"ds": {
"scale": 0.7848447621175021,
"offset": [
-8.042732499295383,
137.5873485252725
]
},
"frontendVersion": "1.55.14",
"VHS_latentpreview": false,
"VHS_latentpreviewrate": 0,
"VHS_MetadataImage": true,
"VHS_KeepIntermediate": true
},
"version": 0.4
}