Nodes/ComfyUI-Chatterbox/Chatterbox Multi-Speaker Dialog 🎭
ComfyUI Node

Chatterbox Multi-Speaker Dialog 🎭

One script, four voices, real stems

By wildminderΒ·Created about a year agoΒ·Updated a day agoΒ· 105
Chatterbox Multi-Speaker Dialog 🎭
  • 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
β—„model_pack_nameresembleai_default_voiceβ–Ί
β—„model_versiont3_mtl23ls_v3.safetensorsβ–Ί
β—„languageenβ–Ί
β—„dialog_textSPEAKER A: Test test SPEAKER B: 1 2 3β–Ί
β—„exaggeration0.50β–Ί
β—„cfg_weight0.50β–Ί
β—„temperature0.80β–Ί
β—„seed0β–Ί
β—„use_watermarkfalseβ–Ί
β—„devicedefaultβ–Ί
β—„dtypeautoβ–Ί
β—„attention_modesdpaβ–Ί
β—„crash_protection_templatehmm ,, {seg} hmm ,,β–Ί

You have a scene. Two characters, a back-and-forth, maybe a third cutting in. The honest way to do that in most TTS setups is to generate each line as a separate job in a separate voice, then glue the takes together on a timeline and hope the pauses land right. Chatterbox Dialog is the node that stops you doing that. You paste the conversation once, hand it one reference clip per speaker, and it queues the whole thing as a single node.

Where this sits in a workflow

Audio is the newest bolt-on layer in ComfyUI - the models are good, the integration is a maintained compromise. Inside that layer, Chatterbox (Resemble AI, MIT, 0.5B on a Llama backbone, zero-shot cloning from a few seconds of reference audio) is the quality-and-cloning corner. It's the model that pulled private local voice work off the API, and its known weak spot is audio artifacts on some generations: groans, stretched words, the occasional weird noise.

Dialog is where you feel that weakness most, because conversational lines are short. "Right." "What?" Those are one- or two-word turns, and short text is exactly what upstream Chatterbox trips over in sequential generation. That's what the crash_protection_template widget is for, and it's the least obvious and most important field on the node.

How it works

The dialog_text field is parsed line by line. A line starting SPEAKER A: opens a turn; A through D are recognised, case and separator don't matter (Speaker_A: works). A line that doesn't start with a speaker prefix continues the turn above it, so a wrapped line stays one turn - paste your script without worrying about line wrapping.

Each turn is synthesised separately against that speaker's reference clip, then the turns are laid end to end on one timeline per speaker. Two consequences you should know about:

  • The mixed output is the sum of the stems, not a separate assembly. dialog_audio is literally the stems added together, so what you hear and what you mix can't disagree about who spoke when.
  • Unconnected speakers still get a stem. Leave C and D empty and speaker_c_audio / speaker_d_audio are real silence of the dialog's length, not an empty value. That's deliberate - downstream nodes chain AUDIO sockets without checking, and a stem that turns into nothing would break them.

seed plus each turn's index seeds every turn, so re-rolling one turn doesn't re-roll the rest of the conversation. Nice detail if you're chasing one bad line.

The inputs that matter

Required: model_pack_name (which Chatterbox pack on disk), model_version (defaults to t3_mtl23ls_v3.safetensors - one model serves all four speakers; the voices come from the reference clips), language, dialog_text, speaker_A_Audio, speaker_B_Audio. A and B are mandatory even if your scene only has one speaker talking - this is a dialog node.

speaker_C_Audio and speaker_D_Audio are the optional inputs.

Then the knobs: exaggeration (0.25–2.0, applied to every speaker equally - there's no per-speaker emotion), cfg_weight, temperature, seed, use_watermark, and the runtime trio device / dtype / attention_mode. crash_protection_template defaults to hmm ,, {seg} hmm ,,, and {seg} is swapped for the turn's text on any turn under 21 characters. If a couple of short exchanges come out with a weird "hmm" in front of them, that's the padding: set the field to empty and the short turns become the model's problem again.

Outputs are dialog_audio, speaker_a_audio through speaker_d_audio, and a message string - stats on how long each stem actually spoke, which beats squinting at a waveform to work out who's in the mix.

Feed dialog_audio into a save-audio node, a video mux, or an audio-driven avatar like InfiniteTalk or a MultiTalk LoRA on Wan. The stems are the underrated part: they're what you hand to a video editor or an audio-driven avatar when you want per-character control you can't get from a single mixed track.

Install

ComfyUI Manager β†’ Install Custom Nodes β†’ search ComfyUI-Chatterbox β†’ Install β†’ restart. Manually:

cd ComfyUI/custom_nodes
git clone https://github.com/wildminder/ComfyUI-Chatterbox.git
pip install -r ComfyUI-Chatterbox/requirements.txt

Requirements are lighter than the average audio pack: the only added package is s3tokenizer, because this pack vendored Chatterbox's audio DSP as pure numpy/torch and dropped librosa, scipy, omegaconf and conformer - and it hands reference clips to the model in memory instead of writing temp .wav files. You need ComfyUI >=0.37.0 (it's written against the newer V3 node API, so there's no NODE_CLASS_MAPPINGS in it - that's "new", not "broken") and Python >=3.10.

