Nodes/ComfyUI-Easy-IndexTTS2/IndexTTS Generate
ComfyUI Node

IndexTTS Generate

Cloning voices with an emotion dial and a subtitle track

By yolain·Created 11 months ago·Updated 8 months ago· 269
IndexTTS Generate
  • indextts_model
  • reference_audio
  • reference_audios
  • emotions
  • audio
  • seed
  • subtitle
  • subtitle_text
text
unload_modelfalse
do_sampletrue
temperature0.80
top_p0.90
top_k30
num_beams3
repetition_penalty10.0
length_penalty0.0
max_mel_tokens1815
max_tokens_per_sentence120
speech_speed1.00
seed0

This is the star of the pack. IndexTTS Generate is where IndexTTS-2 actually turns text into a cloned voice - and unlike most TTS nodes, it can juggle multiple voices, scripted pauses, per-line emotions, and even a timed subtitle track in one pass. If you've ever wanted an ElevenLabs-style pipeline that runs entirely on your own GPU, this is the node you'll spend your time in. The community's shorthand for IndexTTS-2 is "great cloning, real emotion control, En/Cn only," and this node is the version of that you live in inside ComfyUI.

How it works

You feed it the indextts_model handle from IndexTTS Model Loader, some reference audio (the voice to clone), and a block of text. The node parses that text line by line into segments - voice markers, pauses, timed lines - then synthesizes each segment and concatenates the results into one audio file, building a subtitle track as it goes.

The reference input has a hard priority order, straight from the README: emotions > reference_audios > reference_audio. Wire in emotion objects from the Voice Emotion nodes and they win; fall back to a list of audios from Merge Voice Audios; plain single audio is the last resort.

The inputs that actually matter

The full node exposes the whole sampling dial rack (temperature, top_p, top_k, num_beams, repetition_penalty, max_mel_tokens...), and here's the honest take: leave almost all of it alone. The defaults are the author's tuning and they're fine. What you'll actually set:

  • text - the script. This is where the magic lives. Support for three line formats:
    • -2s- or -0.5s- on its own line inserts a pause of that many seconds.
    • [voice_name] text assigns the following text to a specific voice (matching a voice_name you set on an emotion node).
    • (start, end) text gives a line a target time window - the node auto-adjusts speech speed to fit, which is gold for syncing to video or an SRT.
  • reference_audio / reference_audios / emotions - the voice source(s). See the priority order above.
  • speech_speed - 0.5 to 2.0, the one "creative" control you'll actually reach for.
  • unload_model - tick it to free VRAM after synthesis, useful when TTS isn't the last step of your workflow.

The outputs

  • audio - the concatenated waveform, ready for a Save Audio / PreviewAudio node.
  • seed - the seed actually used, so you can reproduce a take.
  • subtitle - the raw JSON of segment times ({id, start, end, text} per segment).
  • subtitle_text - the same thing formatted for human reading / SRT-style use.

If you're building a dubbed video or a talking-head pipeline, wire audio into your lip-sync model and the subtitle outputs into your caption step - that's the workflow the community actually builds around this model (IndexTTS2 + Whisper + LatentSync is a known open-source dubbing stack).

Common gotchas

  • It wants VRAM. Community measurements put IndexTTS-2 around 12GB, with generation roughly 3x slower than real time on a 4060 Ti. It runs, but it's not Kokoro.
  • Watch apostrophes. The model famously stumbles on contractions - "don't" comes out mangled. Write "dont", "its", etc., or accept the occasional glitch.
  • Reference quality is the ceiling. Loud, dynamic reference clips (podcast-style) clone dramatically better than quiet, flat ones. Garbage in, slightly robotic clone out.
  • Repetition penalty defaults to 10.0 - which looks like a typo but is the author's setting. If your output sounds stilted, drop it toward 1–2 and see.
  • No reference at all (no emotions, no audio) throws a clear error telling you to provide one - it won't silently babble.

One last tip: this is the "full" node. If the parameter rack is giving you anxiety, IndexTTS Generate Simple calls this exact node with the same defaults and just hides the dials.

CategoryEasyUse/IndexTTS2

Inputs (17)

NameTypeDefaultDescription
indextts_modelEASY_INDEXTTS_MODEL
textSTRINGText to synthesize. Supports pause format: -2s- (2 seconds pause), -0.5s- (0.5 seconds pause)
unload_modelBOOLEANfalseUnload model from VRAM after synthesis
do_sampleBOOLEANtrue
temperatureFLOAT0.800.1–2
top_pFLOAT0.900–1
top_kINT300–100
num_beamsINT31–10
repetition_penaltyFLOAT10.01–10
length_penaltyFLOAT0.0-2–2
max_mel_tokensINT181550–1815
max_tokens_per_sentenceINT1200–600
speech_speedFLOAT1.000.5–2Speech speed (0.5=slower, 1.0=normal, 2.0=faster)
seedINT00–4294967295
reference_audiooptAUDIOReference audio for voice cloning (Only the one voice is supported)
reference_audiosoptAUDIOS(Optional) Reference audios for voice cloning (Multiple voices are supported)
emotionsoptEASY_INDEXTTS_EMOTIONS(Optional) voice emotions

Outputs (4)

NameTypeDescription
audioAUDIO
seedINT
subtitleSTRING
subtitle_textSTRING