Index TTS 2 - Emotion Vector
Eight sliders, direct control over the delivery
- reference_audio
- cache_control
- audio
- seed
- subtitle
Of the three ways this pack lets you steer IndexTTS-2's emotional delivery, this is the most literal one: eight named sliders - Happy, Angry, Sad, Fear, Hate, Low, Surprise, Neutral - each from 0 to 1. No reference clip to hunt down (that's Emotion Audio), no phrase to write and hope the classifier reads it right (that's Emotion Text). Just numbers, directly into the same emotion-conditioning signal the other two nodes derive indirectly.
That directness is also the trap. This is a vector, not eight independent knobs - pushing several sliders up at once, or pushing any one of them too far, moves the output into territory the model wasn't really trained to sound natural in. The community consensus on IndexTTS-2's emotion vector, echoed across more than one comparison thread, is to keep values low and restrained - think "a touch of Happy" rather than maxing it out - because cranking any single emotion value up much past the 0.2–0.3 range is where deliveries start sounding strange rather than expressive. Treat it as seasoning, not a volume knob.
Inputs and outputs that matter
Required, shared with the rest of the TTS2 family: text, reference_audio (the voice being cloned), mode (Auto/Duration/Tokens - leave on Auto unless you're deliberately controlling how the output is paced via max_mel_tokens).
The node's own contribution, all optional FLOATs from 0 to 1 in steps of 0.05: Happy, Angry, Sad, Fear, Hate, Low, Surprise, Neutral. Start with one or two nudged up slightly and the rest at zero rather than sculpting all eight - you'll get a cleaner read on what each one actually does to the output.
Everything else is the shared TTS2 sampling toolkit: 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 in an Index TTS 2 - Cache Control node if you're iterating on these sliders repeatedly and want the model to stay loaded between runs instead of reloading each time).
Outputs: audio, seed, and subtitle - the spoken text as a plain string.
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
Needs the full IndexTTS-2 stack under ComfyUI/models/IndexTTS-2/ - base weights, the Qwen emotion classifier (qwen0.6bemo4-merge), MaskGCT's semantic codec, CampPlus speaker embeddings, facebook/w2v-bert-2.0, and a BigVGAN vocoder checkpoint. Use the pack's TTS2_download.py script to fetch and place all of it rather than downloading by hand - it resumes interrupted downloads and supports an HF_ENDPOINT mirror for users in mainland China.
Where people get burned
Same TTS2 dependency landmines as the rest of this family: a 401 on facebook/w2v-bert-2.0 means that gated repo needs to be downloaded locally, not fetched live; transformers should be pinned to 4.52.1 or 4.54.1 (4.57.1+ is confirmed broken); and a safetensors version below 0.4.3 throws a get_slice attribute error. Specific to this node: if the output sounds distorted, robotic, or the emotion just doesn't land right, the fix is almost always to pull the sliders down, not adjust which one you're using - this pack's own emotion-audio option tends to produce more natural results for strong emotions precisely because a real clip stays inside the range the model actually learned from, where hand-set vector extremes can wander outside it.
Inputs (22)
| 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 | — | |
| Happyopt | FLOAT | 0.000–1 | — |
| Angryopt | FLOAT | 0.000–1 | — |
| Sadopt | FLOAT | 0.000–1 | — |
| Fearopt | FLOAT | 0.000–1 | — |
| Hateopt | FLOAT | 0.000–1 | — |
| Lowopt | FLOAT | 0.000–1 | — |
| Surpriseopt | FLOAT | 0.000–1 | — |
| Neutralopt | FLOAT | 0.000–1 | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |
| seed | INT | — |
| subtitle | STRING | — |