Build a local Python pipeline that turns a long talk into six 9:16 Shorts A developer published a local Python pipeline that converts long talks, podcasts and interviews into six vertical 9:16 Shorts, combining faster-whisper word-level transcription, a heuristic or LLM-assisted clip scorer, OpenCV face tracking and FFmpeg rendering. The pipeline scores candidate clips on seven checks, trims silence, burns in word-by-word captions and hook titles, and supports an --analyze mode that exports a timestamped transcript for an LLM to select clips. The writeup notes CPU-only runs with the base Whisper model are sufficient for a first pass and warns that only media the user has rights to should be processed. If you cut Shorts from podcasts or interviews, most of the clock time is not creative. It is the same checklist: find a 30-second stretch that stands on its own, drop the dead air, reframe to 9:16, put the face in the middle, burn in captions, add a hook title, maybe a zoom and a sound on the punch word. That checklist is regular enough to automate on your own machine. This article walks through a local Python pipeline that does that. No cloud editor, no monthly seat. The blocks are ordinary: faster-whisper for a word-timed transcript, a small scorer or an LLM that only sees text to pick clips, OpenCV to track a face, and FFmpeg to render. I will be honest about what this replaces and what it does not. A useful default is six clips, each 20–60 seconds 30–45 is the sweet spot , already in 9:16, with silence trimmed, a vertical frame, word-by-word captions, a hook title in the first couple of seconds, light zooms, optional B-roll and sound effects, a progress bar, and a clean end that can loop. Support two inputs, because the media is different: The rest of this article is talk mode. Lifestyle is a second renderer on the same command, not a second architecture. A hard rule: only process video you or your client have the rights to. yt-dlp can fetch a URL, but downloading someone else's upload and reposting it breaks copyright and platform rules, automation or not. Keep one entry point: heuristic selection, then render six Shorts python clip.py podcast.mp4 --lang en German audio, more accurate captions slower python clip.py interview.mp4 --lang de --model medium export a transcript for an LLM to pick clips, then render that file python clip.py podcast.mp4 --analyze python clip.py podcast.mp4 --clips work/podcast/clips.json --only 2 5 Useful flags: --fast FFmpeg veryfast , --no-sfx , --no-broll , --music default for a quiet bed with ducking, and --crop for a full-bleed vertical crop. Cropping is fashionable; it also chops hands and slides. A safer default is to fit the whole landscape frame onto 9:16 and use a blurred copy of the same frame as background. You need Python 3.12, FFmpeg and ffprobe on PATH , faster-whisper , OpenCV, NumPy, Pillow, SciPy, soundfile , and librosa . A GPU helps Whisper, but a CPU-only run with --model base and --fast is enough for a first pass. Captions and clip boundaries both need word times, not paragraph times. faster-whisper the CTranslate2 port of Whisper writes {word, start, end} locally, including German with --lang de . From that list you can group sentences on punctuation, treat long gaps as silence, and later highlight the active caption word. Write work files into work/