Nodes/comfyui-arkennemasis/arkennemasis Caption Style (font + subtitle style)
ComfyUI Node

arkennemasis Caption Style (font + subtitle style)

Subtitles that don't look like default subtitle nodes

By Hishamahmer·Created about a month ago·Updated 10 days ago· 5
arkennemasis Caption Style (font + subtitle style)
    • caption_style
    enabledtrue
    stylehighlight
    fontOswald
    font_size0
    positionbottom_center
    alignmentcenter
    line_color#FFFFFF
    word_color#FFE600
    outline_color#000000
    outline_width3
    shadow_offset1
    border_styleoutline
    box_color#000000
    boldtrue
    italicfalse
    all_capsfalse
    max_words_per_line6
    margin_v40
    extra_fonts_dir

    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) and alignment - center/left/right.
    • line_color / word_color - ordinary words vs the spoken word (word_color is ignored by classic).
    • outline_color / outline_width / shadow_offset / border_style / box_color - the readability kit. outline_width 0 removes the dark rim, which the tooltip says is only safe with a shadow or a box. border_style: opaque box fills 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.

    Categoryarkennemasis/Video

    Inputs (19)

    NameTypeDefaultDescription
    enabledBOOLEANtrueTurn 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.
    styleCOMBOhighlightclassic = 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.
    fontCOMBOOswaldFamilies 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_sizeINT00–4000 = scale to the video: 5% of its height (37 px at 736p).
    positionCOMBObottom_center9 options: bottom_center, bottom_left, bottom_right, middle_center, middle_left, middle_right, +3
    alignmentCOMBOcenter3 options: center, left, right
    line_coloroptSTRING#FFFFFFHex colour of the ordinary words.
    word_coloroptSTRING#FFE600Hex colour of the word being spoken. Ignored by classic, which never marks a single word.
    outline_coloroptSTRING#000000
    outline_widthoptINT30–20The dark rim that keeps text readable over a bright frame. 0 removes it — only safe with a shadow or a box.
    shadow_offsetoptINT10–20
    border_styleoptCOMBOoutline'opaque box' fills a solid card behind the text, using outline_color as the fill and outline_width as padding.
    box_coloroptSTRING#000000
    boldoptBOOLEANtrue
    italicoptBOOLEANfalse
    all_capsoptBOOLEANfalse
    max_words_per_lineoptINT60–40Break the line every N words. 0 puts the whole line on one row, which overruns the frame on long sentences.
    margin_voptINT400–400Distance from the frame edge, in pixels.
    extra_fonts_diroptSTRINGOptional 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)

    NameTypeDescription
    caption_styleARK_CAPTION_STYLE