Nodes/TTS Audio Suite/๐Ÿ“บ TTS SRT
ComfyUI Node

๐Ÿ“บ TTS SRT

Turn a subtitle file into timing-matched speech

By diodiogodยทCreated 12 months agoยทUpdated 18 days agoยท 1,098
๐Ÿ“บ TTS SRT
  • TTS_engine
  • opt_narrator
  • audio
  • generation_info
  • timing_report
  • Adjusted_SRT
โ—„srt_content1 00:00:01,000 --> 00:00:04,000 Hello! This is unified SRT TTS with character switching. 2 00:00:04,500 --> 00:00:09,500 [Alice] Hi there! I'm Alice speaking with precise timing. 3 00:00:10,000 --> 00:00:14,000 [Bob] And I'm Bob! The audio matches these exact SRT timings.โ–บ
โ—„narrator_voicenoneโ–บ
โ—„seed1โ–บ
โ—„timing_modesmart_naturalโ–บ
โ—„enable_audio_cachetrueโ–บ
โ—„fade_for_StretchToFit0.010โ–บ
โ—„max_stretch_ratio1.0โ–บ
โ—„min_stretch_ratio0.5โ–บ
โ—„timing_tolerance2.0โ–บ
โ—„batch_size0โ–บ
โ—„use_native_duration_targetingfalseโ–บ

This is the node you reach for when the audio has to land on the subtitles, not just near them. Feed it an SRT file and a voice, and it generates speech that fits each cue's start and end time - dubbing a video, narrating to an existing timeline, making a voiceover that hits its marks. If you just want to read a block of text aloud with no timing constraints, its sibling ๐ŸŽค TTS Text is the simpler pick. TTS SRT is the one that cares about the clock.

The important thing to understand up front: this node doesn't contain a voice model. It's a consumer. You wire an engine node (VibeVoice, Higgs Audio, ChatterBox, F5-TTS, Qwen3-TTS, whatever) into its TTS_engine input, and TTS SRT drives that engine cue by cue. Same node, any engine - that's the whole "unified" idea of the suite.

How it works

You give it srt_content - literally the text of a .srt file, timestamps and all. The node parses each subtitle block, generates that line through your chosen engine, then reconciles the generated length against the cue's allotted window. That reconciliation is the timing_mode, and it's the setting that actually changes your results:

  • smart_natural (the default) shifts timing intelligently to avoid overlaps while keeping speech sounding natural. Start here.
  • stretch_to_fit time-stretches audio to exactly match each cue. Precise, but push it too far and voices get chipmunky or draggy.
  • pad_with_silence generates naturally and pads gaps with silence.
  • concatenate ignores the timestamps and just plays the lines back to back.

Character and language switching work inside the SRT text too - drop [Alice] or [de:Bob] into a cue and it switches voice or language for that line, same syntax as the rest of the suite.

The inputs and outputs that matter

  • TTS_engine - required. This is the engine node's output. Nothing happens without it.
  • srt_content - your subtitles as text. The default shows the expected format, including [Alice]/[Bob] character tags.
  • narrator_voice - the default voice, picked from the bundled voices_examples/ list (Attenborough, Eastwood, male/female refs, and more). Or leave it none and drive the voice from an engine that clones.
  • timing_mode and seed round out the required set.

For fine control there's max_stretch_ratio / min_stretch_ratio (caps on how far stretch_to_fit will warp), timing_tolerance, enable_audio_cache (leave it on - it only regenerates cues you changed), and use_native_duration_targeting for engines like OmniVoice that can aim for a duration at generation time.

Four outputs. audio is the finished track - wire it to a Preview/Save Audio node. Adjusted_SRT is the gold one people miss: an SRT with the actual generated timings, so your subtitles and audio stay in sync downstream. generation_info and timing_report are text diagnostics - read timing_report when a cue sounds rushed and it'll tell you which lines it had to stretch.

Installing it

It ships with the whole pack. Via ComfyUI Manager, search "TTS Audio Suite", install, restart. Manually:

cd ComfyUI/custom_nodes
git clone https://github.com/diodiogod/TTS-Audio-Suite.git
cd TTS-Audio-Suite
python install.py

