Audio Cascade Scroller (播客滚动)
The podcast-style rolling subtitles that keep a conversation on screen
- image
- subtitle_data
- IMAGE
If you watch any podcast clip with subtitles, you've seen the pattern: several lines stacked on screen, the currently-spoken line biggest and brightest, a little ▶ pointing at it, and every other line smaller and grayed out so you always know where you are. That's SubtitleCascadeScroller (播客滚动), the podcast-scroll node of the ComfyUI-Subtitle-Effects pack. Where the four-line flip node is the showpiece and spring-pop is for title beats, this one is the workhorse for actual dialogue - interviews, commentary, vlogs - anything where you want a persistent, readable transcript on screen.
Like every renderer in the pack, it composites onto your IMAGE frame sequence using pure CPU Pillow. Zero VRAM, no model files.
How it works
Under the hood it maintains a fixed hierarchy of four visible "slots" - the previous line, the current one, the next, and the one after - with preset scale and alpha tiers (roughly 0.75/1.2/0.7/0.55 and alpha 140/255/100/60). When the active subtitle changes, the node interpolates all four axes at once: vertical position, scale, opacity, and the position of the ▶ indicator, over transition_duration seconds. The current line sits largest with your active_color; inactive lines shrink, fade to inactive_alpha, and drop to inactive_color.
The genuinely clever bit is max_chars_per_line. Set it above 0 and the node will split long sentences into several short subtitles automatically - using HanLP's Chinese dependency parser for real syntactic break points, falling back to a jieba heuristic if HanLP isn't installed. That's why long Chinese sentences don't wrap mid-phrase: the break lands on a clause boundary, not a character count.
Inputs that matter
max_visible_lines(default 4) andline_spacing- how many rows show and how tall they stack.max_visible_linesbeyond 4 mostly widens the window the transition passes through.transition_duration(0.6s) - the smoothness of the roll. Lower is snappier, higher is floatier.text_align- center/left/right for the text block.active_color/inactive_color/inactive_alpha/inactive_scale- the whole "current vs. past" read. Crankinactive_alphadown andinactive_scaledown for a strong current-line emphasis.indicator- the marker string, ▶ by default. Change it to a bullet or>>if the triangle isn't your vibe.max_chars_per_line- 0 means "use lines as given"; a positive value enables the automatic long-sentence splitting. This is the input most worth experimenting with for spoken-word content.position_x/text_area_y- where the block sits;text_area_y0.6 puts it comfortably above center-bottom.
text and subtitle_data are optional inputs feeding the same entry source; srt_path is the file fallback. Output is a single IMAGE - the composited frame sequence.
Install
Same pack, same drill:
cd ComfyUI/custom_nodes
git clone https://github.com/liaowu-boos/ComfyUI-Subtitle-Effects.git
cd ComfyUI-Subtitle-Effects
pip install "Pillow>=9.0.0" "jieba>=0.42" "hanlp>=2.1"
Or search liaowu-boos/ComfyUI-Subtitle-Effects in ComfyUI Manager and restart. The hanlp install is the only per-node extra in the whole pack - and it's optional. Without it, the node prints a fallback notice and uses the jieba heuristic; with it, long-sentence splits get noticeably smarter.
Common issues
- First run looks like it's hung. HanLP's first load downloads and initializes a model - the source comments say roughly 50 seconds, then about 20ms per sentence afterward. It's not frozen; it's warming up.
- Lines keep splitting mid-word anyway. If
max_chars_per_lineis set and you don't have HanLP, the jieba fallback is heuristic - good enough for Chinese, less careful for mixed English. Either installhanlpor raise the limit. - Every line is the same size. If the active/inactive contrast feels flat, check that
inactive_scaleandinactive_alphaare doing something - at defaults of 0.8 and 120 the difference is subtle on bright footage. - Long video memory. Pack-wide rule: ~95MB of frame tensors per second at 720p/30fps. Render in segments for anything past a minute.
This is the node most podcast-style creators will actually live in. Set it up once with your colors, feed it SUBTITLE_DATA from a SubtitleSource, and it just keeps the transcript rolling.
Inputs (19)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| font_name | COMBO | 7 options: Inter-Regular.otf, JetBrainsMono-Regular.ttf, LXGWWenKai-Regular.ttf, NotoSerifSC-Regular.otf, SmileySans-Oblique.ttf, SourceHanSansSC-Regular.otf, +1 | |
| font_size | INT | 4812–200 | — |
| fps | FLOAT | 30.001–120 | — |
| position_x | FLOAT | 0.500–1 | — |
| text_area_y | FLOAT | 0.600–1 | — |
| text_align | COMBO | center | 3 options: center, left, right |
| indicator | STRING | ▶ | — |
| active_color | STRING | #FFFFFF | — |
| inactive_color | STRING | #888888 | — |
| inactive_alpha | INT | 1200–255 | — |
| inactive_scale | FLOAT | 0.800.3–1 | — |
| transition_duration | FLOAT | 0.600.1–2 | — |
| line_spacing | FLOAT | 1.81–4 | — |
| max_visible_lines | INT | 41–10 | — |
| max_chars_per_line | INT | 00–50 | — |
| srt_path | STRING | — | |
| textopt | STRING | — | |
| subtitle_dataopt | SUBTITLE_DATA | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |