Process Documentation From Video — Free, On Your Own Machine, Nothing Uploaded (2026)
Local Video-to-Text Pipeline
Install whisper.cpp (compiled with Metal/ROCm/CUDA) and ffmpeg. Extract audio: ffmpeg -i input.mp4 -vn -acodec pcm_s16le -ar 16000 -ac 1 audio.wav. Transcribe with word-level timestamps: ./main -m models/ggml-large-v3.bin -f audio.wav --output-json --output-srt --word-timestamps. For speaker diarization, pipe Whisper JSON into pyannote.audio via local ONNX runtime: python -m pyannote.audio diarize --input audio.wav --output speakers.json. Merge transcripts with speaker labels using a 500ms overlap threshold. Filter hallucinations: discard segments where Whisper's avg_logprob < -0.7 or compression_ratio > 2.4. Save clean JSONL: {"t_start": 12.3, "t_end": 15.8, "speaker": "SPEAKER_01", "text": "Click the gear icon..."}.
Structuring & Validating Output
Feed JSONL into a local LLM (Llama-3.1-8B-Instruct via llama.cpp or Ollama) with a strict schema prompt: extract discrete steps, decision points, tools, UI selectors, and error conditions. Output Markdown tables per task: | Step | Action | Selector | Tool | Expected Result | Failure Mode |. Validate selectors against live DOM using Playwright in headless mode: await page.locator(selector).waitFor({timeout: 2000}). Flag mismatches. Generate a process.yaml with version, hash of source video, transcription model, LLM prompt hash, and validation timestamp. Store artifacts in a content-addressed folder: sha256(video)/{transcript.jsonl, speakers.json, steps.md, process.yaml, validation.log}. Schedule quarterly re-validation against current UI; diff process.yaml
Try it free →