Nodes/ComfyUI-Index-TTS/Index TTS 2.5 - Emotion Vector
ComfyUI Node

Index TTS 2.5 - Emotion Vector

Eight sliders, zero downloads

By chenpipi0807·Created about a year ago·Updated 6 days ago· 751
Index TTS 2.5 - Emotion Vector
  • reference_audio
  • cache_control
  • audio
  • seed
  • subtitle
text大家好,这是 IndexTTS 2.5 的语音合成演示。
langZH
duration_factor1.00
do_sample_modeon
temperature0.80
top_p0.80
top_k30
num_beams3
repetition_penalty10.0
length_penalty0.0
max_mel_tokens1500
max_tokens_per_sentence120
interval_silence_ms200
text_normalizationtrue
seed0
Happy0.00
Angry0.00
Sad0.00
Fear0.00
Hate0.00
Low0.00
Surprise0.00
Neutral0.00
use_randomfalse

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_weight isn'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.

Categoryaudio

Inputs (26)

NameTypeDefaultDescription
textSTRING大家好,这是 IndexTTS 2.5 的语音合成演示。
reference_audioAUDIO
langCOMBOZH6 options: ZH, EN, JA, ES, AR, ZH/EN
duration_factorFLOAT1.000.5–2
do_sample_modeoptCOMBOon2 options: off, on
temperatureoptFLOAT0.800.1–2
top_poptFLOAT0.800–1
top_koptINT300–100
num_beamsoptINT31–10
repetition_penaltyoptFLOAT10.01–10
length_penaltyoptFLOAT0.0-2–2
max_mel_tokensoptINT150050–1815
max_tokens_per_sentenceoptINT1200–600
interval_silence_msoptINT2000–2000
text_normalizationoptBOOLEANtrue
seedoptINT00–4294967295
cache_controloptDICT
HappyoptFLOAT0.000–1
AngryoptFLOAT0.000–1
SadoptFLOAT0.000–1
FearoptFLOAT0.000–1
HateoptFLOAT0.000–1
LowoptFLOAT0.000–1
SurpriseoptFLOAT0.000–1
NeutraloptFLOAT0.000–1
use_randomoptBOOLEANfalse

Outputs (3)

NameTypeDescription
audioAUDIO
seedINT
subtitleSTRING