longform-to-shorts
longform-to-shorts
Turn one finished long-form video into several standalone vertical Shorts, then write their metadata. Each Short must stand fully alone (no "first/next", no cross-reference), open on a clean full sentence, end clean, and look native to Reels: face zoomed, screen zoomed + scrolling, burned subtitles, a hook, a whoosh, a small speed-up.
This was distilled from a long real edit. The exact ffmpeg commands, the two-phase build, and the gotchas that each cost hours live in references/ffmpeg-recipes.md — read it before building any clip. The phases below are the plan and the judgment calls.
Setup
Source = one finished .mp4 (talking-head + screen-share, ~1080p). Needs ffmpeg/ffprobe and a transcription skill that can return word-level timings (this pairs with the watch/claude-video skill + a Groq/OpenAI Whisper key in ~/.config/watch/.env; line-level transcripts are too coarse to cut cleanly). Provide a short whoosh sound effect for transitions. Work in a shorts/ folder next to the video; keep _ref/ for frames + words.json.
The pipeline
1. Transcribe twice. Full clean transcript for reading/segmenting; word-level JSON for exact cut points. Commands in the reference.
2. Segment + trim (editorial). One Short per topic; target ~30–45s (pre-speedup; see Configuration). Every Short is standalone — cut all sequencing ("first/next", "moving on", "second one") and cross-references. Never open on a dangling connective ("but/so/and/that/okay"); start on a clean full sentence (an earlier sentence start often reads best). End on a complete sentence without clipping the last word. Mid-cuts to drop a redundant clause are fine — pick boundaries with a real gap, else remove the whole clause rather than leave a leftover fragment.
3. Face vs screen. Sample frames (~every 8s) to map talking-head vs screen-share spans. The critical rule: switch to the screen crop only when the screen content actually appears, not when the speaker starts mentioning it — otherwise you crop an empty room for a few seconds while they lean to bring the window up. Confirm the real appearance time with 2s-interval frames at the boundary.
4. Reframe to fill 1080x1920. Face → center-crop on the face. Screen → zoom + slow vertical scroll (a static screen under voiceover looks dead). Screen-only (no face) → split-screen: screen scroll + a full-face PIP bubble. Transition dead-zone → freeze the first clean target frame over the audio. Filters in the reference.