Run install.py in your ComfyUI's own Python env, then restart. The engine models download themselves on first use.

Common issues & troubleshooting

"Nothing generates." You almost certainly forgot the TTS_engine connection, or it's connected but that engine's model hasn't finished its first-run download. Check the console.

Every line sounds sped-up or slowed-down. That's stretch_to_fit fighting cues that are too short for the words. Widen min_stretch_ratio/max_stretch_ratio to give it room, or switch to smart_natural and let it shift timing instead of warping pitch. Genuinely tight cues just need shorter text.

Voices drift or cut off on long scripts. Timing quality is inherited from the engine you plugged in - a long-form engine like VibeVoice handles extended SRTs better than a short-context one. Check timing_report to see where it struggled.

CategoryTTS Audio Suite/๐ŸŽค Text to Speech

Inputs (13)

NameTypeDefaultDescription
TTS_engineTTS_ENGINETTS engine configuration from ChatterBox Engine or F5 TTS Engine nodes
srt_contentSTRING1 00:00:01,000 --> 00:00:04,000 Hello! This is unified SRT TTS with character switching. 2 00:00:04,500 --> 00:00:09,500 [Alice] Hi there! I'm Alice speaking with precise timing. 3 00:00:10,000 --> 00:00:14,000 [Bob] And I'm Bob! The audio matches these exact SRT timings.The SRT subtitle content. Each entry defines a text segment and its precise start and end times. Supports character switching with [Character] tags.
narrator_voiceCOMBOnoneFallback narrator voice from voice folders. Used when opt_narrator is not connected. Select 'none' for engines that support direct TTS without voice cloning, such as MOSS.
seedINT10โ€“4294967295Seed for reproducible TTS generation. Same seed with same inputs will produce identical results. Set to 0 for random generation.
timing_modeCOMBOsmart_naturalDetermines how audio segments are aligned with SRT timings: ๐Ÿ”น stretch_to_fit: Stretches/compresses audio to exactly match SRT segment durations. ๐Ÿ”น pad_with_silence: Places natural audio at SRT start times, padding gaps with silence. May result in overlaps. ๐Ÿ”น smart_natural: Intelligently adjusts timings within 'timing_tolerance', prioritizing natural audio and shifting subsequent segments. Applies stretch/shrink within limits if needed. ๐Ÿ”น concatenate: Ignores original SRT timings, concatenates audio naturally and generates new SRT with actual timings.
opt_narratoropt*Voice reference: Connect Character Voices node output OR direct audio input. Takes priority over narrator_voice dropdown when connected.
enable_audio_cacheoptBOOLEANtrueIf enabled, generated audio segments will be cached in memory to speed up subsequent runs with identical parameters.
fade_for_StretchToFitoptFLOAT0.0100โ€“0.1Duration (in seconds) for crossfading between audio segments in 'stretch_to_fit' mode.
max_stretch_ratiooptFLOAT1.00.5โ€“5Maximum factor to slow down audio in 'smart_natural' mode. (e.g., 2.0x means audio can be twice as long). Recommend leaving at 1.0 for natural speech preservation and silence addition.
min_stretch_ratiooptFLOAT0.50.1โ€“2Minimum factor to speed up audio in 'smart_natural' mode. (e.g., 0.5x means audio can be half as long). min=faster speech
timing_toleranceoptFLOAT2.00.5โ€“10Maximum allowed deviation (in seconds) for timing adjustments in 'smart_natural' mode. Higher values allow more flexibility.
batch_sizeoptINT00โ€“32Parallel processing workers. 0 = sequential (recommended), 2+ = streaming mode. Note: Streaming often slower than sequential mode. F5-TTS doesn't support streaming yet.
use_native_duration_targetingoptBOOLEANfalseWhen enabled, supported engines like OmniVoice use the model's native duration parameter for each subtitle during generation. This helps the model aim closer to the subtitle length before the suite applies final timing adjustment, which can reduce stretching/compression and sound more natural.

Outputs (4)

NameTypeDescription
audioAUDIOโ€”
generation_infoSTRINGโ€”
timing_reportSTRINGโ€”
Adjusted_SRTSTRINGโ€”