.claude/skills/ingest-video/SKILL.md
Ingest local video files (meetings, screen recordings, presentations). Transcribes audio, extracts keyframes, creates structured wiki pages.
npx skillsauth add RonanCodes/llm-wiki ingest-videoInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Transcribe local video files and create wiki pages with keyframe screenshots.
which ffmpeg >/dev/null 2>&1 || brew install ffmpeg
ffmpeg -i "$VIDEO_PATH" -vn -acodec pcm_s16le -ar 16000 -ac 1 /tmp/llm-wiki-audio.wav
Tier 1 — Local Whisper (free, no key):
# Try whisper-cpp first, then python whisper
whisper-cpp -m /usr/local/share/whisper-cpp/models/ggml-base.en.bin \
-f /tmp/llm-wiki-audio.wav --output-format txt -of /tmp/llm-wiki-transcript
# OR: whisper /tmp/llm-wiki-audio.wav --model base.en --output_format txt --output_dir /tmp
Tier 2 — OpenAI Whisper API ($0.006/min, needs OPENAI_API_KEY in env or .env):
curl -s https://api.openai.com/v1/audio/transcriptions \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-F file=@/tmp/llm-wiki-audio.wav -F model=whisper-1 -F response_format=text
Tier 3 — AssemblyAI ($0.01/min, has speaker diarization, needs ASSEMBLYAI_API_KEY):
Upload file to /v2/upload, POST to /v2/transcript with speaker_labels: true, poll until status: completed. Returns utterances with speaker labels.
No provider? Tell user to install whisper-cpp (brew install whisper-cpp) or set an API key. Stop.
mkdir -p "$VAULT/raw/assets"
ffmpeg -i "$VIDEO_PATH" -vf "select=gt(scene\,0.3),scale=1280:-1" \
-vsync vfr "$VAULT/raw/assets/${VIDEO_SLUG}-frame-%03d.png"
If fewer than 3 frames, fall back to I-frame extraction (select=eq(ptype\,I)). Cap at 20 keyframes.
Save to $VAULT/raw/<video-slug>-transcript.md:
---
source-url: "file://<absolute-path>"
title: "<video-filename>"
date-fetched: <today>
source-type: video
transcription-provider: <whisper-cpp|openai|assemblyai>
has-diarization: <true|false>
keyframes: <count>
---
Include full transcript below frontmatter. With diarization, format as Speaker A: ....
Create $VAULT/wiki/sources/<video-title>.md with sections:
<details><summary> for collapsibilityTell the user which provider was used, keyframe count, diarization availability, and content summary.
data-ai
Extract transcript from a YouTube video as clean readable text. Use when user shares a youtube.com or youtu.be link and wants the transcript, content summary, or to read what was said.
development
Page type templates and frontmatter conventions for LLM Wiki pages. Reference skill loaded by ingest, query, and lint skills to ensure consistent wiki structure.
testing
Show status of all LLM Wiki vaults — page counts, source counts, last activity, and git status. Use when user wants to see vault status, list vaults, or check wiki health.
documentation
Import an existing Obsidian vault, markdown folder, or git repo as an llm-wiki vault. Moves content into vaults/, adds missing structure (index, log, CLAUDE.md, frontmatter). Use when user wants to import, adopt, migrate, or bring in an existing knowledge base.