Nodes/ComfyUI-Chatterbox/Chatterbox TTS πŸ“’
ComfyUI Node

Chatterbox TTS πŸ“’

23 languages of local voice cloning in ComfyUI

By wildminderΒ·Created about a year agoΒ·Updated about 20 hours agoΒ· 105
Chatterbox TTS πŸ“’
  • audio_prompt
  • audio
β—„model_pack_namechatterboxβ–Ί
β—„textHello, this is a test of Chatterbox TTS in ComfyUI.β–Ί
β—„max_new_tokens1000β–Ί
β—„flow_cfg_scale0.70β–Ί
β—„exaggeration0.50β–Ί
β—„temperature0.80β–Ί
β—„cfg_weight0.50β–Ί
β—„repetition_penalty1.2β–Ί
β—„min_p0.05β–Ί
β—„top_p1.00β–Ί
β—„seed0β–Ί
β—„use_watermarkfalseβ–Ί
β—„devicedefaultβ–Ί
β—„dtypeautoβ–Ί
β—„attention_modesdpaβ–Ί
β—„top_k1000β–Ί
β—„normalize_loudnesstrueβ–Ί
β—„num_steps10β–Ί
β—„cfg_scale1.00β–Ί
β—„enable_chunkingtrueβ–Ί
β—„max_chars_per_chunk400β–Ί
β—„chunk_combination_methodautoβ–Ί
β—„silence_between_chunks_ms100β–Ί

If you're here, you probably typed "text to speech" into ComfyUI and got a wall of nodes that either need an API key or only speak English. This one needs neither. It's Resemble AI's Chatterbox dropped into ComfyUI, and the selling point is right in the name: it runs the multilingual model, so it speaks 23 languages instead of just English. Of the several Chatterbox ports floating around the ecosystem, this is the one that bundles that multilingual build - the author's claim, and the thing that separates it from the English-only cousins.

The name is honest: it calls no API, needs no key, and everything runs locally on your own GPU (or MPS, or plain CPU if you're patient). You feed it text and an optional reference clip, it returns real speech.

Why you'd actually reach for it

The obvious use is narration - read out a script over a generated image or video. But the workflow where this really shines is voice cloning inside a video pipeline. The KB's LTX-2 notes keep coming back to one complaint: generated voices sound like they came out of a tin can. The community workaround is exactly this - clone a decent voice with Chatterbox TTS and layer it over the video instead of trusting the video model's audio. Same trick applies to Wan or any model with weak native audio.

It's also the easiest route to multilingual cloning: one clean reference recording, then synthesize that voice in Japanese, Korean, Arabic, Hebrew, whatever's on the list.

How it works

The pack vendors Resemble's own chatterbox code in src/, so the node is a thin wrapper around upstream's logic. On first run it pulls the multilingual model pack from ResembleAI/chatterbox on HuggingFace into ComfyUI/models/tts/chatterbox/resembleai_multilingual/ and caches the loaded model in memory - first generation is slow, everything after is fast.

The interesting part is the per-language preprocessing. Japanese text is converted from kanji to hiragana (via pykakasi), Chinese characters are converted to Cangjie codes for tokenization, and Korean syllables are decomposed into Jamo - the model can't read those scripts natively, so the node transliterates before tokenizing. That's why the multilingual model works where the standard one doesn't.

The inputs that matter

The dropdown and the sliders are all standard TTS fare, but three deserve attention:

  • text - up to 300 characters. It truncates silently past that, so keep your script under the limit.
  • language - pick from the 23-language list. It's the whole point of this node.
  • reference_audio (optional) - plug in any ComfyUI AUDIO (a loaded clip, another node's output) for voice cloning. Leave it empty and you get Resemble's default voice.
  • cfg_weight - the one to remember. The tooltip says it all: set it to 0 for language transfer, i.e. when your reference audio is in a different language than your target text, so the accent doesn't bleed through.
  • exaggeration - expressiveness, default 0.5 is neutral. Crank it for emotion, but the tooltip warns extreme values get unstable.
  • temperature and seed - the usual. Seed 0 means random; set a real seed to reproduce a take.

The single output is AUDIO named "audio" - wire it into a PreviewAudio node to listen, or a save/FFmpeg node to write the file. The returned dict carries waveform and sample rate, so it plugs into anything that accepts ComfyUI's AUDIO type.

Installing it

Easiest route: ComfyUI Manager, search for "ComfyUI-For-ChatterBox", install, restart. Manual:

cd ComfyUI/custom_nodes
git clone https://github.com/pentarab/ComfyUI-For-ChatterBox
cd ComfyUI-For-ChatterBox
pip install -r requirements.txt

Then restart ComfyUI and run the node once - the model auto-downloads on first use, no manual download step.

The trap: requirements.txt pins torch==2.6.0 and torchaudio==2.6.0, plus transformers==4.46.3. If you let that pip install over your existing ComfyUI environment, you can break other nodes that want a different torch. ComfyUI Manager handles this more gently, but if you're installing manually, install into the same Python environment ComfyUI uses and be ready to reconcile versions. Don't pip install -r into a fresh global environment and expect your ComfyUI to find it.

Troubleshooting

  • First run is slow and looks stuck - the model pack is downloading. Watch the console for [Chatterbox] Downloading... lines. Check HuggingFace is reachable if it fails.
  • Out of memory / slow - the model loads fully into VRAM and stays there. On a low-VRAM card it'll run on CPU; expect it to be slow but functional.
  • Accent bleed with a reference clip - that's the cfg_weight = 0 case above. And match reference language to target language when you can; it always sounds better.
CategoryWMNodes/sound/tts

Inputs (24)

NameTypeDefaultDescription
model_pack_nameCOMBOchatterboxSelect the Chatterbox voice model pack to use for generation.
textSTRINGHello, this is a test of Chatterbox TTS in ComfyUI.Text to be synthesized into speech.
max_new_tokensINT100016–4000Maximum number of audio tokens to generate. 25 tokens β‰ˆ 1 second. The hard limit is 4096 tokens (β‰ˆ 163 seconds).
flow_cfg_scaleFLOAT0.700–2CFG scale for the mel spectrogram decoder (flow matching). Higher values increase adherence to content and timbre but may reduce naturalness.
exaggerationFLOAT0.500.25–2Controls the expressiveness and emotional intensity. Higher values lead to more exaggerated prosody.
temperatureFLOAT0.800.05–5Controls the randomness of the sampling process. Higher values produce more diverse speech, while lower values are more deterministic.
cfg_weightFLOAT0.500.2–1Classifier-Free Guidance (CFG) weight. Controls how strongly the model adheres to the text prompt. Higher values may reduce naturalness. Ignored by Turbo-family packs: their sampler has no CFG.
repetition_penaltyFLOAT1.21–2Penalizes repeated tokens to discourage monotonous or repetitive speech. A value of 1.0 means no penalty.
min_pFLOAT0.050–1Sets a minimum probability threshold for nucleus sampling (Min-P). Filters out tokens with very low probability. Ignored by Turbo-family packs: their sampler has no min-p.
top_pFLOAT1.000–1Nucleus sampling (Top-P) parameter. The model samples from the smallest set of tokens whose cumulative probability exceeds this value.
seedINT00–18446744073709550000Seed for random number generation. A value of 0 will use a random seed.
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'.
top_kINT10001–5000Limit sampling to the K most likely tokens. 1 is fully greedy, 5000 is effectively unrestricted. Turbo-family packs only (Turbo and Nano): classic, multilingual and Flash packs have no top-k and ignore this.
normalize_loudnessBOOLEANtrueNormalise the reference clip to a consistent loudness before cloning it. Skipped with a warning when the optional 'pyloudnorm' library is not installed. Turbo-family packs only; ignored by classic and multilingual packs.
num_stepsINT101–128How many block-diffusion denoising steps to run. Fewer steps are faster but rougher; the upstream default of 10 matches the paper's best configuration. Flash packs only; every other family ignores this.
cfg_scaleFLOAT1.000–3Block-diffusion classifier-free guidance scale. 1.0 (the upstream default) means no guidance; values above 1 trade naturalness for prompt adherence. Flash packs only; every other family ignores this.
enable_chunkingBOOLEANtrueSplit a long script into chunks and synthesise them one at a time, then join them. This is what lets a script of any length be spoken in full: the token budget applies per chunk, not to the whole script. Turn it off to send the script to the model in one piece.
max_chars_per_chunkINT400100–1000How many characters go into one chunk. The cut prefers a sentence end, then a line break, then a space, and never lands inside a tag. Smaller chunks follow a long script more closely but cost more model calls.
chunk_combination_methodCOMBOautoHow the chunks are joined. 'auto' resolves by the length of the script: up to 500 characters joins cleanly, above 500 crossfades, above 1000 pads with silence.
silence_between_chunks_msINT1000–500The gap between two chunks when the join method is 'silence_padding'. Ignored by the other methods.
audio_promptoptAUDIOReference audio to clone the voice from. When left unconnected the pack's built-in voice is used. Flash packs ship no built-in voice: a reference clip is required for them.

Outputs (1)

NameTypeDescription
audioAUDIOβ€”