Index TTS 2 - Emotion Audio
Steer the delivery with a second reference clip
- reference_audio
- cache_control
- emo_ref_audio
- audio
- seed
- subtitle
Same node as Index TTS 2 - Base, plus one addition: a second audio input, purely for emotional tone. Feed it a clip of someone sounding furious, terrified, or giddy, and IndexTTS-2 borrows that emotional delivery while still cloning the voice identity from your main reference_audio. Two separate audio inputs doing two separate jobs - one is "who," the other is "how they feel."
That split is actually the point of the whole IndexTTS-2 emotion system: this pack, and the underlying IndexTTS-2 model, treat voice identity and emotional expression as two things you dial in independently rather than one blended reference. Of the three emotion-control approaches in this pack - audio reference, an 8-value emotion vector, or a text description - feeding a real emotion clip is generally the one people report getting the most natural results from, since you're handing the model an actual example of the delivery instead of asking it to interpret a slider or a sentence. If you want type-in emotion control instead, look at Emotion Text; for numeric sliders, Emotion Vector.
Inputs and outputs that matter
Required, same as Base: text, reference_audio (the voice), mode (Auto/Duration/Tokens - leave on Auto unless you're deliberately controlling output length via max_mel_tokens/max_tokens_per_sentence).
The two that make this node what it is, both optional: emo_ref_audio (the clip whose emotional tone gets borrowed - doesn't need to be the same speaker, doesn't need to say the same words, just needs to sound the way you want the output delivered) and emotion_weight (0–1, default 0.8 - how strongly that emotional coloring gets applied). Push it too high and delivery can start to warp; if the output sounds strained or off, that's your first dial to back off before touching anything else.
Everything else is the standard sampling toolkit shared across the TTS2 nodes: do_sample_mode, temperature, top_p, top_k, num_beams, repetition_penalty, length_penalty, max_mel_tokens, max_tokens_per_sentence, seed, and cache_control (wire an Index TTS 2 - Cache Control node here to manage whether the model stays loaded between runs).
Outputs: audio, seed, and subtitle - a plain-text transcript of what was spoken.
Install
ComfyUI Manager: search ComfyUI-Index-TTS, install, restart. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/chenpipi0807/ComfyUI-Index-TTS.git
cd ComfyUI-Index-TTS
pip install -r requirements.txt
You need the full IndexTTS-2 model stack under ComfyUI/models/IndexTTS-2/ - base weights, the qwen0.6bemo4-merge emotion classifier, MaskGCT's semantic codec, CampPlus speaker embeddings, and Facebook's w2v-bert-2.0 extractor, plus a BigVGAN vocoder checkpoint. Don't fetch it piece by piece: run the pack's bundled TTS2_download.py (needs huggingface_hub; supports resuming and a China mirror via HF_ENDPOINT).
Where people get burned
The classic first-run error is a 401 on facebook/w2v-bert-2.0 - that repo is gated, so grab it manually into ComfyUI/models/IndexTTS-2/w2v-bert-2.0/ rather than expecting a live download. transformers version matters: pin to 4.52.1 or 4.54.1, since 4.57.1+ breaks TTS2 outright. If emo_ref_audio isn't obviously changing the delivery, try turning emotion_weight up before assuming the node is broken - it's genuinely subtle at low values by design. And if you're chaining several generations back to back and each one feels slow to start, that's the model loading and unloading from VRAM each run - an Index TTS 2 - Cache Control node wired in with caching on will fix it, at the cost of holding VRAM between generations.
Inputs (16)
| Name | Type | Default | Description |
|---|---|---|---|
| text | STRING | Hello, this is IndexTTS2. | — |
| reference_audio | AUDIO | — | |
| mode | COMBO | Auto | 3 options: Auto, Duration, Tokens |
| do_sample_modeopt | COMBO | on | 2 options: off, on |
| temperatureopt | FLOAT | 0.800.1–2 | — |
| top_popt | FLOAT | 0.800–1 | — |
| top_kopt | INT | 300–100 | — |
| num_beamsopt | INT | 31–10 | — |
| repetition_penaltyopt | FLOAT | 10.01–10 | — |
| length_penaltyopt | FLOAT | 0.0-2–2 | — |
| max_mel_tokensopt | INT | 150050–1815 | — |
| max_tokens_per_sentenceopt | INT | 1200–600 | — |
| seedopt | INT | 00–4294967295 | — |
| cache_controlopt | DICT | — | |
| emo_ref_audioopt | AUDIO | — | |
| emotion_weightopt | FLOAT | 0.800–1 | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |
| seed | INT | — |
| subtitle | STRING | — |