Index TTS 2.5 - Emotion Vector
Eight sliders, zero downloads
- reference_audio
- cache_control
- audio
- seed
- subtitle
If you've ever wanted to dial in exactly how angry a line should sound instead of praying the model guesses right, this is your node. Index TTS 2.5 - Emotion Vector is the most precise of the pack's three emotion-control options: instead of a reference clip or a text description, it hands you eight sliders - Happy, Angry, Sad, Fear, Hate, Low, Surprise, Neutral - each from 0 to 1, and you mix your own emotion.
It's also the cheap option. Unlike the Emotion Text node, it needs no extra Qwen model download, and unlike Emotion Audio it needs no second clip. Same base pipeline, one extra vector.
How it works
IndexTTS conditions generation on an 8-dimensional emotion vector. This node takes your eight sliders, applies the same normalization the official demo uses (a fixed per-dimension bias, then rescaling so the sum stays bounded), and feeds the result into the synthesis engine as the emotion conditioning. The use_random toggle (default off) just throws the sliders away and lets the engine pick a random emotion per run - handy when you're rolling seeds to audition moods, pointless if you want something specific.
Under the hood the node builds a plain list from the sliders in that exact order - Happy, Angry, Sad, Fear, Hate, Low, Surprise, Neutral - so if you're automating a workflow with a script, that's the order to write.
Inputs and outputs that matter
The required inputs are the same as the Base node - text, reference_audio, lang, duration_factor - because this is a full synthesis node, not a helper. Same sampling stack and seed in optional, same cache_control input. Then the eight emotion floats. A couple of practical notes:
- Leave most sliders at 0 and push one or two. Setting everything to 0 is effectively neutral; the vector gets normalized into the model's expected range either way.
emotion_weightisn't here (that's on the Audio and Text variants) - the sliders are the weight. Adjust the mix directly.use_random(BOOLEAN) overrides all sliders for one-shot variety. It's a gamble, but it's a fun gamble.
Outputs are audio (AUDIO → SaveAudio/PreviewAudio), seed (INT), and subtitle (STRING). Nothing exotic.
Install and gotchas
Same pack as everything else: ComfyUI Manager (search "ComfyUI-Index-TTS"), or:
cd ComfyUI/custom_nodes
git clone https://github.com/chenpipi0807/ComfyUI-Index-TTS
cd ComfyUI-Index-TTS && pip install -r requirements.txt
Models go in ComfyUI/models/IndexTTS-2.5/ via the pack's TTS2_5_download.py - gpt.pth, codec, s2mel.pth, Campplus, w2v-bert-2.0/, bigvgan/. No extra download for this node. The usual pack gotchas apply: pin transformers==4.52.1/4.54.1 if the run fails after a transformers bump, and if you see facebook/w2v-bert-2.0 401 errors, that's the offline-loading fix - put the whole folder in the models dir.
One honest caveat: eight sliders is a lot of knobs, and the mapping between slider values and what actually comes out isn't written anywhere. You'll spend a couple of renders figuring out which mix makes "Hate 0.7" sound like annoyance vs. fury. Start from the README's pairing - 高兴/愤怒/悲伤/恐惧/反感/低落/惊讶/平静 map to your sliders in order - and you'll get there.
Inputs (26)
| Name | Type | Default | Description |
|---|---|---|---|
| text | STRING | 大家好,这是 IndexTTS 2.5 的语音合成演示。 | — |
| reference_audio | AUDIO | — | |
| lang | COMBO | ZH | 6 options: ZH, EN, JA, ES, AR, ZH/EN |
| duration_factor | FLOAT | 1.000.5–2 | — |
| 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 | — |
| interval_silence_msopt | INT | 2000–2000 | — |
| text_normalizationopt | BOOLEAN | true | — |
| 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 | — |
| use_randomopt | BOOLEAN | false | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |
| seed | INT | — |
| subtitle | STRING | — |