๐บ Text to SRT Builder
Turn a transcript into a real subtitle file, with or without timing
- srt_options
- srt
- timestamps
- info
This is the node that actually produces the .srt. You give it text - a transcript, a script, whatever - and it emits properly formatted, properly timed subtitle cues. It's the final stage of TTS Audio Suite's modular subtitle pipeline, the part that owns subtitle construction after the transcribing and cleaning is done.
The clever bit is that it works two ways. Hand it timing data from an ASR pass and it builds subtitles that line up with the real audio. Leave the timing disconnected and it estimates timings from the text itself using the same readability rules - so you can turn a plain script into a plausible SRT with no audio at all. That flexibility is why it exists as its own node instead of being buried inside the transcriber.
How it works
The suite split its old monolithic subtitle flow into stages: ASR Transcribe (words + timing) โ optional ASR Punctuation / Truecase (clean the text) โ Text to SRT Builder (make the SRT). This separation lets you clean or rewrite the transcript text while keeping the original timings - edit the words, rebuild the subtitles, timings intact. The builder also preserves the suite's control tags (character, language, pause, inline-edit) so a subtitle file stays usable as TTS input, not just as captions.
The inputs and outputs that matter
text(STRING, required) - the words to turn into subtitles. From the punctuation node, from ASR, or typed directly.asr_timing_data(STRING, optional) - the timing from an ASR node. Connected: cues match the audio. Disconnected: the builder estimates timing from the text. This single choice is the node's whole personality - real timings vs. estimated.srt_options(SRT_OPTIONS, optional) - wire in an SRT Advanced Options node to control line length, reading speed, and splitting. Leave it off and the builder uses reasonable defaults; add it the moment you want subtitles shaped a particular way.
Outputs: srt (STRING) - the finished subtitle text, ready to save as a .srt file - plus timestamps (STRING) and info (STRING) for inspecting the timing and what the builder decided.
How to install it
Ships with TTS Audio Suite. ComfyUI Manager: search TTS Audio Suite, install, restart. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/diodiogod/TTS-Audio-Suite.git
cd TTS-Audio-Suite
python install.py
then restart. On Linux, install portaudio19-dev and libsamplerate0-dev first. The builder itself is text processing - no model download. If you're using it after ASR, the ASR engine (Qwen3-ASR or Granite) is what pulls model weights.
Common issues & troubleshooting
The timings don't match my audio. If asr_timing_data is disconnected, they can't - the builder is estimating from text length and reading speed, which is a guess, not a measurement. For audio-accurate subtitles you must feed real timing data from an ASR pass.
Subtitles read too fast / lines too long. Those are formatting choices, and they live in the SRT Advanced Options node, not here. Add one, set srt_max_cps and srt_max_chars_per_line, and wire it into srt_options.
My character/pause tags got stripped or broke the cues. They shouldn't - the builder is designed to preserve project control tags and keep tag-heavy SRT usable for TTS (control tags don't count toward readability limits). If a tag is misbehaving, check it's in the suite's expected [bracket] / <angle> form.
Text-only SRT looks lumpy. Estimation is only as good as your punctuation. Run the transcript through ASR Punctuation / Truecase first so the builder has clean sentence boundaries to split on.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| text | STRING | Text to use in the subtitle cues. Use the transcript directly, feed in cleaned text from a post-process node like ASR Punctuation / Truecase, or write plain text and let the builder estimate timings. | |
| asr_timing_dataopt | STRING | Optional ASR timing JSON. Connect it from โ๏ธ ASR Transcribe or paste a saved JSON blob here. When omitted, the builder estimates subtitle timings from the text using the SRT options. | |
| srt_optionsopt | SRT_OPTIONS | Optional subtitle-building policy. If omitted, the builder uses the Broadcast-style defaults. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| srt | STRING | โ |
| timestamps | STRING | โ |
| info | STRING | โ |