Model or dataset
chenpipi0807/ComfyUI-Index-TTS avatar
chenpipi0807/ComfyUI-Index-TTS

ComfyUI-Index-TTS: IndexTTS 2.5 voice cloning as ComfyUI nodes

使用IndexTTS模型在ComfyUI中实现高质量文本到语音转换的自定义节点。支持中文和英文文本,可以基于参考音频复刻声音特征。

771 stars73 forksPythonLicense varies

At a glance

What is it?
ComfyUI-Index-TTS wraps the IndexTTS models in ComfyUI custom nodes, so text to speech with reference audio voice cloning, speed control, pronunciation annotation and emotion control can be assembled in a node graph. It is a second development of an existing project, and its model directory is the real installation.
Who is it for?
Adopt ComfyUI-Index-TTS if you already run ComfyUI and want IndexTTS 2.5 speech, including cross language cloning, available as nodes in the same graph as the rest of your pipeline. Do not adopt it as a general purpose Python library, since the packaging points at a LICENSE file that the repository root listing does not contain and the dependency files disagree with each other on the pynini version.
Can I use it commercially?
Not without permission. GitHub finds no licence file in the repository, and without a licence all rights are reserved by default: you may read the code but not reuse it. Check the README, or ask the authors, before using it.
Is it still maintained?
Yes. The repository last received commits 53 days ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 24, 2026, and from our analysis. They are not legal advice.

Editorial analysis

The problem is voice cloning that has to fit inside a node graph

ComfyUI-Index-TTS is a set of custom nodes that bring the IndexTTS text to speech models into ComfyUI, so the same graph can hold speech generation next to other generation steps. The repository description is in Chinese and says the project implements high quality text to speech with the IndexTTS model inside ComfyUI, supports Chinese and English text, and can reproduce voice characteristics from a reference audio clip.

The audience is ComfyUI users who already have that workflow in mind, plus developers of pipelines that need narration or dialogue generated rather than recorded. The hard part of IndexTTS is not the interface, it is that the model weights are large, spread across several upstream repositories, and have to be placed in a specific directory layout before anything will run. This project takes that placement problem on, provides a download script, and splits the functionality into small nodes so a workflow can use only the parts it needs.

The project states plainly that it is a second development of an open source project from Bilibili, with the ComfyUI implementation, some optimisation and adjustment, and additional advanced features written by the author. The project notes also carry a disclaimer restricting the project to study and exchange inside the open source community and prohibiting illegal use and copyright infringement.

Two model generations, ten nodes and two workflow files

The node surface is the clearest way to understand the project. IndexTTS 2.5 arrived with five nodes in the audio category. Index TTS 2.5 - Base handles synthesis, language selection, speed control and pronunciation annotation. Index TTS 2.5 - Emotion Audio takes an emotion reference audio, and separates timbre from emotion. Index TTS 2.5 - Emotion Vector exposes an eight dimension emotion vector as sliders. Index TTS 2.5 - Emotion Text takes an emotion description, and can analyse the main text automatically when left empty. Index TTS 2.5 - Cache Control manages video memory and cache.

IndexTTS 2 support sits alongside it as four nodes: Index TTS 2 - Base, Index TTS 2 - Emotion Audio, Index TTS 2 - Emotion Vector and Index TTS 2 - Emotion Text. The project says the two sets do not interfere with each other and can coexist, because the model directories are separate, IndexTTS-2.5 against IndexTTS-2, so both node families can sit in one workflow.

Two workflow files ship with the project, workflow/TTS2.5.json and workflow/TTS2.json, and the project says the base workflow has been updated and can be dragged straight onto the ComfyUI page to import. The source tree matches that structure, with separate Python modules for the 2.5 nodes, the 2.0 nodes, the cache nodes, the emotion vector node, a timbre audio loader and a novel text parser.

The model directory is the installation, and the script fills it

There is no pip install step to worry about here. The installation is a set of model directories under ComfyUI/models/IndexTTS-2.5, and the documentation is very specific about what goes where. The base model directory holds gpt.pth as the main model at roughly 3.3GB, codec.pth as the unified semantic codec new in 2.5, s2mel.pth, config.yaml, feat1.pt, feat2.pt, wav2vec2bert_stats.pt and the multilingual tiktoken tokenizer that replaced the older bpe.model. The qwen emotion model goes in its own qwen0.6bemo4-merge subdirectory and is only needed by the Emotion Text node. The CampPlus speaker embedding, the facebook/w2v-bert-2.0 feature extractor and the BigVGAN vocoder each get their own place.

