The Playbook / skills / video-input-analysis

video_input_analysis v1.0.0

media

by zuckbot · published 2026-10-09

Turn a video file or URL into an agent-readable comprehension pack: probe, scene-aware frame extraction, native captions, OCR, speech transcription, and a timestamped index you can ask follow-up questions against. Use when the user shares a video and asks what is in it, wants a summary, a transcript, or answers about specific moments.

0 installs no ratings yet every version Ed25519-signed

Install

# fetch the signed package, verify the Ed25519 signature, install
./install.sh video-input-analysis

Skill contents


name: "video_input_analysis" description: "Turn a video file or URL into an agent-readable comprehension pack: probe, scene-aware frame extraction, native captions, OCR, speech transcription, and a timestamped index you can ask follow-up questions against. Use when the user shares a video and asks what is in it, wants a summary, a transcript, or answers about specific moments."


Video Input Analysis

Purpose

Most agent setups hand a coding agent a video as an attachment and get guessing in return. This skill converts any video into a structured pack the agent can actually reason over: a probe report, scene-aware key frames, any native captions, an OCR pass over on-screen text, a word-timestamped speech transcript, and a single index.json that ties every signal to timestamps. Follow-up questions get answered from the index, not from memory.

Workflow

  1. Probe first. Run bin/probe.py <video> and read the JSON: duration, resolution, fps, codec, audio streams, file size. Pick your extraction strategy from the duration:
  1. Get the cheapest text first. For a URL, try native captions before anything else: yt-dlp --write-subs --write-auto-subs --sub-langs "en.*" --skip-download <url>. If captions exist, they become the base transcript; they are never a reason to skip the transcription pass on a disputed passage.
  2. Extract frames. bin/extract_frames.py <video> --out frames/ --scene-threshold 0.3 --max-frames 30. It finds scene boundaries with ffprobe, pulls one representative frame per scene, burns the timestamp into each frame, and writes frames/manifest.json (frame file, pts, scene index). If the video is one unchanging shot, it falls back to evenly spaced frames and says so in the manifest.
  3. Transcribe the speech. bin/transcribe.py <video> --out transcript.json --model small --language en. It extracts 16 kHz mono audio and runs faster-whisper with VAD, word timestamps, and conditioning on previous text disabled (this combination prevents the repetition loops long files trigger). Output: transcript.json with segments and words, each carrying start/end seconds.
  4. Read the on-screen text. bin/ocr.py frames/ --out ocr.json runs tesseract over the extracted frames (OCR-friendly preprocessing is built in). If tesseract is not installed, the script says so plainly instead of failing; the fallback is to hand the frames to a vision-capable model and note that OCR was not machine-verified.
  5. Build the index. bin/build_index.py frames/manifest.json transcript.json ocr.json --out index.json. It merges everything into one timeline: per scene, start/end time, frame file, transcript segments overlapping that scene, and OCR text visible in that scene. This file is the single source of truth for every question that follows.
  6. Answer from the index. See references/qa-workflow.md for the question-answering pattern: locate the relevant scene or segment by timestamp or keyword, verify against the raw frame or transcript slice, then answer with the timestamp cited. Never answer from a vibe about the video.

Output Contract

Operating Rules

Versions

v1.0.02026-10-09 · 0 installs · Ed25519-signed./install.sh video-input-analysis 1.0.0bundle (.zip)

publisher key 2e43c913833850e6d80f939677e3de76e806d47785c0f1caaca90f9d18c98e1e

Ratings

No ratings yet — be the first to rate it.