IndexTTS2 Simple
Drop a voice clip, type text, get speech
- audio
- emotion_audio
- emotion_vector
- AUDIO
- STRING
IndexTTS2 Simple is the reason this whole pack exists. You hand it a few seconds of somebody speaking, type a line of text, and it hands back speech in that voice - plus, if you want, an emotion layered on top. It's the node you'll wire up first and probably never replace, because everything else in the pack either feeds this node or saves what it produces. If you've used any of the other voice-cloning tools in Comfy, this is the same idea with fewer moving parts: no API, no key, no ElevenLabs bill. It all runs locally.
How it works
The node is a thin wrapper around the upstream IndexTTS2 inference code, vendored straight into the pack so behavior stays matched with the original repo. When you hit run, it dumps your reference clip to a temp WAV, loads the model (a GPT-style autoregressive codec plus the BigVGAN vocoder and a CAMPPlus speaker embedding - the usual voice-cloning stack), synthesizes, and returns 22.05kHz mono audio. First run is slow because the model loads; after that it's cached in memory and stays put.
The inputs that matter
The three required inputs are the whole job:
- audio - your speaker reference. A few seconds of clear, loud, dynamic speech (a podcast clip, a YouTube take) beats a quiet mumble every time.
- text - the line to speak, multiline. Watch the apostrophes: the model chokes on them, so write "dont" and "its" rather than "don't" and "it's".
- emotion_control_weight - 0 to 1, how hard any emotion input pushes on the result. Default 1.
The optional inputs are where it gets interesting. emotion_audio takes a second clip and clones its emotion onto your speaker's voice; emotion_vector does the same thing with an 8-value vector from the pack's Emotion Vector or Emotion From Text nodes (feed both and the vector wins). use_fp16 is off by default and honestly should stay off - the community's testing found FP16 adds audible artifacts. output_gain (0–4) is your volume knob; anything past 1.0 gets clipped back into range so it can't explode.
Outputs
You get two: an AUDIO tensor and a status STRING. The AUDIO feeds straight into the pack's Save Audio node (or Comfy's own PreviewAudio); the STRING tells you what precision ran, where the emotion came from, and what gain was applied - handy when something sounds off and you want to know which path it took.
Install
The standard two ways. Via ComfyUI Manager, search "IndexTTS2" and install. Or by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/snicolast/ComfyUI-IndexTTS2
Then, inside your ComfyUI Python environment:
pip install wetext
pip install -r requirements.txt
That requirements list is a doozy - librosa, numba, opencv, pandas, even keras - so give it a minute. The actual model is a separate step: make a checkpoints/ folder in the pack's directory and copy the IndexTTS-2 release from HuggingFace, or just let it auto-cache from HF on first run. The author tested on Windows only, so treat Linux/macOS as experimental.
Common issues
- "Config file not found" - you forgot the
checkpoints/config.yamlstep above. That error literally means the model isn't where the node expects it. - "Module wetext missing" - the README calls this out explicitly; run the pip install above.
- Quiet, warbly output - leave FP16 off and raise
output_gaina bit; that was the exact fix the early testers landed on. - Bad cloning - look at your reference clip before blaming the node. Loud, dynamic input gives good results; slow, quiet samples come out flat.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| audio | AUDIO | — | |
| text | STRING | — | |
| emotion_control_weight | FLOAT | 1.000–1 | — |
| emotion_audioopt | AUDIO | — | |
| emotion_vectoropt | EMOTION_VECTOR | — | |
| use_fp16opt | BOOLEAN | false | — |
| output_gainopt | FLOAT | 1.000–4 | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| AUDIO | AUDIO | — |
| STRING | STRING | — |