IndexTTS2 Emotion (Text)
Tell it the mood in plain words — no emotion clips, no sliders
- model
- spk_audio_prompt
- audio
Of all the emotion controls in this pack, this is the one I'd hand a beginner first. You get the same speaker-emotion disentanglement as the audio version, but instead of hunting for an angry-sounding clip, you just type "angry" - or "excited but trying to stay calm", which no audio clip in the world does cleanly. It's the friendliest face of IndexTTS-2, and it's the node that makes the model feel like magic instead of a research project.
The trick behind it is delightfully small: the model directory ships with a little local Qwen LLM whose only job is reading your emotion text and classifying it into the same 8-dimensional emotion vector the model's fancier sibling uses - happy, angry, sad, afraid, disgusted, melancholic, surprised, calm. No API call, no cloud dependency; it all runs on your GPU.
The inputs that matter
spk_audio_prompt- the voice to clone, fromLoadAudio. Same rules as everywhere else in this pack: 5–15 seconds, clean, energetic.text- the line the voice says.use_emo_text- the sneaky default-on switch. When enabled, the node extracts emotion from the maintextitself. "I'm so sorry, I ruined everything" gets read as sad even though you never set an emotion. When off, emotion only comes from the separateemo_textfield.emo_text(optional) - your explicit mood description, e.g.enthusiastic and proud. Takes priority when filled.emo_alpha- emotion strength, 0.0–1.0, default 0.6. That default is the pack's own recommendation, and it's worth trusting: lower values sound more natural, and 0.6 was picked deliberately.
Output is one audio in standard ComfyUI AUDIO format, straight into SaveAudio.
How the mood becomes a voice
When use_emo_text is on, the text goes to the bundled Qwen model, which returns the 8 emotion intensities; that vector is then used to weigh a set of emotion prototypes inside the TTS model. Two quirks worth knowing. First, if Qwen detects no emotion at all, it defaults to a calm/neutral voice - so deadpan is the floor, not an error. Second, the classifier has a documented blind spot: it struggles to tell sad (悲伤) from melancholic (低落), so the pack maintains a small workaround word list (melancholy, depression, gloomy...) that forces the melancholic channel. If you type "melancholic" and hear plain sad, throw in one of those words - or just describe it as "low, somber" and move on.
Choosing it over the others
Compared to the audio-emotion node: this one needs one clip instead of two, and text descriptions beat hunting for the perfect feeling-clip. Compared to the vector node: it's far easier but less precise - the Qwen classifier is doing your slider-pushing for you, and you can't nudge surprised to exactly 0.45. When batch-generating and you need reproducible emotion, use the vector node; when you want results in the next five minutes, this one.
Install
Same pack, same dance: Manager search "IndexTTS-2" or git clone into custom_nodes, pip install -r requirements.txt, model in ComfyUI/models/IndexTTS-2/. Remember the first load also pulls w2v-BERT and MaskGCT from Hugging Face, so keep internet on until you've loaded once.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| model | INDEXTTS2_MODEL | — | |
| text | STRING | Emotionally expressive speech. | — |
| spk_audio_prompt | AUDIO | — | |
| use_emo_text | BOOLEAN | true | — |
| emo_alpha | FLOAT | 0.60–1 | — |
| temperature | FLOAT | 1.00.1–2 | — |
| top_k | INT | 00–100 | — |
| top_p | FLOAT | 1.000–1 | — |
| use_random | BOOLEAN | false | — |
| emo_textopt | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |