agentsclimarketplace

Add subtitles

Skill DidierRLopes/get-y2b-clips/.claude/skills/add-subtitles

Add burned-in subtitles to a video the user uploads or points to on disk. Use when the user provides a local video file (mp4/mov/etc.) and wants captions/subtitles added to it. Transcribes the audio with Whisper and burns styled captions directly into the video.From its SKILL.md

Install
npx -y skills add DidierRLopes/get-y2b-clips --skill add-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

  • 5 stars5 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.
  • runs commandsInstructs the agent to run 8 commands, including `command -v ffmpeg || echo "MISSING: ffmpeg"` and 7 more.

SKILL.md

6.2 KB, ~1.6k tokens by cl100k_base, as published. Nobody here has run it

Add Subtitles to a Video

Take a video the user uploads (or a path to a local file) and produce a new video with styled, burned-in subtitles — ready for social media. Audio is transcribed automatically with Whisper, so no transcript or YouTube source is required.

This skill reuses burn_subtitles.py from the get-y2b-clips skill, but is scoped to the single task of subtitling an already-provided video file.

When to Use This Skill

Activate when the user:

  • Uploads or references a local video file and asks to "add subtitles" / "add captions"
  • Wants a subtitled / captioned version of an existing clip for social media
  • Has a video (not a YouTube URL) and wants burned-in text

If the user provides a YouTube URL and wants clips extracted, use get-y2b-clips instead. This skill is for a video the user already has.

Dependencies Check

ALWAYS check dependencies first:

# ffmpeg is required to burn subtitles
command -v ffmpeg || echo "MISSING: ffmpeg"

# stable-ts (Whisper) is required to transcribe the audio
python3 -c "import stable_whisper" 2>/dev/null && echo "stable-ts OK" || echo "MISSING: stable-ts"

Install Missing Dependencies

ffmpeg:

# macOS
brew install ffmpeg
# Linux
sudo apt update && sudo apt install -y ffmpeg

stable-ts (Whisper):

pip3 install stable-ts

Input Requirements

  • Required: Path to a local video file (e.g. ./videos/my-clip.mp4)
  • Optional (ask only if relevant):
    • Font size (default: 24)
    • Whisper model size — tiny/base/small/medium/large (default: base). Suggest small or medium for higher accuracy on longer or harder audio.
    • Output path (default: same folder, <name> Subtitled.mp4)
    • Whether to keep the generated .srt file (default: no)

Locating the uploaded video

If the user uploaded a file but didn't give a path, look for it:

# Common locations for an uploaded/provided video
ls -la ./videos/ 2>/dev/null
find . -maxdepth 3 -type f \( -iname "*.mp4" -o -iname "*.mov" -o -iname "*.mkv" -o -iname "*.webm" \) -mmin -120 2>/dev/null

If multiple candidates exist, confirm which file with the user before proceeding.

Workflow

Step 1: Confirm the input

VIDEO="./videos/my-clip.mp4"   # path the user provided / you located

# Verify it exists and inspect basic info
test -f "$VIDEO" && echo "Found: $VIDEO" || echo "NOT FOUND: $VIDEO"
ffprobe -v error -show_entries format=duration,size -of default=noprint_wrappers=1 "$VIDEO"

Step 2: Choose the output path

DIR=$(dirname "$VIDEO")
BASE=$(basename "$VIDEO")
NAME="${BASE%.*}"
OUTPUT="$DIR/${NAME} Subtitled.mp4"
echo "Output: $OUTPUT"

Step 3: Transcribe + burn subtitles (one command)

burn_subtitles.py defaults to Whisper mode: it transcribes the video's audio for accurate word-level timing, then burns the captions in with ffmpeg.

python3 .claude/skills/add-subtitles/burn_subtitles.py \
    --video "$VIDEO" \
    --output "$OUTPUT" \
    --whisper-model base \
    --font-size 24

Useful flags:

--whisper-model small   # higher accuracy (slower); also: tiny/base/medium/large
--font-size 28          # larger captions
--keep-srt              # also write the .srt next to the output (for editing/reuse)

