Index TTS 2.5
Local voice cloning with actual emotion dials, inside ComfyUI
- reference_audio
- emo_ref_audio
- audio
- seed
- subtitle
IndexTTS-2.5 is the open TTS model that finally gets the whole package in one node: zero-shot voice cloning, five languages, and controllable emotion. Most TTS in ComfyUI gives you "clone this voice, say this text." This one also lets you say "say it angry" - or feed it an 8-number emotion vector and watch the delivery change. That's the differentiator, and it's why you'd reach for it over the usual Kokoro or F5-TTS corners. Those are excellent, but they're mostly monotone-with-vibes; IndexTTS is a Chinese research release (IndexTeam) that shipped 2.5 with a big inference-speedup and multilingual expansion, and the community's standing verdict is that it clones well, with the caveat that it can read a little "robotic" next to the very best - the emotion control is what pulls it back into the genuinely useful column.
What it actually does
The node (IndexTTS2_5Node) takes your text plus a reference audio clip and produces a new clip of that voice saying your text, in zh, en, ja, es, or ar. Under the hood it's the official IndexTTS-2.5 stack vendored straight into the pack - autoregressive GPT backbone, a S2Mel acoustic stage, and the BigVGAN vocoder - so nothing extra to wire up. On first run it auto-downloads three auxiliary models (w2v-bert-2.0 semantic encoder, campplus_cn_common.bin speaker embedder, and bigvgan) into your models dir's hf_cache/. It also exports a subtitle string with rough >> timestamp lines if you want burned captions on a video.
The inputs that matter
The required set is small and you'll touch all of it:
text- what to say (multiline).reference_audio- the voice to clone, as an AUDIO type, so load a clip with a video-loader node first. Quality here decides everything: loud, dynamic reference audio (podcast-style) clones far better than quiet, flat samples.language-zh/en/ja/es/ar.duration_factor- speaking speed, 0.5–2.0. This is your "faster/slower" knob.seed- set it to lock a take; note that0means not fixed, so zero won't give you reproducible results.
Emotion is optional and has three mutually exclusive routes: emo_ref_audio (a clip of the target emotion - ignored if the others are set), emo_vector (exactly 8 comma-separated or JSON numbers in the fixed order happy/angry/sad/afraid/disgusted/melancholic/surprised/calm - if you give anything but exactly 8, it's silently ignored, no error), and emo_text (describe it in words, like "angry", which a QwenEmotion model converts to the same vector - needs the optional qwen0.6bemo4-merge model). emo_alpha scales the whole thing 0–1. The sampling knobs (do_sample, temperature, top_p, top_k, repetition_penalty, num_beams, max_mel_tokens) are the standard LLM-generation family; leave them alone until you have a reason not to.
It returns three things: audio (AUDIO - wire to a preview or save node), seed, and subtitle.
Installing it
Grab it from ComfyUI Manager (search "IndexTTS"), or:
cd ComfyUI/custom_nodes
git clone https://github.com/mailzwj/ComfyUI-IndexTTS-2.5
cd ComfyUI-IndexTTS-2.5
pip install -r requirements.txt
Then drop the weights where the loader looks for them:
hf download IndexTeam/IndexTTS-2.5 --local-dir="<ComfyUI>/models/TTS/IndexTTS-2.5"
That's the whole pack: main node plus the Emo Settings helper. The dependency list is long and unsexy (librosa, sentencepiece, tiktoken, whisper, modelscope, wetext, …) but the author deliberately skipped the official keras==2.9.0 legacy dependency, so it doesn't force you onto an old Python. One real gotcha: the vendored indextts source is patched (compatibility_patch.py) to work with transformers 4.57.x. If your environment has a different transformers, expect it to break until the patch catches up. Japanese TTS additionally wants fugashi + unidic-lite, and flash-attn is off by default to dodge CUDA ABI mismatches.
Troubleshooting
- "IndexTTS-2.5 模型目录缺少文件" - models aren't in
models/TTS/IndexTTS-2.5. Run thehf downloadcommand above. - Weird errors right after install - almost certainly the transformers version vs. the compatibility patch. Check what's installed; that's the first thing to suspect.
- Slow HuggingFace downloads - set
export HF_ENDPOINT="https://hf-mirror.com"before first run. - Clones sound flat or warbly - swap the reference clip for something louder and more dynamic. Community testing on IndexTTS models found reference quality is the single biggest lever, by far. Output is also modest sample-rate mono (the earlier IndexTTS wrapper's users measured ~22kHz), so don't chase studio fidelity on the output side.
The one trap that'll waste an hour: forgetting emo_vector must be exactly 8 numbers. Nine, or a typo, and it's dropped with zero feedback - the synthesis just runs emotionless.
Inputs (22)
| Name | Type | Default | Description |
|---|---|---|---|
| text | STRING | 你好,欢迎使用 IndexTTS 2.5 语音合成。 | — |
| reference_audio | AUDIO | — | |
| language | COMBO | zh | 5 options: zh, en, ja, es, ar |
| duration_factor | FLOAT | 1.000.5–2 | — |
| seed | INT | 00–4294967295 | — |
| emo_ref_audioopt | AUDIO | 情感参考音频:用一段带目标情绪的语音引导合成情感。 提供 emo_vector 或 emo_text 后此输入会被忽略。 | |
| emo_alphaopt | FLOAT | 1.000–1 | 情感强度(0~1):对 emo_vector 做整体缩放; 或控制情感参考音频与说话人音色的混合比例。 |
| emo_vectoropt | STRING | 8 维情感向量,顺序固定:高兴/愤怒/悲伤/恐惧/反感/低落/惊讶/自然。 逗号分隔或 JSON 数组,如 0.8,0,0,0,0,0,0,0 或 [0,0,0,0,0,0,0,1](自然)。 必须恰好 8 个数字,否则忽略;提供后覆盖 emo_ref_audio。 | |
| emo_textopt | STRING | 情感文本:用自然语言描述情绪(如「高兴」「悲伤」「愤怒」),由 QwenEmotion 自动转为情感向量。 非空即自动启用,需 qwen0.6bemo4-merge 模型;提供后覆盖 emo_ref_audio。 | |
| use_emo_textopt | BOOLEAN | false | 使用情感文本。emo_text 非空时自动启用,无需单独勾选。 |
| use_qwen_emoopt | BOOLEAN | false | 加载 QwenEmotion 情感模型(仅情感文本需要;使用 emo_text 时自动加载)。 |
| use_randomopt | BOOLEAN | false | 随机情感:随机挑选情感参考向量(需同时提供 emo_vector 或 emo_text 才生效)。 |
| do_sampleopt | BOOLEAN | true | — |
| temperatureopt | FLOAT | 0.800.1–2 | — |
| top_popt | FLOAT | 0.800–1 | — |
| top_kopt | INT | 300–100 | — |
| repetition_penaltyopt | FLOAT | 10.01–15 | — |
| length_penaltyopt | FLOAT | 0.0-2–2 | — |
| num_beamsopt | INT | 31–10 | — |
| max_mel_tokensopt | INT | 150050–1815 | — |
| use_bf16opt | BOOLEAN | true | — |
| auto_free_memoryopt | BOOLEAN | false | 生成完成后自动回收内存/显存(卸载整套 IndexTTS-2.5 模型并执行 gc + CUDA empty_cache)。 勾选后:本次生成结束即释放,下次生成需重新加载模型(约 10~60 秒), 适合需要把显存腾给图像/视频等其它模型的场景; 不勾选(默认):模型常驻 GPU,连续多次生成更快。 |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |
| seed | INT | — |
| subtitle | STRING | — |