Nodes/ComfyUI-Index-TTS/Index TTS 2.5 - Extract Voice
ComfyUI Node

Index TTS 2.5 - Extract Voice

Index TTS 2.5 – Extract Voice

By chenpipi0807·Created about a year ago·Updated 4 days ago· 748
Index TTS 2.5 - Extract Voice
  • reference_audio
  • voice

This node is the "convert once" step of ComfyUI-Index-TTS's voice workflow. Feed it a reference WAV and it chews that clip into a bundle of speaker conditioning - an INDEXTTS25_VOICE object - that every later generation can reuse without ever touching the WAV again.

Why bother? In the plain Index TTS 2.5 – Base node, every queue run re-encodes your reference clip: speaker embedding, style vector, mel features, the whole front end. That's cheap for one generation and genuinely annoying when you're iterating on text with the same voice, or juggling a handful of voices in one session. Extract once, wire the output into Voice Base, and downstream runs skip that whole encode pass. It's the TTS version of precomputing a conditioning instead of re-prompting every time.

How it works

Extract runs the real IndexTTS-2.5 front end against your audio. The clip gets resampled to 16 kHz for the w2v-bert-2.0 feature extractor (that gives the spk_cond speaker embedding) and to 22 kHz for the mel branch. A kaldi-style fbank runs through the CampPlus speaker model for the style vector, and a length-regulator pass produces the s2mel_prompt. All of it lands in a dict - with spk_cond, style, s2mel_prompt, ref_mel, and emo_cond tensors - tagged with a format name and version so the pack knows what it's holding.

Two things to know before you run it. First, it loads the full 2.5 engine (bf16 on CUDA), so it needs the complete model set in ComfyUI/models/IndexTTS-2.5/ - the loader validates all eight core files before it will do anything. First load is slow; that's normal. Second, the clip is silently truncated to 15 seconds (sr * 15 samples in the code). That's not a bug - 3–15 seconds of clean voice is the documented sweet spot. Feed it a three-minute recording and only the first 15 seconds get used, so trim first.

Inputs and outputs

Exactly one input and one output - this node is gloriously boring:

  • reference_audio (AUDIO) - any ComfyUI audio source: LoadAudio, a preview output, whatever. No upload widget here.
  • Output voice (INDEXTTS25_VOICE) - the conditioning bundle. Wire it into Voice Base to synthesize, or into Save Voice to write it to a .pt file for later.

There's no emotion input, and none needed: extraction bakes an emo_cond in, and the Qwen emotion model is never loaded on this path. On a re-queue, as long as nothing upstream changes, ComfyUI won't rerun it - one extract, many uses.

Installing and models

Install is the pack install - this is just one node in chenpipi0807/ComfyUI-Index-TTS, so Manager covers it (search "IndexTTS"), or:

cd ComfyUI/custom_nodes
git clone https://github.com/chenpipi0807/ComfyUI-Index-TTS.git
cd ComfyUI-Index-TTS
pip install -r requirements.txt

Then the 2.5 models, all into ComfyUI/models/IndexTTS-2.5/. The one-click script handles the lot (option 2 uses the hf-mirror for those of you who need it):

python ComfyUI/custom_nodes/ComfyUI-Index-TTS/TTS2_5_download.py

Where people get burned

The biggest trap is reference quality, and it's the model's fault, not the node's. Loud, dry, expressive clips clone well; quiet, slow, heavily reverbed samples give flat, muffled results - the community reports this across every IndexTTS wrapper. If your clone sounds dead, fix the reference before you touch sampling params.

Also: the .pt voices this pipeline produces are 2.5-specific - the format and version are checked on every load. Don't try to feed it a voice file saved from the 2.0 pipeline; the error message will say so plainly. Re-extract from a 2.5 reference instead.

Categoryaudio/IndexTTS 2.5/voice

Inputs (1)

NameTypeDefaultDescription
reference_audioAUDIO

Outputs (1)

NameTypeDescription
voiceINDEXTTS25_VOICE