What it does:

  1. Transcribes the audio with Whisper (stable-ts) for accurate word-level timestamps
  2. Groups words into readable subtitle blocks with sensible display durations
  3. Burns them into the video with styling:
    • Large readable font (default 24pt)
    • White text, black outline, semi-transparent background box
    • Bottom-center positioning

Step 4: Report the result

Show the user:

  • Output file path and size
  • Whisper model used
  • Number of subtitle blocks created (printed by the script)

Console Progress Reporting

Provide clear progress updates:

[SETUP] Checking dependencies...
  ✓ ffmpeg found
  ✓ stable-ts found

[INPUT] Video: ./videos/my-clip.mp4 (1m 18s, 14.1 MB)

[SUBTITLES] Creating subtitled video
  Transcribing with Whisper (base model)...
  ✓ Transcribed 24 subtitle blocks (Whisper)
  ✓ Created: my-clip Subtitled.mp4 (13.8 MB)

[DONE] Subtitled video ready: ./videos/my-clip Subtitled.mp4

Editing Subtitles Before Burning (optional)

If the user wants to review/fix the transcription before it's burned in:

# 1. Generate and keep the SRT, but transcription + burn happen together,
#    so to edit first, run with --keep-srt, then re-burn from the edited SRT.
python3 .claude/skills/add-subtitles/burn_subtitles.py \
    --video "$VIDEO" --output "$OUTPUT" --keep-srt
# 2. Edit the resulting "<name> Subtitled.srt"
# 3. Re-burn using ffmpeg directly with the corrected SRT:
ffmpeg -i "$VIDEO" \
  -vf "subtitles='<edited>.srt':force_style='FontSize=24,FontName=Arial,PrimaryColour=&HFFFFFF,OutlineColour=&H000000,BorderStyle=4,Outline=2,Shadow=1,MarginV=30,Alignment=2'" \
  -c:a copy -y "$OUTPUT"

For most requests this is unnecessary — the one-command Whisper flow is enough.

Error Handling

IssueSolution
MISSING: ffmpegProvide install command, then retry
MISSING: stable-tspip3 install stable-ts, then retry
Video file not foundAsk the user for the exact path / re-locate the upload
Transcription inaccurateRe-run with a larger --whisper-model (small/medium)
Subtitles out of syncUse --keep-srt, adjust timings, re-burn (see section above)
No audio in videoInform user — subtitles require an audio track

Example Session

User: Here's a video, can you add subtitles? ./videos/founder-take.mp4

Claude:

  1. Checks ffmpeg + stable-ts are installed
  2. Confirms the file exists (./videos/founder-take.mp4, 1m 18s)
  3. Runs burn_subtitles.py in Whisper mode → ./videos/founder-take Subtitled.mp4
  4. Reports output path, size, and subtitle block count

What ships with it: 2 files

19.9 KB alongside SKILL.md, 2 of them executable

Gives 0 of the 12 instructions most video audio skills give in ~1.6k tokens

Counted across 619 of the 725 authors here whose files we hold, read 2026-09-06

  • Read product marketing context firstin 13 of 619, across 7 files
  • Define the core visual thesis in one sentencein 11 of 619, across 3 files
  • Break the concept into 3 to 6 scenesin 11 of 619, across 3 files
  • Render the smallest working version firstin 11 of 619, across 3 files
  • Start with a low-quality smoke test renderin 11 of 619, across 3 files
  • Add captions for accessibility and engagementin 11 of 619, across 5 files
  • Write the scene outline before writing codein 11 of 619, across 3 files
  • Specify subject, action, camera, style, and moodin 11 of 619, across 5 files
  • Decide what each scene provesin 10 of 619, across 2 files
  • Export one clean thumbnail framein 10 of 619, across 2 files
  • Pick the right tool for the jobin 10 of 619, across 4 files
  • Run the test suite before proposing a fixin 8 of 619, across 7 files

Said here and by no other author read

  • Transcribe and burn subtitles

Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.

Keep looking

Skills are one crate of 325,949. 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.