IndexTTS 停顿修复
Don't regenerate the whole take — surgically fix one pause
- audio
- wav_path
- log
Here's the production scenario: the batch ran, you auditioned the candidates in IndexTTSListen, and the take you like has one pause that's off - 500ms where you wanted 200ms, or a pause that shouldn't be there at all. The impatient move is to re-roll the whole segment and hope. The right move is IndexTTSFix: it edits the pauses on the existing wav, no regeneration, no new seed roulette. Because the pack edits silence directly in the waveform, fixing a pause is the same surgery the generation already does - it just aims at a file you've already approved instead of a fresh inference.
The inputs
task/custom_task- which task directory, same dropdown-plus-manual pattern as IndexTTSListen. The batch node's output task_dir is where your wavs live.segment/custom_segment- which segment (remember:001is segment 1).round- which candidate take to fix (1–10, default 1). Fix the take you actually accepted, obviously.marks- the instruction string, comma-separated, two flavors:- By index:
2:800, 3:0- pause #2 → 800ms, pause #3 → delete it (0 means remove). The index refers to the numbered pause records the batch wrote into the manifest, so this only works for segments that had[pause:N]markers. - By time:
7.53:500- whatever pause sits at 7.53 seconds → 500ms. No manifest record needed; if a segment has no markers and you just want to lengthen the gap after a sentence, this is the form you use.
- By index:
out_suffix- default_fixed. The result isn't written over your approved file; it's saved alongside as001_2_fixed.wav, so you can compare and keep the original.
Outputs
audio - the edited wav as a standard ComfyUI AUDIO tensor, straight into PreviewAudio. wav_path - where the fixed file landed. log - a per-pause rundown: current ms → target ms, or "deleted", or a reason a pause was skipped (e.g., no silence to work with). That log is how you confirm the fix actually took.
The catch worth knowing
Fixing a pause is bounded by the same physics as generating one: you can extend or shorten an existing silence, and you can delete a pause, but you can't conjure one out of nothing - insertion needs a real silent gap, and the node would rather refuse than carve through speech. Also, in index mode, it looks up each mark's timestamp from the manifest; if the segment had no pause markers, there are no records to index against, and the error message steers you to the time-point form. That's the one non-obvious workflow rule: no markers in the text → use seconds, not indexes.
Where it sits
It's the precision tool at the end of the loop:
IndexTTSBatch → IndexTTSListen → IndexTTSFix → PreviewAudio
Run the batch, listen, accept a round, then fix only the take that's 95% there. Between this and rounds giving you candidates, you rarely have to regenerate anything - which matters, because every regeneration risks a new accent flub or a fresh breathing artifact. Installation is the pack standard: ComfyUI Manager search IndexTTS2-PauseControl, or clone https://github.com/lynx-gt/IndexTTS2-PauseControl into custom_nodes/, python install.py, download the IndexTTS2 weights to ComfyUI/models/index_tts/, restart.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| task | COMBO | 1 options: | |
| custom_task | STRING | — | |
| segment | COMBO | 1 options: 1 | |
| custom_segment | INT | 0 | — |
| round | INT | 11–10 | — |
| marks | STRING | — | |
| out_suffix | STRING | _fixed | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |
| wav_path | STRING | — |
| log | STRING | — |