IndexTTS 2 / 2.5 Synthesize
Clone a voice from a few seconds of audio and make it say anything — IndexTTS 2/2.5 Synthesize
- model
- speaker_audio
- emotion_audio
- audio
This is the node you actually came for. IndexTTS 2 / 2.5 Synthesize is where the joyfoxai/ComfyUI-Index-TTS-25 pack turns a few seconds of someone's voice plus some text into new speech in that voice - narration, dubbing, a character that says whatever you want. It's zero-shot voice cloning, all local, no API key. The KB's audio essay sums up the state of play: open TTS closed the cloning gap, and IndexTTS 2.5 is one of the few open models that also does it across multiple languages (ZH, EN, JA, AR, ES - where IndexTTS 2 is limited to ZH/EN).
It's the star of the pack, but it needs the Model Loader feeding it a model handle and a Load Audio node for the reference clip. The pipeline is tiny: Loader → Synthesize → Preview/Save Audio.
How it works
Under the hood the node writes your speaker_audio to a temp WAV, calls IndexTTS's infer() with your text, language and emotion settings, and converts the raw result back into a standard ComfyUI AUDIO. Two details are worth knowing because they explain real-world behavior:
- The clipping fix. TorchAudio 2.9 changed how it saves int16 PCM and can turn IndexTTS output into a fully-clipped, harsh/near-white-noise WAV. This node normalizes the native int16 result to float, so you shouldn't hear that. If you do get garbage, your setup lost that normalization.
- Reproducibility. The
seedinput seeds Python's random, NumPy, and torch at once - same seed, same audio.
The inputs that matter
The schema is long - roughly 30 inputs - but most have sane defaults. A beginner sets these:
model- from the Model Loader. Non-negotiable.speaker_audio- your reference clip. This is the make-or-break input, see troubleshooting.text- what the voice should say.language-ZH/EN/JA/AR/ESon 2.5. Pick JA on IndexTTS 2 and it errors out - that's by design, v2 only does ZH/EN.emotion_mode- five options, defaultsame_as_speaker(match the reference's mood).reference_audioneeds the optionalemotion_audioinput connected;emotion_vectorlights up the eight sliders (happy,angry,sad,fearful,disgusted,melancholic,surprised,calm);emotion_textinfers emotion from the synthesized text;extra_emotion_textreads it from a separate field.emotion_weight(0.65) scales whatever mode you picked.
Beyond that: duration_factor (0.5–2.0, 2.5 only) is your speed dial, interval_silence_ms sets the gap between segments, and do_sample/temperature/top_p/top_k/num_beams/repetition_penalty are GPT-tokenizer sampling knobs - the defaults are fine for a first run. Both duration_factor and text_normalization are silently ignored on IndexTTS 2, so don't panic when nothing changes.
The output
One output, audio (type AUDIO). Wire it to Preview Audio or Save Audio, or feed it into a talking-head pipeline (InfiniteTalk, Wan S2V, MMAudio-style foley).
Getting good clones - the part people actually struggle with
The community's hard-won lesson with IndexTTS is that the reference audio dominates the result. Loud, dynamic, expressive references - podcast-style speech - clone far better than quiet, slow, monotone ones. If your clone sounds weak or flat, don't touch the node settings first; swap in a livelier reference clip. On IndexTTS 2, words with apostrophes (don't, it's) historically get mangled - write them as dont, its. And since bf16 on v2 is secretly FP16, thin output on an IndexTTS 2 model is a sign to try fp32 on the Loader.
Install
Same as the rest of the pack - clone, install requirements into ComfyUI's Python, download models:
cd ComfyUI/custom_nodes
git clone https://github.com/joyfoxai/ComfyUI-Index-TTS-25.git
cd ComfyUI
python -m pip install -r custom_nodes/ComfyUI-Index-TTS-25/requirements.txt
cd custom_nodes/ComfyUI-Index-TTS-25
./download_models.sh all
Then restart ComfyUI; the nodes live under right-click → audio → IndexTTS. If the model loads but synthesis fails, the usual culprits are missing fugashi/unidic-lite (Japanese deps, needed even for Chinese), or an incomplete model download - re-run the download script.
Errors you'll hit and what they mean
Text must not be empty- obvious, but the node won't guess.emotion_audio must be connected in reference_audio mode- you picked a mode without wiring its input. Either connectemotion_audioor switch modes.extra_emotion_text must not be empty in extra_emotion_text mode- same deal on the text side.- IndexTTS 2 + a non-ZH/EN language → explicit error telling you it needs 2.5. Fair.
It's not perfect, it's not ElevenLabs, and this pack is young. But for local, private, no-key voice cloning that you fully control, it's genuinely good - and it finally gives ComfyUI a real multilingual voice.
Inputs (30)
| Name | Type | Default | Description |
|---|---|---|---|
| model | INDEXTTS25_MODEL | — | |
| speaker_audio | AUDIO | — | |
| text | STRING | 欢迎使用 IndexTTS 2.5。 | — |
| language | COMBO | ZH | 5 options: ZH, EN, JA, AR, ES |
| emotion_mode | COMBO | same_as_speaker | 5 options: same_as_speaker, reference_audio, emotion_vector, emotion_text, extra_emotion_text |
| emotion_weight | FLOAT | 0.650–1 | — |
| extra_emotion_text | STRING | — | |
| happy | FLOAT | 0.000–1 | — |
| angry | FLOAT | 0.000–1 | — |
| sad | FLOAT | 0.000–1 | — |
| fearful | FLOAT | 0.000–1 | — |
| disgusted | FLOAT | 0.000–1 | — |
| melancholic | FLOAT | 0.000–1 | — |
| surprised | FLOAT | 0.000–1 | — |
| calm | FLOAT | 0.000–1 | — |
| emotion_random | BOOLEAN | false | — |
| duration_factor | FLOAT | 1.000.5–2 | — |
| interval_silence_ms | INT | 2000–5000 | — |
| text_normalization | BOOLEAN | true | — |
| max_text_tokens_per_segment | INT | 12020–400 | — |
| do_sample | BOOLEAN | true | — |
| temperature | FLOAT | 0.80.1–2 | — |
| top_p | FLOAT | 0.800–1 | — |
| top_k | INT | 300–100 | — |
| num_beams | INT | 31–10 | — |
| repetition_penalty | FLOAT | 10.00.1–20 | — |
| length_penalty | FLOAT | 0.0-2–2 | — |
| max_mel_tokens | INT | 150050–4096 | — |
| seed | INT | 00–9223372036854776000 | — |
| emotion_audioopt | AUDIO | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |