Speed Light Stretch (光速拉伸)
The light-speed stretch-in that makes text feel like it just arrived somewhere fast
- image
- subtitle_data
- IMAGE
You know that energy-text entrance from every action trailer - the word slams in so fast it's smeared across the frame, then snaps into focus with a glow? That's SubtitleSpeedStretch (光速拉伸): a horizontal stretch entrance with simulated motion blur and an optional glow, all composited onto your video frames. It's a one-liner node for a single dramatic word or short phrase - think "SPEED" as a location card, a name, a countdown label - not a tool for long conversational subtitles.
It's also the purest demonstration of the pack's whole pitch: this is post-processing, not AI. The text is rendered and distorted with Pillow on the CPU, zero VRAM, no model involved. It's a compositor trick dressed up to look like VFX.
How it works
The node starts your text horizontally stretched - by default 4× wide and slightly squashed vertically - and animates it down to normal scale over duration seconds using the easing curve you pick. The motion_blur amount fakes the smear by rendering intermediate stretched states and blending them, so the fast part of the motion leaves trails. On top of that sits a soft glow (glow_radius / glow_strength / glow_color), and a drop shadow with its own shadow_blur for separation. The whole thing is then composited with additive-style blending onto your frame at position_x / position_y.
The five easing_curve options change the personality: ease_out_cubic (default) is the classic fast-then-settle, ease_out_quint is even more violent up front, linear feels mechanical, ease_in_out_cubic eases both ends, and spring adds an overshoot bounce on the way in. The scale_x_start / scale_y_start pair controls the starting distortion - bigger scale_x_start, more dramatic smear.
The inputs that matter
text- required, defaults to "SPEED". Keep it short; this node's whole effect reads on a few words.motion_blur(0–200, default 50) - the smear. 0 turns it off entirely for a clean stretch; higher gets streakier.duration(default 0.25s) - how long the entrance takes. Snappy by default; stretch it toward a second for a slower, more ominous reveal.glow_strength/glow_color- the bloom. The README's example pairs it with a cyan glow; default is white.glow_strengthcan go to 2.0, which is a lot - dial from 0.6 and nudge.shadow_offset_x/yandshadow_blur- drop shadow placement and softness.
font_name, font_size, line_gap, fps, and the color fields round out the required list; srt_path and subtitle_data are optional, so you can drive the text from the pack's SUBTITLE_DATA pipeline instead of typing it. Output: one IMAGE - the composited frame sequence.
Install
Standard pack install:
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"
Or ComfyUI Manager → search liaowu-boos/ComfyUI-Subtitle-Effects → restart. Nodes show up under Subtitle Effects. Seven fonts ship with the repo; extra .ttf/.otf files in fonts/ appear in the dropdown after a restart. No models, no GPU work.
Common issues
- The entrance looks like a janky zoom, not a streak. That's
motion_blurdoing its job - if it reads wrong, raise it. If you want zero smear, 0 is valid. - Text smears too far off-frame.
scale_x_startof 4× on a wide word can start outside the safe area. Either shrink the starting scale or accept the edge-slice as part of the look. - Glow washes the text out.
glow_colorat white withglow_strengthnear 1.0+ will bloom the letters into a blob, especially on dark footage. Dropglow_strengthor switch to a colored glow before you blame the font. - Long clip memory. Same pack-wide rule - CPU frames run ~95MB/sec at 720p/30fps, so render long projects in chunks.
This is the node to reach for when a single word has to announce itself. It won't hold a conversation, but it'll nail the beat where one pops.
Inputs (23)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| text | STRING | SPEED | — |
| 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 | 8012–300 | — |
| line_gap | INT | 100–100 | — |
| fps | FLOAT | 30.001–120 | — |
| position_x | FLOAT | 0.500–1 | — |
| position_y | FLOAT | 0.500–1 | — |
| scale_x_start | FLOAT | 4.01–10 | — |
| scale_y_start | FLOAT | 0.800.1–1 | — |
| motion_blur | INT | 500–200 | — |
| duration | FLOAT | 0.250.1–2 | — |
| easing_curve | COMBO | ease_out_cubic | 5 options: ease_out_cubic, linear, ease_out_quint, ease_in_out_cubic, spring |
| glow_radius | INT | 150–50 | — |
| glow_strength | FLOAT | 0.60–2 | — |
| glow_color | STRING | #FFFFFF | — |
| text_color | STRING | #FFFFFF | — |
| shadow_offset_x | INT | 4-20–20 | — |
| shadow_offset_y | INT | 4-20–20 | — |
| shadow_color | STRING | #000000 | — |
| shadow_blur | INT | 00–50 | — |
| srt_pathopt | STRING | — | |
| subtitle_dataopt | SUBTITLE_DATA | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |