IndexTTS Model Loader
The node that grabs a multi-gig TTS by the throat
- start
- indextts_model
This is the node that makes the rest of the pack possible. IndexTTS Model Loader downloads every piece of the IndexTTS-2 model into ComfyUI/models/IndexTTS-2/ - with a Hugging Face or ModelScope mirror - loads it, and hands you a single indextts_model handle to feed the Generate nodes. No terminal gymnastics, no hunting through HF pages for six different files. That's the whole job, and it's a genuinely useful one: IndexTTS-2 isn't one checkpoint, it's a stack.
For context, IndexTTS-2 is a zero-shot text-to-speech model from IndexTeam that's become the open go-to when you want a cloned voice and control over emotion - better than F5-TTS for quality, roughly Chatterbox-comparable for English, with the bonus of per-line emotion control. The community runs it at around 12GB VRAM (fp16), and it's a purely En/Cn model. This pack by yolain - the maintainer of the big ComfyUI-Yolain-Workflows collection - is a fork of chenpipi0807's ComfyUI-Index-TTS that rebuilds the nodes on ComfyUI's newer v3 API and adds the one-click download.
How it works
The node reads a config.yaml that lists every component of the model: the IndexTTS-2 base (gpt.pth, s2mel.pth, bpe.model, feats, config), the MaskGCT semantic codec, the campplus speaker embed (campplus_cn_common.bin), facebook's w2v-bert-2.0, and the BigVGAN vocoder. For each piece it checks whether the files already exist in ComfyUI/models/IndexTTS-2/; whatever's missing it pulls down with snapshot_download from your chosen mirror, then it constructs the inference engine and returns it. It's smart about resuming - already-downloaded files are left alone, which you'll appreciate after the first multi-GB pull dies halfway.
Inputs and outputs
The only three inputs are the ones you'd expect:
- model - a dropdown, currently just
IndexTTS-2. - download_from -
huggingfaceormodelscope. Pick ModelScope if HF is throttled or unreachable from your region; the download is the same model, different mirror. - start - a
*-typed trigger input. Wire anything into it (or just run the workflow) to kick off the download-and-load. It exists so you can gate loading on something else in the graph.
The single output, indextts_model, is what you plug into IndexTTS Generate or IndexTTS Generate Simple. Nothing else in the pack works until this node has run at least once.
Installing the pack
The pack is a custom node like any other. Through ComfyUI Manager, search "Easy IndexTTS2" and install, or clone it by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/yolain/ComfyUI-Easy-IndexTTS2
cd ComfyUI-Easy-IndexTTS2
..\..\..\python_embeded\python.exe -m pip install -r requirements.txt
Restart ComfyUI afterwards. One thing the README is upfront about: the nodes use the ComfyUI v3 extension paradigm, so if the pack fails to load, update ComfyUI before you touch anything else. The requirements.txt pulls in the usual audio suspects - librosa, soundfile, omegaconf, transformers>=4.50, torchaudio, modelscope - plus pynini and WeTextProcessing on non-Windows systems, which are the classic build-headache pair (they need a working C++ toolchain on Linux; on Windows they're skipped).
Where people get burned
- First run downloads a lot. The full stack is several GB - budget for it. It's a one-time cost, and the loader resumes partial downloads.
- Model location matters. Everything goes to
ComfyUI/models/IndexTTS-2/. If you previously used the original chenpipi0807 pack or the official repo, point this pack at the same folder (or symlink it) and you'll skip the re-download entirely. - It's heavy, and it stays loaded. This node pins a chunk of VRAM while the engine lives. When you're done, tick
unload_modelon the Generate node (or run a fresh workflow) to free it - it's not a background process, it's a loaded model. - Missing-file errors after a partial/cancelled download: the loader validates required files before building the engine, so the fix is to just run it again and let it fetch what's missing.
The nice part: once it's run, it's run. Every workflow after that just reuses the cached files, and the download node becomes your regular "load the model" step.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| model | COMBO | 1 options: IndexTTS-2 | |
| download_from | COMBO | huggingface | 2 options: huggingface, modelscope |
| startopt | * | Start to load or download models |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| indextts_model | EASY_INDEXTTS_MODEL | — |