Models download on first run into ComfyUI/models/tts/chatterbox/, about 2.5 GB per pack. Weights load under ComfyUI's VRAM manager, and shared files (ve.safetensors, s3gen*) are stored once and reused across packs.

Where people get burned

Reference clips. Five or six seconds of clean, single-emotion speech per speaker. If your clip mixes a serious tone and a laughing tone, the clone will inherit both and switch between them mid-line.

Short turns. If a turn is under 21 characters and you zeroed the padding template, expect the artifact problem. Leave the default on.

Python 3.10 installs. s3tokenizer is the one dependency, and it's the one that has bitten people - the author of the rival TTS Audio Suite reports it failing to install on Stability Matrix's Python 3.10 while a 3.12 venv was fine. If pip fails at install time on an old interpreter, that's why.

Upgrading from 1.x. Version 2.0.0 moved packs from models/chatterbox_tts/ to models/tts/chatterbox/ with no shim. Delete the old folder by hand (or move the packs across) or you'll be wondering why nothing is found.

CategoryWMNodes/sound/tts

Inputs (17)

NameTypeDefaultDescription
model_pack_nameCOMBOresembleai_default_voiceSelect the Chatterbox checkpoint directory to load the multilingual T3 weights from.
model_versionCOMBOt3_mtl23ls_v3.safetensorsWhich multilingual T3 checkpoint to load. The options are the resolved filenames, not labels; the default is v3. One model serves all four speakers here -- the voices come from the reference clips, not from separate checkpoints.
languageCOMBOenLanguage of the whole conversation, as an ISO 639-1 code. Each speaker uses the same one: Chatterbox has no per-speaker language setting, and mixing them inside one model call is not something this node can do.
dialog_textSTRINGSPEAKER A: Test test SPEAKER B: 1 2 3The conversation, one turn per line: SPEAKER A: Good evening. SPEAKER B: Good evening to you. Speakers A to D are recognised. A line that does not start with a speaker prefix continues the turn above it, so a wrapped line is still one turn. Character tags ([Alice]), language tags ([de:Alice]), pause tags ([pause:1.5]) and the v2 angle-bracket tokens work inside a turn.
speaker_A_AudioAUDIOSpeaker A's voice. 5-6 seconds of clean speech. Required.
speaker_B_AudioAUDIOSpeaker B's voice. Required.
exaggerationFLOAT0.500.25–2Controls the expressiveness and emotional intensity, applied to every speaker equally.
cfg_weightFLOAT0.500.2–1Classifier-Free Guidance (CFG) weight. Higher values may reduce naturalness.
temperatureFLOAT0.800.05–5Controls the randomness of the sampling process.
seedINT00–18446744073709550000Seed for random number generation. A value of 0 will use a random seed. Every turn is seeded from this one plus its own index, so one turn re-rolling does not change the others.
use_watermarkBOOLEANfalseEnable or disable the audio watermark. Requires 'resemble-perth' to be installed.
deviceCOMBOdefaultDevice to run inference on. 'auto' follows ComfyUI's default compute device.
dtypeCOMBOautoData type for model precision. 'auto' lets ComfyUI pick the best type for the target device.
attention_modeCOMBOsdpaAttention implementation. Backends this machine cannot run are left out of the dropdown; a saved graph that names one anyway falls back to 'sdpa'.
crash_protection_templateSTRINGhmm ,, {seg} hmm ,,Padding applied to any turn shorter than 21 characters. Conversational lines are short by nature and upstream Chatterbox fails on short text in sequential generation. {seg} is replaced by the turn's text. Set to '' to disable.
speaker_C_AudiooptAUDIOSpeaker C's voice. Leave unconnected if the conversation has no third speaker; speaker_c_audio is then silence of the dialog's length.
speaker_D_AudiooptAUDIOSpeaker D's voice. Leave unconnected if the conversation has no fourth speaker; speaker_d_audio is then silence of the dialog's length.

Outputs (6)

NameTypeDescription
dialog_audioAUDIOβ€”
speaker_a_audioAUDIOβ€”
speaker_b_audioAUDIOβ€”
speaker_c_audioAUDIOβ€”
speaker_d_audioAUDIOβ€”
messageSTRINGβ€”