FL Chatterbox Dialog TTS
Turn a script into a 4-voice conversation
- speaker_A_Audio
- speaker_B_Audio
- speaker_C_Audio
- speaker_D_Audio
- dialog_audio
- speaker_a_audio
- speaker_b_audio
- speaker_c_audio
- speaker_d_audio
- message
If you've ever pieced together a two-character conversation in ComfyUI by generating each line separately and splicing them on a timeline, this node is the fix you didn't know you wanted. FL Chatterbox Dialog TTS takes a script - lines prefixed with SPEAKER A:, SPEAKER B:, and so on - and generates the whole conversation in one pass, with up to four distinct cloned voices. It's the pack's most fun node and, once you've wrestled with assembling dialog by hand, the most useful.
The clever bit isn't just that it's one node; it's the outputs. You get a single mixed dialog_audio track and an isolated track per speaker, with silence padding on the tracks where a given speaker isn't talking. That's gold if you want to mix, duck, or add per-speaker effects afterward - no manual alignment in an audio editor, the tracks line up by construction.
How it works. Under the hood it's the standard Chatterbox TTS model (the same one the flagship node uses), invoked line by line. Each line is matched to its speaker's reference audio, generated with that speaker's cloned voice, and the node concatenates the results while zero-padding the other speakers' tracks so everything stays time-aligned. It's the standard model's quality, applied to a conversation. Model weights come from ResembleAI/chatterbox and land in ComfyUI/models/chatterbox/ on first run - nothing special to download beyond what the pack already fetches.
The inputs that matter. Three things to get right:
dialog_text- the script. Each line must start with a label likeSPEAKER A:; anything that doesn't match a label is skipped. Default looks like:
If a line is labeled for a speaker whose audio isn't connected (e.g.SPEAKER A: Test test SPEAKER B: 1 2 3SPEAKER C:with nospeaker_C_Audio), it's silently skipped - so make sure labels match what you've wired up.speaker_A_Audioandspeaker_B_Audio(requiredAUDIO) - the reference voices for speakers A and B.speaker_C_Audioandspeaker_D_Audio(optionalAUDIO) - bring the cast up to four.
The generation dials mirror the standard node: exaggeration (0.25–2.0), cfg_weight (0.2–1.0), temperature (0.05–5.0), seed, plus use_cpu and keep_model_loaded.
Outputs. Six of them: dialog_audio (the full mixed conversation), speaker_a_audio / speaker_b_audio / speaker_c_audio / speaker_d_audio (per-speaker isolated tracks), and message (status string - if the script has no valid lines, it tells you "No valid dialog lines found."). All audio is 24 kHz like the rest of the pack.
Install. ComfyUI Manager, search "FL ChatterBox" - or:
cd ComfyUI/custom_nodes
git clone https://github.com/filliptm/ComfyUI_Fill-ChatterBox
cd ComfyUI_Fill-ChatterBox
pip install -r requirements.txt
Shared pack dependencies; the optional resemble-perth watermarking is best skipped on Python 3.12+.
Gotchas. Same 40-second-per-generation cap applies per line, so a two-minute script with long lines can trip it - keep lines short, or split the conversation into two nodes. Reference clips should be 5–6+ seconds for good clones. And while keep_model_loaded = True speeds up iteration, remember the dialog node uses the standard TTS model, so you're loading the same heavy weights as the flagship node - one cached model serves both.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| dialog_text | STRING | SPEAKER A: Test test SPEAKER B: 1 2 3 | — |
| speaker_A_Audio | AUDIO | — | |
| speaker_B_Audio | AUDIO | — | |
| exaggeration | FLOAT | 0.500.25–2 | — |
| cfg_weight | FLOAT | 0.500.2–1 | — |
| temperature | FLOAT | 0.800.05–5 | — |
| seed | INT | 00–4294967295 | — |
| speaker_C_Audioopt | AUDIO | — | |
| speaker_D_Audioopt | AUDIO | — | |
| use_cpuopt | BOOLEAN | false | — |
| keep_model_loadedopt | BOOLEAN | false | — |
Outputs (6)
| Name | Type | Description |
|---|---|---|
| dialog_audio | AUDIO | — |
| speaker_a_audio | AUDIO | — |
| speaker_b_audio | AUDIO | — |
| speaker_c_audio | AUDIO | — |
| speaker_d_audio | AUDIO | — |
| message | STRING | — |