The project calls the download script the one click option, and it lives inside the custom node folder. It behaves like the earlier TTS2 script, supports resuming an interrupted download, and offers a domestic mirror.

bash
python .\ComfyUI\custom_nodes\ComfyUI-Index-TTS\TTS2_5_download.py

Run it, and it asks whether to use the mirror, where 2 selects the domestic mirror as the default and 1 selects the official source. If the mirror setting does not take effect, the project says you can set the HF endpoint in the console first. A reference directory layout, with the bigvgan, qwen0.6bemo4-merge and w2v-bert-2.0 subdirectories beside the base files, is also written out in the repository as a plain text file describing the 2.5 model paths.

Wiring the first clip: LoadAudio, Base, SaveAudio

The usage sequence in the project documentation is short enough to follow from a screenshot. Start by loading a reference audio with the LoadAudio node, choosing a clean human voice between 3 and 15 seconds, or use the Timbre audio loader node to pick one of the voices bundled with the repository.

Then wire that into the Index TTS 2.5 - Base node, fill in the text, select the language, and set the speed if you want it. The speed control is a duration_factor between 0.5 and 2.0, where a value above 1 makes the speech slower and a value below 1 makes it faster. The language options are ZH, EN, JA, ES and AR, or a mixed ZH and EN setting. Finally the output goes to SaveAudio or PreviewAudio, and you should hear the generated clip in the ComfyUI preview.

Two details are worth planning for. The project says the Emotion Text node loads an extra small Qwen emotion model on first use, which takes about 1.2GB of video memory, and that the other nodes do not need it. And the 2.0 section of the project notes says there will be some bugs and asks for feedback, with feature suggestions welcome, which is an unusual thing to find stated plainly in the project notes and is a fair signal about how much polish to expect from the node behaviour.

Pronunciation is written into the text with inline annotations

The pronunciation control in 2.5 works by writing the correction directly in the text, which is unusual enough to be worth understanding before you plan a workflow. For Chinese, the annotation marks a polyphonic character and gives the reading, for example a line where the character for a bank or a row of a shop is annotated twice with different pinyin values. For English, the annotation carries CMU phonemes, so a word can be given one reading and then another in a later sentence. For Japanese, the annotation uses kana inside angle brackets.

The project documentation attributes the improvement in 2.5 to stronger adherence to those annotations. The dependencies back this up, since the requirements file adds cn2an for Chinese number normalisation, jieba for Chinese word segmentation, g2p-en for English grapheme to phoneme conversion using CMU data, and fugashi together with unidic-lite for Japanese segmentation and G2P, and tiktoken for the multilingual tokenizer. The pattern is worth noticing: pronunciation support is not a small feature, it is a stack of text normalisation tools, which is why a ComfyUI node that exposes it as inline text is more useful than a checkbox.

Emotion has three entry points and one of them costs extra video memory

The 2.5 line keeps the full emotion control that 2.0 had, and the documentation describes three mutually exclusive ways to drive it. The first is an emotion reference audio, using the Emotion Audio node with an emotion_weight between 0 and 1 to set the strength, which decouples timbre from emotion so the voice sounds like the reference clip while the feeling comes from elsewhere. The second is the Emotion Vector node, which gives eight sliders for happiness, anger, sadness, fear, disgust, low mood, surprise and calm, for cases where you want a specific mix. The third is the Emotion Text node, where you write a short description of the feeling, with a suggested emotion_weight of about 0.6, and leaving the field empty makes the node analyse the emotion of the main text automatically.

The automatic path is the one with a cost, and the project says so: it needs the qwen0.6bemo4-merge model and roughly 1.2GB of video memory on first use, and the requirements file adds accelerate specifically for the Qwen model device_map handling. If your GPU is tight, the vector node is the cheapest way to get predictable emotion, because it needs no second model at all.

The project also states that 2.5 inference runs in bf16 and is about 1.6 times faster than 2.0, which is a claim in the project documentation rather than a measurement, so treat it as a direction of travel rather than a guarantee for your own hardware.

The dependency files disagree, and the licence is the bigger question

Two packaging files ship with the project and they are not aligned. pyproject.toml lists pynini pinned to 2.1.5, while requirements.txt pins the same package to 2.1.6. The librosa floor is 0.8.0 in pyproject and 0.10.0 in requirements, and the audio tooling appears twice, once as a git dependency on descriptinc/audiotools at 0.7.4 and once as descript-audiotools 0.7.2. Both files exclude pynini and WeTextProcessing on Windows through a platform_system marker, so a Windows install silently runs without the text normalisation backend that the pronunciation annotations depend on. Whether the two pinned pynini versions are interchangeable is not something the project settles, and it does not say which file to trust.

