IndexTTS 2.5 多角色 / SRT 生成 · T8star-Aix
Dialogue, SRT slots, and auto-ASR in one node
- model
- role_library
- dialogue_script
- sampling
- 合并音频
- 逐句音频
- 生成报告 JSON
- 自动回写 SRT
- 可视化时间轴 JSON
This is the workhorse of the whole multi-role flow. It takes the model, a role library (your cast), and a dialogue script (your lines), then synthesizes every line with the right voice, mixes them into one standard AUDIO, and - if you ask - writes you a finished SRT at the same time. If you're building character dialogue, an audiobook, or subtitled video voiceover, this node is where the actual work happens.
How it works
It iterates the script line by line: each line resolves its role, looks up that role's reference audio and emotion in the library, and runs a full IndexTTS inference for that utterance. Outputs are the 合并音频 (mixed master), 逐句音频 (a list of per-line clips, so you can inspect or re-mix individual takes), 生成报告 JSON, plus 自动回写 SRT and 可视化时间轴 JSON when subtitle stuff is enabled.
The inputs that shape it
- timeline_policy -
shift(default) delays any colliding line so nothing overlaps;overlaykeeps the original SRT start times and safely mixes the overlap. For timed subtitles you usually wantoverlay; for plain narrationshift. - fit_srt_slots / slot_duration_mode - the SRT-fit feature. With slots on, each line tries to land inside its subtitle's time window:
native(recommended) allocates target frames to the length regulator in a single inference;naturalre-runs with a fitted factor;pad/exactpad or trim to the slot.exactcan cut tail consonants, so it's for hard slots only. - batch_gap_ms - silence inserted between lines (200 default).
- postprocess_preset / strength - the same voice-cleanup presets as the standalone post-process node, applied to the mixed master.
- ASR block -
asr_enabledplus backend/model/device/threshold: each line gets transcribed after synthesis and compared against the script. This is the quality gate that catches "it said the wrong thing" per line, automatically.
Subtitle outputs, briefly
subtitle_timing_mode (actual vs original) picks whether SRT times come from the real generated audio or the script's original timestamps. subtitle_text_mode decides what text lands in the SRT: asr_passed (default) replaces a line only when ASR similarity clears the threshold, asr_all replaces everything recognized, original keeps your script text. subtitle_include_role prepends the role name. It's a lot of knobs, but the defaults - actual timing, asr_passed text - are the sane ones: real timestamps, corrected text only when the ASR is confident.
Where people get burned
- Missing roles - the node validates that every role in the script has a connected voice before queuing. Read that message; it names the role.
- ASR needs a separate install. The ASR extras (
openai-whisper/faster-whisper, plusopencc-python-reimplemented) are optional and don't come with the pack. Without them,asr_enablederrors with a clear "backend not available" message. Install with ComfyUI's own Python:
python -m pip install "openai-whisper>=20250625" "opencc-python-reimplemented>=0.1.7"
- The
fit_srt_slotstrap. Target durations that fight natural pacing degrade naturalness - the README says it plainly: "目标时长与自然语速差异过大时仍可能降低自然度." Don't force every line into a slot; reserveexactfor subtitle hard slots where the video demands it. - transformers must stay
<5- same pack-wide rule, and it's the first thing to check on any cryptic failure here.
Installation
Same as the whole pack: ComfyUI Manager (IndexTTS 2.5 · T8star-Aix), or clone the repo and install requirements with ComfyUI's Python. Weights go in ComfyUI/models/TTS/IndexTTS-2.5. The node itself adds nothing beyond the pack's standard deps - except the ASR extras above, if you enable that path.
Inputs (20)
| Name | Type | Default | Description |
|---|---|---|---|
| model | T8_INDEXTTS25_MODEL | — | |
| role_library | T8_INDEXTTS25_ROLE_LIBRARY | — | |
| dialogue_script | T8_INDEXTTS25_DIALOGUE_SCRIPT | — | |
| seed | INT | 00–18446744073709550000 | — |
| timeline_policy | COMBO | shift | shift 顺延避免重叠;overlay 保留 SRT 起点并安全混音。 |
| fit_srt_slots | BOOLEAN | false | 仅 SRT 有效;native 单次控制,其他模式保留兼容回退。 |
| slot_duration_mode | COMBO | native | native 原生单次控制(推荐);natural 二次适配;pad/exact 为兼容收尾。 |
| fit_tolerance_ms | INT | 1800–2000 | — |
| batch_gap_ms | INT | 2000–5000 | — |
| postprocess_preset | COMBO | off | 6 options: off, voice_clarity, clear_narration, deharsh, warm, normalize |
| postprocess_strength | FLOAT | 1.000–1 | — |
| asr_enabled | BOOLEAN | false | — |
| asr_backend | COMBO | auto | 3 options: auto, openai_whisper, faster_whisper |
| asr_model | COMBO | base | 5 options: tiny, base, small, medium, turbo |
| asr_device | COMBO | auto | 3 options: auto, cuda, cpu |
| asr_threshold | FLOAT | 0.820–1 | — |
| subtitle_timing_mode | COMBO | actual | 2 options: actual, original |
| subtitle_text_mode | COMBO | asr_passed | 3 options: asr_passed, asr_all, original |
| subtitle_include_role | BOOLEAN | true | — |
| samplingopt | T8_INDEXTTS25_SAMPLING | — |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| 合并音频 | AUDIO | — |
| 逐句音频 | AUDIO | — |
| 生成报告 JSON | STRING | — |
| 自动回写 SRT | STRING | — |
| 可视化时间轴 JSON | STRING | — |