agentsclimarketplace

Burn subtitles

Skill jperrello/C0BALT_CUT/.claude/skills/burn-subtitles

Investigation on using Claude Code to automatically generate profitable YouTube videos.

Install
npx -y skills add jperrello/C0BALT_CUT --skill burn-subtitles

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

2 things to look at

  • no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
  • 2 stars2 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

Burn karaoke-style word-timed subtitles into a video. Takes a transcript JSON with word timestamps and a video, emits a new video with subtitles rendered in. Renders text as a PNG overlay sequence (the local ffmpeg build has no libass/drawtext).

SKILL.md

3.3 KB, as published. Nobody here has run it

burn-subtitles

Word-timed subtitle burn-in for shorts. Highlights the current word, no manual sync.

Invoke

.claude/skills/burn-subtitles/burn-subtitles.sh <input> <transcript.json> <out> [style] [font_size]
  • input: video path
  • transcript: path to JSON. For style=chunks (default) this is a chunks.json from the chunk-captions skill. For other styles it's a transcribe output JSON.
  • out: output video path
  • style (optional): chunks (default) | line | word-karaoke | selective
  • font_size (optional): default 72

Output

mp4 with subtitles burned in. Same dimensions, audio stream-copied. Prints the output path to stdout. Idempotent: skips work if out is newer than both inputs.

Styles

  • chunks (default): consumes a chunks.json from the chunk-captions skill. Each chunk is shown as a complete phrase for its [t0, t1] window; the currently-spoken word is rendered cyan, all other words white. Chunks hard-cut between each other — no scrolling, no fade. Kills the per-word slide-up that made the legacy word-karaoke style hard to read.
  • line: one plain line per transcript segment.
  • word-karaoke (legacy): rolling window of up to 4 words, tied to word timestamps. Each word slides up 8px over 80ms at its own t0 and hard-cuts off when bumped or after a >0.6s speech gap. Deprecated for shorts — feedback showed the constant scroll was hard to follow.
  • selective: only burns segments overlapping high-RMS-energy seconds.

Brand preset (deliberate, not default)

This is the project's caption identity — keep it consistent:

  • Font: Impact (/System/Library/Fonts/Supplemental/Impact.ttf) — chunky condensed sans, distinct from the CapCut/Submagic/Opus default of Arial.
  • Accent (active word): Sapphire Glow #2E6BFF — the C0BALT CUT brand accent (brand/BRAND.md), chosen against the ubiquitous MrBeast-yellow #FFD633.
  • Context (earlier visible words): off-white #F5F5F0.
  • Position: upper-third (top of first line at ~22% of frame height) — not the default lower-third.
  • Animation: 8px slide-up over 80ms (linear) on entry; hard-cut on exit. No ease-out-back pop, no scale animation.
  • Stroke: thick black outline (font_size / 10), for legibility over any background without falling back to white-on-black bars.

How

The local ffmpeg build ships without libass, subtitles, or drawtext filters. So burn_subtitles.py renders a transparent PNG per video frame with PIL using the brand preset above, hardlinking duplicate frames for speed. burn-subtitles.sh then composites the sequence onto the source with ffmpeg's overlay filter and re-encodes video (libx264 veryfast crf18); audio is copied.

Status

Works. Tested on a 6.7s 720x1280 clip (say-synthesized speech, 19 words):

  • word-karaoke: 20 unique states, frame at t=3.2s shows 16130 white + 5616 accent (highlighted-word) pixels in the lower third.
  • line: 27049 white pixels, 0 accent. Dimensions and duration preserved, audio stream-copied (aac).

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.