Nodes/ComfyUI_IndexTTS/IndexTTS2 Run
ComfyUI Node

IndexTTS2 Run

Voice cloning with real emotion control and two-speaker dialogue

By billwuhao·Created about a year ago·Updated 9 months ago· 537
IndexTTS2 Run
  • audio
  • dialogue_audio_s2
  • emo_audio_prompt
  • emo_audio_prompt_s2
  • audio
text
top_k30
top_p0.80
temperature0.80
num_beams3
max_mel_tokens1500
max_text_tokens_per_sentence120
custom_cuda_kernelfalse
deepspeedfalse
unload_modeltrue
emo_alpha1.00
emo_vector
use_emo_textfalse
emo_text
use_randomfalse
emo_alpha_s21.00
emo_vector_s2
use_emo_text_s2false
emo_text_s2
use_random_s2false

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.

Category🎤MW/MW-IndexTTS

Inputs (24)

NameTypeDefaultDescription
audioAUDIO
textSTRING
top_kINT300–1000
top_pFLOAT0.800–1
temperatureFLOAT0.800–2
num_beamsINT31–20
max_mel_tokensINT15000–100000
max_text_tokens_per_sentenceINT1200–1000
custom_cuda_kernelBOOLEANfalse
deepspeedBOOLEANfalse
unload_modelBOOLEANtrue
dialogue_audio_s2optAUDIO
emo_audio_promptoptAUDIO
emo_alphaoptFLOAT1.000–2
emo_vectoroptSTRING[0, 0, 0, 0, 0, 0, 0.45, 0]: [Happy, Angery, Sad, Fear, Hate, Low, Surprise, Neutral]
use_emo_textoptBOOLEANfalse
emo_textoptSTRING
use_randomoptBOOLEANfalse
emo_audio_prompt_s2optAUDIO
emo_alpha_s2optFLOAT1.000–2
emo_vector_s2optSTRING[0, 0, 0, 0, 0, 0, 0.45, 0]: [Happy, Angery, Sad, Fear, Hate, Low, Surprise, Neutral]
use_emo_text_s2optBOOLEANfalse
emo_text_s2optSTRING
use_random_s2optBOOLEANfalse

Outputs (1)

NameTypeDescription
audioAUDIO