arkennemasis Caption Style (font + subtitle style)
Subtitles that don't look like default subtitle nodes
- caption_style
ArkCaptionStyle is the styling node for the arkennemasis video chain: it decides exactly how burned-in subtitles look, and you wire its output into Video Assemble's caption_style input. Five styles, any installed font, colours, outline, box, size, a 3×3 position grid, and an on/off switch. It's the difference between a video with captions and a video where the captions look like they were designed.
In the pack's video flow it sits upstream of Video Assemble, which does the actual burning. You design the look once with this node, wire the caption_style output across, and every clip in the film gets the same subtitle treatment - which matters more than it sounds, because subtitles that change style mid-film read as an error even to viewers who never notice fonts.
The five styles
The style dropdown is the heart of the node:
classic- the whole line at once.karaoke- a colour sweep across the line as it's spoken.highlight- the spoken word changes colour (the default).underline- the spoken word gets underlined.word_by_word- one word on screen at a time.
Everything but classic marks individual words, and here's the honest mechanism the tooltip spells out: a video model gives you no word timestamps, so the timings are estimated from the script and the clip's real duration, weighted by word length and trailing punctuation. That tracks speech closely but is not frame-accurate, and it drifts if the model ad-libs. So karaoke looks great on scripted, faithfully-delivered narration and visibly sloppy on a model that improvised. For safety-critical captioning, classic is the one that can't drift.
The inputs that matter
enabled- the master switch. Off means the finished video has no subtitles at all, and every other setting stays put - switching back on is one click. This is the "burn captions" decision, kept separate from the design.font- 13 families bundled with the pack, listed first, then fonts installed on your machine. The ordering is a warning: bundled fonts travel with the workflow; system fonts may be missing on someone else's.font_size- 0 (default) = scale to the video: 5% of its height, which is 37px at 736p.position- 3×3 grid (bottom_center default) andalignment- center/left/right.line_color/word_color- ordinary words vs the spoken word (word_color is ignored byclassic).outline_color/outline_width/shadow_offset/border_style/box_color- the readability kit.outline_width0 removes the dark rim, which the tooltip says is only safe with a shadow or a box.border_style: opaque boxfills a solid card behind the text using outline_color as the fill and outline_width as padding.max_words_per_line- default 6; 0 puts the whole line on one row, which overruns the frame on long sentences.margin_v- distance from the frame edge in pixels.extra_fonts_dir- a folder of extra .ttf/.otf files. Restart after adding one for it to reach the dropdown; rendering picks it up immediately.
Installing
It's part of the comfyui-arkennemasis pack:
cd ComfyUI/custom_nodes
git clone https://github.com/Hishamahmer/comfyui-arkennemasis
pip install replicate httpx
restart, and it's under arkennemasis/Video. No models, no API calls - it just assembles an ASS caption style object for Video Assemble to render.
The realistic take: if you're producing narration-driven film, start with highlight and a good outline - it reads as professional and hides the estimated-timing wobble better than karaoke. Reach for karaoke when you're confident the voice model delivers the script faithfully. And when a client says "make the subs bigger," it's one widget here, re-run, not an hours-long re-edit of burned-in text.
Inputs (19)
| Name | Type | Default | Description |
|---|---|---|---|
| enabled | BOOLEAN | true | Turn this off and the finished video is burned with no subtitles at all. Everything below stays as you set it, so switching back on needs one click. |
| style | COMBO | highlight | classic = the whole line at once. karaoke = the colour sweeps across the line. highlight = the spoken word changes colour. underline = it gets underlined. word_by_word = one word on screen at a time. All but classic mark single words, and the word timings are estimated from the script, so they track the speech closely but are not frame-accurate. |
| font | COMBO | Oswald | Families bundled with this node pack are listed first; everything after them is a font installed on this machine and may be missing on someone else's. |
| font_size | INT | 00–400 | 0 = scale to the video: 5% of its height (37 px at 736p). |
| position | COMBO | bottom_center | 9 options: bottom_center, bottom_left, bottom_right, middle_center, middle_left, middle_right, +3 |
| alignment | COMBO | center | 3 options: center, left, right |
| line_coloropt | STRING | #FFFFFF | Hex colour of the ordinary words. |
| word_coloropt | STRING | #FFE600 | Hex colour of the word being spoken. Ignored by classic, which never marks a single word. |
| outline_coloropt | STRING | #000000 | — |
| outline_widthopt | INT | 30–20 | The dark rim that keeps text readable over a bright frame. 0 removes it — only safe with a shadow or a box. |
| shadow_offsetopt | INT | 10–20 | — |
| border_styleopt | COMBO | outline | 'opaque box' fills a solid card behind the text, using outline_color as the fill and outline_width as padding. |
| box_coloropt | STRING | #000000 | — |
| boldopt | BOOLEAN | true | — |
| italicopt | BOOLEAN | false | — |
| all_capsopt | BOOLEAN | false | — |
| max_words_per_lineopt | INT | 60–40 | Break the line every N words. 0 puts the whole line on one row, which overruns the frame on long sentences. |
| margin_vopt | INT | 400–400 | Distance from the frame edge, in pixels. |
| extra_fonts_diropt | STRING | Optional folder of extra .ttf/.otf files. Restart ComfyUI after adding one for it to reach the dropdown; it is picked up for rendering straight away. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| caption_style | ARK_CAPTION_STYLE | — |