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
2026-10-06 18:36:08 +03:00
2025-05-29 21:40:55 +03:00
2026-10-06 18:36:08 +03:00

◇ ComfyUI-Chatterbox ◆ Revised ◆

Chatterbox, refactored. Text-to-Speech and Voice Conversion for ComfyUI on a leaner core. Supports: classic, Turbo, Nano, Flash, Multilingual.

Less to import. No temp files. Same voices, faster to a result.

Telegram X

Note

ComfyUI-Chatterbox runs a refactored Chatterbox core. The vendored model code reimplements its audio DSP in pure numpy/torch, bit-for-bit with the original (verified against librosa 1.0.0 on the trained featurization parameters), and drops librosa, scipy, omegaconf and conformer. Reference clips are handed to the model in memory, never through a temp .wav. The only package this node adds is s3tokenizer. Models download on first run into ComfyUI/models/tts/chatterbox/.

Table of Contents

◆◇◆◇◆◇◆◇◆◇◆

❖ Features

Capability Detail
One TTS node, every pack classic, Turbo 350M, Nano 110M and Flash are routed automatically from the pack's contents
Multilingual TTS 23 languages, v1 / v2 / v3 weights, plus six Single Language Pack finetunes (zh-cmn, es-mx, es-es, pt-br, pt-pt, hi)
Voice cloning any .wav / .mp3 as the voice prompt, passed to the model in memory
Voice conversion re-voice a source recording into a target timbre
Multi-speaker dialog up to four cloned voices in one output, with SRT subtitle alignment
Lean core DSP in pure numpy/torch, bit-exact with the original; s3tokenizer is the only dependency
Devices CUDA, ROCm, XPU, MPS and CPU, under ComfyUI's VRAM manager

◆◇◆◇◆◇◆◇◆◇◆

⌸ Models

Downloaded on first run into ComfyUI/models/tts/chatterbox/ (~2.5 GB each). Shared weights (ve.safetensors, s3gen*) are stored once and reused across packs.

Family Members Notes
Classic chatterbox English TTS, built-in reference voice in conds.pt
Turbo chatterbox-turbo, chatterbox-turbo-nano Paralinguistic tags, top-k sampler; 350M / 110M
Flash chatterbox-flash Block-diffusion sampler; a reference clip is required
Multilingual chatterbox-mtl 23 languages, v1 / v2 / v3
Single Language Packs zh-cmn, es-mx-latam, es-es, pt-br, pt-pt, hi MTL node only

Tip

Picks appear in the node's model dropdown; nothing to configure by hand. Ready-made graphs for every family live in example_workflows/.

◆◇◆◇◆◇◆◇◆◇◆

⇩ Getting started

ComfyUI Manager — Manager → Install Custom Nodes → search ComfyUI-Chatterbox → Install → restart.

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

Restart ComfyUI. Nodes appear under WMNodes/sound/*.

Requirement Version
Python >=3.10 (tested through 3.13)
ComfyUI >=0.37.0 (V3 node API)
Added dependency s3tokenizer only, a pure-Python wheel

Optional extras, installed as pip install ComfyUI-Chatterbox[extra]: watermarking (resemble-perth), multilingual (pykakasi, spacy-pkuseg) and turbo (pyloudnorm). Nothing else is required; the rest of the stack comes from ComfyUI itself.

◆◇◆◇◆◇◆◇◆◇◆

❯ Usage

  1. Add a node from WMNodes/sound/*.
  2. Pick the model; connect an AUDIO input to clone a voice.
  3. Queue the prompt.
Node Menu name Does
ChatterboxTTS Chatterbox TTS 📢 Speech from text, optional voice cloning. One node for every TTS pack.
ChatterboxMTLTTS Chatterbox Multilingual TTS 🌍 Speech in 23 languages, plus the Single Language Packs.
ChatterboxVC Chatterbox Voice Conversion 🗣️ Re-voices a source recording into a target voice.
ChatterboxDialog Chatterbox Multi-Speaker Dialog 🎭 Multi-speaker conversation, up to four cloned voices.
ChatterboxSRT Chatterbox SRT / Subtitles 📝 Speaks a timed SRT script and returns adjusted subtitles.

Every widget is documented in its node tooltip. Load a graph from example_workflows/ to see the nodes wired up.

When a node fails at execution — a missing reference clip, a pack with no conversion model — the message shows up as a toast in the web UI, naming the node and the error. Add Chatterbox.ErrorToasts to the Comfy.Extension.Disabled list in ComfyUI's settings to turn the toasts off.

⟔ ▲ ⟓ back to top

◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆

⌗ Good to know

No version pins ComfyUI Manager resolves the stack; a pin could force a downgrade of the host's torch build.
Offline Packs are fetched by a first-run download and a local pack is never re-downloaded afterwards.
VRAM Weights load under ComfyUI's manager and offload between runs; ~2.5 GB per pack on disk as safetensors.
Layout Node code lives in nodes/, the vendored Chatterbox core in src/chatterbox/.
Emotion tags & chunking Turbo and Nano packs speak the paralinguistic tags natively: write [laugh], [chuckle], [sigh], [clear throat] and the rest into the text box and the model says them. Classic, multilingual and Flash packs have no such vocabulary, so the same words are read out as plain text and the run says so in the log. <giggle>-style v2 tokens are re-spelled for Turbo and left alone elsewhere. Long scripts are cut into chunks, spoken one chunk at a time and joined again -- auto picks the join by script length (clean under 500 characters, crossfaded above it, padded with silence above 1000), and the cut never lands inside a tag.
Upgrading from 1.x 2.0.0 moved packs from models/chatterbox_tts/ to models/tts/chatterbox/. No compatibility shim is provided, so delete the old directory by hand. Widget order did not change and node ids did not change, so saved workflows still load.
Changelog CHANGELOG.md

⟔ ▲ ⟓ back to top

◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆

❖ Acknowledgments

⟔ ▲ ⟓ back to top

S
Description
No description provided
Readme Apache-2.0
1.4 MiB
Languages
Python 99.3%
JavaScript 0.7%