The licence question is sharper. The repository listing shows no LICENSE file at the top level, and the license field in pyproject.toml points to a file named LICENSE. So the declared licence cannot be read from the repository, and the project itself is listed with an unknown licence. That is a practical problem for anyone who intends to redistribute a workflow, package the nodes or build on the code, and it is worth raising with the author rather than assuming permissiveness from the surrounding ecosystem.

The disclaimer in the project notes adds the second half of the risk picture. The project prohibits illegal use and anything that infringes copyright, and states that the developer accepts no responsibility for user behaviour. Voice cloning from a reference audio is exactly the technique that makes that disclaimer load bearing, so anyone deploying it should decide in advance whose voice may be cloned and keep that decision outside the model.

A node in a graph, a script on a command line, or a hosted API

There are two other ways to get the same kind of speech, and they differ in what they cost you. The first is to use the IndexTTS models from a plain Python script instead of through ComfyUI. The difference in approach is the shape of the work: a script gives you direct control over the model objects, the sampling parameters and the output files, and it avoids the ComfyUI dependency stack entirely, including the version conflicts in the requirements file and the Windows exclusions. What you give up is the graph, so the speech step cannot be chained into a larger pipeline or reproduced by loading a saved workflow file.

The second is a hosted text to speech service. The difference there is where the model runs and where the audio goes. Nothing is downloaded, no model directory has to be laid out, and there is no local GPU to buy, but reference audio leaves your machine and the voice cloning control you would have is not the same feature.

On maintenance, the repository is not archived, the last push was on 2026-09-02, and it has no GitHub releases, so there is no versioned artefact to pin and no changelog to read before an update. The project records that IndexTTS 2.5 support was added on 2026-08-15 with five new nodes and an updated base workflow, which is the kind of entry that would be easier to trust if it sat in a release history rather than in a section of the project notes.

Editorial conclusion

Adopt ComfyUI-Index-TTS if you already run ComfyUI and want IndexTTS 2.5 speech, including cross language cloning, available as nodes in the same graph as the rest of your pipeline. Do not adopt it as a general purpose Python library, since the packaging points at a LICENSE file that the repository root listing does not contain and the dependency files disagree with each other on the pynini version. Before you build a workflow on it, download the models with TTS2_5_download.py, check the version you end up with against the IndexTTS-2.5 model pages, and expect the project itself to keep changing, since the last push was on 2026-09-02 and the project notes already ask for bug reports.

Frequently asked questions

What does ComfyUI-Index-TTS add to ComfyUI?

It adds custom nodes that run the IndexTTS text to speech models, including the Index TTS 2.5 - Base node for synthesis with language selection, speed control and pronunciation annotation, plus separate nodes for emotion audio, emotion vector, emotion text and cache control. IndexTTS 2.0 is supported as four more nodes that can coexist with the 2.5 set.

Where do I put the IndexTTS-2.5 models for ComfyUI-Index-TTS?

The README says everything goes under the ComfyUI/models/IndexTTS-2.5 directory: gpt.pth as the main model at roughly 3.3GB, codec.pth, s2mel.pth, config.yaml, feat1.pt, feat2.pt, wav2vec2bert_stats.pt and the multilingual tiktoken tokenizer, with the qwen0.6bemo4-merge emotion model, the CampPlus speaker embedding, the w2v-bert-2.0 folder and the bigvgan folder as separate subdirectories.

How do I download the models for ComfyUI-Index-TTS?

The README calls python .\ComfyUI\custom_nodes\ComfyUI-Index-TTS\TTS2_5_download.py the one click option. It supports resuming an interrupted download and lets you pick the domestic mirror, where 2 selects the mirror by default and 1 selects the official source.

How do I control emotion and pronunciation in the Index TTS 2.5 nodes?

Emotion is driven one of three ways: an emotion reference audio with emotion_weight between 0 and 1, an eight slider emotion vector, or an emotion description in the Emotion Text node, which needs the Qwen emotion model and about 1.2GB of video memory. Pronunciation is annotated inline in the text with pinyin for Chinese, CMU phonemes for English and kana for Japanese.

What licence does ComfyUI-Index-TTS use?

The licence is not stated. The pyproject.toml declares a license file, but the repository root listing does not contain a LICENSE file, and the project is listed with an unknown licence. Anyone planning to redistribute or build on the code should confirm the terms with the author.

Official sources

  1. chenpipi0807/ComfyUI-Index-TTS on GitHub
  2. Issues
  3. README
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/chenpipi0807-comfyui-index-tts.svg)](https://hysenlabs.com/projects/chenpipi0807-comfyui-index-tts)

Was this useful?