captions
Step 5 of the content pipeline, short-form only. Adds captions built from the canonical transcript — never a fresh transcription — using the embedded-captions vendor skill for the actual rendering/sty
SKILL.md.claude/skills/captions/SKILL.md
GitHubCaptions
Short-form only. Long-form (16:9) jobs don't get burned-in captions in this pipeline.
LOCK: captions are built from outputs/.transcript.json — the
canonical, cut-remapped, corrections-applied transcript — and never
by re-transcribing. The embedded-captions vendor skill normally runs
its own WhisperX pass; this skill's whole job is to feed it our already-
correct transcript instead and confirm it actually skipped its own.
1. Bridge the canonical transcript into embedded-captions' project shape
uv run .claude/skills/captions/scripts/prepare_captions_project.py <job-name> [--language en]
This creates projects/<job>/captions/ with:
source.mp4— a copy of the latest render (outputs/<job>-graphics.mp4if graphics are done, elseoutputs/.roughcut.mp4)transcript.json—outputs/.transcript.jsonconverted into embedded-captions' exact normalized schema ({"words":[{"text","start","end","type":"word"}], "language_code"}).
If this job's audio isn't English, pass --language <code> — the
default is en.
2. Run embedded-captions against projects/<job>/captions/
Follow /embedded-captions from here, using projects/<job>/captions/
as its project directory. Its own scripts/prepare.sh runs matting,
transcription, and audio-envelope in parallel — watch its log for the
transcription step and confirm it reports finding an existing
transcript.json and skips re-running Whisper. If it re-transcribes
anyway (schema drift, a version bump changed its expectations), STOP —
do not let it overwrite anything in this pipeline's transcript/ or
outputs/.transcript.json, and fix prepare_captions_project.py's
output schema instead of accepting a fresh transcription.
Pick the caption identity/style per the user's ask — the quiet anchor
rail is the default; only go fully cinematic (embedding words behind the
subject) if the user explicitly wants that treatment.
3. Safe zones still apply
Whatever embedded-captions produces, the burned-in captions must land inside y 200–1620 on the 1080x1920 canvas — no key visuals (including caption text) in the top 200px or bottom 300px.
4. Bring the captioned output back into this job
Copy embedded-captions' finished render into
projects/<job>/outputs/<job>-captioned.mp4. Continue to /music
(optional) or straight to /export.