IndexTTS2 Run
Voice cloning with real emotion control and two-speaker dialogue
- audio
- dialogue_audio_s2
- emo_audio_prompt
- emo_audio_prompt_s2
- audio
IndexTTS2Run is the node that does the actual voice cloning in this pack: feed it a short reference clip and some text, get back audio spoken in that voice. What earns it a spot over a plain zero-shot TTS node is the emotion layer. IndexTTS2 (the model underneath, released September 2025) separates who is talking from how they feel, so you can clone someone from a flat, neutral recording and still make the output sound annoyed, tired, or thrilled without ever having them say a word in that mood. It also does two-person dialogue in a single pass, which honestly is the reason most people end up here - one node, one script, two voices trading lines.
How it works
It's the usual TTS shape under the hood: text gets tokenized, a GPT-style model predicts mel tokens conditioned on your reference audio, and a vocoder (BigVGAN) turns that into a waveform. The part that's new in v2 is emotion, bolted on as a second, independent conditioning path. You can drive it three ways - hand it a separate audio clip that just carries the mood you want (doesn't matter whose voice, only the emotion in it matters), type a free-text description and let the model interpret it, or set an 8-value emotion vector directly. Skip all three and it falls back to using the clone reference itself as the emotion source, so a calm sample gives you calm output by default - no surprises, no unlabeled randomness sneaking in.
The inputs and outputs that matter
audio- the voice you're cloning. A few clean seconds is plenty.text- what it says. For dialogue mode, format it[S1] line one/[S2] line two, one tag per line.max_mel_tokens(default 1500) - hard cap on how long the output can get. Long paragraphs need this bumped up or you'll get a clipped ending.unload_model(on by default) - frees VRAM after each run. Turn it off if you're queuing several lines back to back and don't want to eat the reload cost every time.
Optional, and only relevant once you want emotion: emo_audio_prompt (a clip carrying the mood, not the voice) with emo_alpha for strength, or emo_vector for direct numeric control - the tooltip spells out the order: [0, 0, 0, 0, 0, 0, 0.45, 0] maps to [Happy, Angry, Sad, Fear, Hate, Low, Surprise, Neutral], each 0–1. Prefer words? use_emo_text / emo_text does the same thing from a description. Drop a clip into dialogue_audio_s2 and the node switches into two-speaker dialogue mode automatically; everything above gets an _s2 twin for controlling the second speaker independently. The rest - top_k, top_p, temperature, num_beams, max_text_tokens_per_sentence, custom_cuda_kernel, deepspeed - are sampling and performance knobs, best left alone until you're chasing quality or speed specifically. Output is a single audio, ready for Save Audio or Preview Audio.
How to install it
Search "ComfyUI_IndexTTS" in ComfyUI Manager, or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/billwuhao/ComfyUI_IndexTTS.git
cd ComfyUI_IndexTTS
pip install -r requirements.txt
Windows needs an extra step first: pynini doesn't build cleanly from pip on Windows, so the author ships prebuilt wheels in a separate repo (billwuhao/pynini-windows-wheels) - grab the one matching your Python version, install it, then importlib_resources and WeTextProcessing on top.
Then the model download, which is the real time sink: five separate Hugging Face repos manually placed under ComfyUI/models/TTS - bigvgan_v2_22khz_80band_256x, campplus, IndexTTS-2 itself, MaskGCT's semantic codec, and w2v-bert-2.0. There's no auto-downloader for any of it, and it's noticeably more to pull than most single-checkpoint TTS nodes, so budget the bandwidth and disk space before you start.
Common issues & troubleshooting
If ComfyUI throws an import error mentioning transformers.cache_utils when this pack loads, that's a transformers version conflict - a real, documented failure on this exact pack (its install folder is named indextts-mw), usually from another node pack in your environment pinning an incompatible version. Reinstalling this pack's requirements.txt last, or isolating it in a fresh venv, is the fix.
Worth knowing before you go searching for help online: this is the original ComfyUI wrapper for IndexTTS, predating v2 by several months, but it isn't the only one - snicolast/ComfyUI-IndexTTS2 is a separate pack that gets more of the Reddit attention specifically for v2's emotion controls. If a troubleshooting thread you find doesn't match what you're seeing here, check which wrapper it's actually about.
The author, billwuhao, maintains a whole family of TTS and audio wrapper nodes (DiffRhythm, AudioTools, HeyGem, and this one), and his other packs have a track record of thin install docs and dependency friction on Reddit. If something here doesn't just work, check the pack's GitHub issues first - you're probably not the first.
Inputs (24)
| Name | Type | Default | Description |
|---|---|---|---|
| audio | AUDIO | — | |
| text | STRING | — | |
| top_k | INT | 300–1000 | — |
| top_p | FLOAT | 0.800–1 | — |
| temperature | FLOAT | 0.800–2 | — |
| num_beams | INT | 31–20 | — |
| max_mel_tokens | INT | 15000–100000 | — |
| max_text_tokens_per_sentence | INT | 1200–1000 | — |
| custom_cuda_kernel | BOOLEAN | false | — |
| deepspeed | BOOLEAN | false | — |
| unload_model | BOOLEAN | true | — |
| dialogue_audio_s2opt | AUDIO | — | |
| emo_audio_promptopt | AUDIO | — | |
| emo_alphaopt | FLOAT | 1.000–2 | — |
| emo_vectoropt | STRING | [0, 0, 0, 0, 0, 0, 0.45, 0]: [Happy, Angery, Sad, Fear, Hate, Low, Surprise, Neutral] | |
| use_emo_textopt | BOOLEAN | false | — |
| emo_textopt | STRING | — | |
| use_randomopt | BOOLEAN | false | — |
| emo_audio_prompt_s2opt | AUDIO | — | |
| emo_alpha_s2opt | FLOAT | 1.000–2 | — |
| emo_vector_s2opt | STRING | [0, 0, 0, 0, 0, 0, 0.45, 0]: [Happy, Angery, Sad, Fear, Hate, Low, Surprise, Neutral] | |
| use_emo_text_s2opt | BOOLEAN | false | — |
| emo_text_s2opt | STRING | — | |
| use_random_s2opt | BOOLEAN | false | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |