Nodes/IndexTTS2-PauseControl/IndexTTS 单条生成
ComfyUI Node

IndexTTS 单条生成

The node that finally makes IndexTTS2 pause where you tell it to

By lynx-gt·Created about a month ago·Updated about a month ago· 4
IndexTTS 单条生成
  • model
  • audio
  • wav_path
  • used_seed
  • log
text测试一下。
spk_ref
emo_ref
seed-1
temperature0.60
top_p0.80
top_k20
num_beams4
do_sampletrue
repetition_penalty10.0
emo_alpha0.75
speaking_speed1.0
interval_silence400
pause_modefalse
detect_cfm_steps25
out_name

This is the node this whole pack exists for. IndexTTS2 is a genuinely good open TTS model - bilibili's clone, Chinese and English, at or near the top of the local pile - but its pauses are a dice roll: the same comma can be 200ms on one run and 500ms on the next, and you can't do a thing about it. That matters the moment your audio has to land on a beat or line up with captions. IndexTTSSingle is the single-line generation node with the fix bolted in: write [pause:800ms] in your text, and the pause lands at 800ms, measured average deviation around 13ms.

The input that changes everything

The one you came for is pause_mode, a boolean, off by default. Flip it on and [pause:N] markers become real. The syntax is forgiving:

他停下脚步[pause:800ms]深吸一口气[pause:200ms]然后推开了那扇门。

[pause:600ms], [pause:600], [pause:1.5s] all work, and [wait:]/[stop:] prefixes are accepted too. Stick to the recommended 150ms–5s range and you're fine. The marker is stripped and replaced with a comma before the model sees it, so the audio never reads "pause" out loud - with one exception, and it's the classic trap: if pause_mode is off, the marker is not handled at all and the model will literally speak "pause 800ms". Off is the old behavior, kept for compatibility. If you hear a pause being read as a word, that's your diagnosis.

The mechanism, briefly

This is the clever part. Rather than re-running the model per marker, the node generates once and then edits the waveform directly: it detects where the actual silences are using an energy analysis of the signal (no recognition model involved), globally aligns your markers to those pauses, and then only extends, shortens, or inserts the silent core of each pause. Speech is never touched, nothing is re-decoded. It's precise because it's surgery on the silence, not on the voice. (There's a legacy whisper-based post-processing path in the batch node; on this node, pause_mode handles everything in one pass.)

The other inputs that matter

  • spk_ref - path to your voice reference audio. This is how IndexTTS2 clones a voice: a short clip of who should be speaking. Relative paths resolve against ComfyUI/input/references, absolute paths work as-is. This is the first thing you'll change on a downloaded workflow.
  • text - the line to speak. Multi-line.
  • seed - set it and the run is reproducible; leave at -1 and the actual seed is written out in the used_seed output so you can pin a good take afterward.
  • interval_silence - default 400ms, and the author changed it from the official 200ms on purpose: at 200ms, periods paused less than comma pauses (an inverted rhythm that sounds wrong). 400ms reads as natural. Prefer it for the default beat, then override individual periods with markers.

The rest - temperature, top_p, top_k, num_beams, do_sample, repetition_penalty, emo_alpha, speaking_speed, emo_ref - are IndexTTS2's sampling controls with sane defaults (0.6 / 0.8 / 20 / 4 beams). detect_cfm_steps is a deprecated no-op kept for old workflows; ignore it. There's also out_name for naming the saved wav.

Outputs

You get four: audio (a standard ComfyUI AUDIO tensor - wire it into PreviewAudio to listen), wav_path (where it was saved, under ComfyUI/output/indextts/), used_seed (the actual seed used), and log.

Installing

Same as every node in this pack: Manager search IndexTTS2-PauseControl, or git clone https://github.com/lynx-gt/IndexTTS2-PauseControl into custom_nodes/, run python install.py, download the ~11.8GB IndexTTS2 weights to ComfyUI/models/index_tts/, restart. Don't pip install . - the package name collides with the official indextts inference package and would overwrite it.

When it misbehaves

  • A marker never fires - first check pause_mode is on, then consider the mechanics: insertion needs an actual silence to work with. If the model produced no pause and there's no silent gap, the node refuses rather than cutting through speech. Rewrite or change the seed.
  • Long single sentences (>40 chars) with several markers - some markers may miss their target because positions are estimated by character proportion. Change the seed, or generate rounds and pick.
  • A breath after a long pause - that's the model's natural prosody; this tool edits silence, not breathing. Denoise the segment if it bothers you.
  • English accent when cloning - a known IndexTTS2 base-model quirk people hit in the community, not something this pack causes or fixes.

If one line isn't enough - you have a whole script, a book, anything long-form - that's what IndexTTSBatch is for.

CategoryIndexTTS

Inputs (17)

NameTypeDefaultDescription
modelINDEXTTS_MODEL
textSTRING测试一下。
spk_refSTRING
emo_refSTRING
seedINT-1-1–9223372036854776000
temperatureFLOAT0.600.01–2
top_pFLOAT0.800.01–1
top_kINT200–200
num_beamsINT41–8
do_sampleBOOLEANtrue
repetition_penaltyFLOAT10.01–30
emo_alphaFLOAT0.750–1
speaking_speedFLOAT1.00.5–2
interval_silenceINT4000–2000段间插入静音(ms):每段结束到下一段开始的固定停顿
pause_modeBOOLEANfalse开启 [pause:N] 精确停顿控制(全波形:生成后检测停顿,静音核心延长/缩短/插入,免重解码)
detect_cfm_stepsINT2510–50已弃用(全波形版生成只跑一次 diffusion_steps,此参数无作用),保留兼容旧工作流
out_nameSTRING

Outputs (4)

NameTypeDescription
audioAUDIO
wav_pathSTRING
used_seedINT
logSTRING