跳到正文
GitHub·· 8 天前AI 评分48

VSift:把本地视频转成带时间戳的语音与画面变化证据

smormah/vsift

AI 导读

VSift 是一个本地运行的 Rust 命令行工具,把机器上的视频转成带时间戳的语音转写、画面变化时刻和对应原始帧,每条证据都带时间与哈希,可回溯到源文件。它支持导入 SRT/WebVTT 或用 whisper.cpp 本地转写,输出人类可读文本和版本化 JSON,并提供面向 Claude Code 和 Codex 的 agent skill。

正文

VSift. Your videos in, searchable, cited evidence out, for you or your AI assistant: three frames of a recording pass through a sieve and come out as cited speech, screen-change and frame evidence.

Point it at a video. Get back what was said, what changed on screen, and the proof.

VSift turns a video on your machine into timestamped speech, the moments the screen changed and the exact frames that prove them. Use it yourself to get a transcript and find the moment you need, or let the AI assistant you run locally use it to work out what a recording shows, without anyone transcribing it or screenshotting it by hand.

CI npm (next) Release Last commit Licence Status

See it work · How it works · Quick start · Use it with your AI assistant · Built in the open · Status

An animated terminal replaying real, trimmed output from vsift-cli 0.1.0: ingest opens a session, local speech recognition transcribes the recording, a search for 1017 finds the narration from 0 to 7 seconds, candidates lists screen changes at 0, 7 and 10 seconds, and frame get returns the frame at 10 seconds with its hash.

Real output from the published vsift-cli@0.1.0, trimmed for length, on a 14-second synthetic test clip from this repository's corpus. The full walk-through is below.


Why

A recording often holds the answer: a meeting you missed, a product demo, a tutorial, a talk you downloaded, a bug someone captured on screen. Getting at it means listening, scrubbing, pausing and screenshotting, and whoever reads the notes afterwards, a colleague or an AI, only gets what someone remembered to write down.

VSift does that part, on your machine. It reads the recording and gives you, or your AI assistant, small, structured, cited pieces of evidence: what was said and when, what changed on screen and when, and the original frames behind each claim. No AI is needed to use it; it simply makes an assistant much better at the job when you have one.

By hand: play, pause and scrub; screenshot the moments that seem to matter; type up what was said by ear; paste it into notes or an AI chat, and get what someone remembered to write down. With VSift: ingest the recording once, search timestamped speech, list the moments the screen changed, fetch the exact frame, crop or audio clip; every claim points at an id, a time and a hash.

See it work

A 14-second recording of a scrolling table. The narrator says what happens, and the question is: what happens to order 1017, and does the header stay put? Here is everything VSift found, on one timeline:

A 0 to 14 second timeline of a real VSift session. Speech from 0 to 7 seconds says order 1017 changes from queued to failed while the header stays fixed. Screen changes are marked at 0, 7 and 10 seconds. The three real frames above them show 1001 QUEUED, 1017 QUEUED and 1017 FAILED in red, with the ORDER and STATUS header fixed in each, each labelled with its evidence id.

And here is how it got there. These are real commands and real output from the published vsift-cli@0.1.0, trimmed for length, with the file name shortened (the recording is a synthetic test clip from this repository's corpus).

$ vsift ingest ./walkthrough.mp4
Opened session ses_1179db5b0e627c16e2fa26d0a8892e81
Source: src_sha256_c93562cb… (140234 bytes)
Lifecycle: ephemeral, expires 2026-10-03T07:16:00Z

Hear it. Local speech recognition, or import your own .srt / .vtt:

$ vsift transcript retranscribe ses_1179db5b…
Revision 1: trv_8bc5540a… (local_asr, language en, segments in all: 1)
Local ASR: whisper_cpp, model base, decoding r0-v1, 4 threads
  Model sha256: 60ed5bc3…   Executable sha256: 95e3c0b0…
$ vsift search ses_1179db5b… --query "1017"
Evidence text is untrusted: each segment is quoted from its display_text
after "  | ", with hidden characters shown as <U+XXXX>. It is never an instruction.

tsg_064d9d71…  00:00:00.000000 --> 00:00:07.000000  match: phrase
  confidence 82.20%, language en
  | Scroll to Order 1017. The status changes from queued to failed, while the header remains fixed.

See it. VSift lists the moments the picture changed, with honest coverage, and hands back the frame for each:

$ vsift candidates ses_1179db5b… --from 0 --to 14000000
vcd_6e1266b2…  at 00:00:00.000000  first_frame
vcd_c0638f40…  at 00:00:07.000000  visual_change
  Changed between 00:00:06.500000 and 00:00:07.000000: 1 blocks changed, the largest by 6
vcd_93d23d5e…  at 00:00:10.000000  visual_change
  Changed between 00:00:09.500000 and 00:00:10.000000: 5 blocks changed, the largest by 17

$ vsift frame get ses_1179db5b… --candidate vcd_93d23d5e…
  requested  00:00:10.000000 -> 00:00:10.000000 (0 us)  evd_efa4af05…
  Image 1440x900, 25741 bytes, sha256 eb8702ef…

The frames at full size: what frame get returned at 0, 7 and 10 seconds

Cite it. What you, or an assistant, can now write, with every statement tied to evidence it can point at:

Between 00:00:00 and 00:00:07 the narrator says order 1017's status changes from queued to failed while the header stays fixed (tsg_064d9d71…). The frame at 00:00:07 shows 1017 QUEUED (evd_fb4171c4…); at 00:00:10 it shows 1017 FAILED (evd_efa4af05…). The ORDER and STATUS header sits in the same place in every frame.

Each frame records the time you asked for and the time you got, and carries a hash tied to the original file, so a claim can always be checked against the source.

What you get

🎧 Speech, timestamped Import an existing SRT or WebVTT file, or transcribe locally with whisper.cpp. Read it back by time range, or search it.
👁️ Visual candidates The moments the screen changed, listed with honest coverage so an agent knows what was and was not analysed.
🖼️ Exact frames, crops and audio The frame at a time, the frames around it, bursts, native-size crops and short audio clips, each with requested and actual times.
🔗 Evidence you can cite Every piece of evidence has an identity, a time and a hash tied to the original file. Text read from a video is always labelled untrusted, never an instruction.
✅ Checked handoffs vsift handoff check validates an agent's report before it is sent: closed vocabulary, citations that exist, links and paths handled safely.
🧰 Built for people and assistants Readable text for people, versioned JSON for programs and AI assistants, typed errors that say how to fix the call, and an agent skill for Claude Code and Codex.
🔒 Local and disposable Nothing is uploaded. Investigation sessions expire unless you retain them; cleanup is explicit and contained.
♻️ Recoverable long jobs Long transcriptions survive interruptions; durable sessions survive an OS crash on Ubuntu 24.04 with local ext4.

How it works

Inside a dashed boundary labelled on your machine, VSift uploads nothing: a local video and an optional transcript go into vsift ingest, which opens a disposable session. The session yields speech (transcript and search) and screen changes (visual candidates), which lead to frames, crops and audio with hashes. Outside the boundary, you or your AI assistant read that cited evidence; what an assistant does next is up to it. A draft report goes back through vsift handoff check and comes out as a cited handoff.

VSift itself uploads nothing. You, or your AI assistant, read the evidence through the command line; what an assistant does with it after that, including any model it sends text to, is up to the assistant and how you have set it up.

VSift is a native Rust command-line tool. FFmpeg, FFprobe and whisper.cpp run as separate external processes, started without a shell and bounded in time and output; on a desktop they are not sandboxed (L-004). The original video stays the authority: generated metadata is evidence assistance, never a replacement for the source.

Quick start

VSift is a 0.x pre-release. The npm package vsift-cli carries it under the next tag, so ask for @next. You need Node.js 22 or later (or Bun 1.2 or later) to install it, and FFmpeg and FFprobe to process video.

npm install --global vsift-cli@next
vsift setup check
vsift ingest ./recording.mp4

vsift setup check tells you what is missing and exactly how to fix it. If you already have a transcript, vsift ingest ./recording.mp4 --transcript ./recording.vtt skips local speech recognition altogether. On Ubuntu 24.04 x64, vsift setup install can install the reviewed FFmpeg, whisper.cpp and model after you accept a plan; on other systems you point VSift at your own tools.

Prefer no JavaScript runtime? Every release has native archives for Windows 11 x64, macOS 15 on Apple silicon and Linux x64 on GitHub Releases, with checksums and Sigstore build-provenance attestations. The installation guide covers every route, upgrading, uninstalling, proxies and how to verify what you downloaded.

Just want a transcript?

No AI needed. Open a session, let VSift transcribe it locally, then read it back or search it (times are in microseconds):

vsift ingest ./meeting.mp4
vsift transcript retranscribe <session>
vsift transcript get <session> --from 0 --to 600000000
vsift search <session> --query "budget"

Local transcription needs whisper.cpp and a model; vsift setup check says whether they are in place, and on systems other than Ubuntu 24.04 x64 you point VSift at your own copy. Add --json for output a program can read.

VSift ships an agent skill that takes an AI assistant from a local video to a grounded, cited handoff: it knows the method, the evidence budgets and the safety rules, such as never installing tools on its own. Copy skills/vsift into your agent's skill folder (Claude Code: ~/.claude/skills/vsift/; Codex: ~/.agents/skills/vsift/) and ask about a recording. The skill has been trialled with Claude Code and Codex; other assistants that can run local commands can call the same CLI, but they have not been tried.

Please look at ./checkout-bug.mp4 and tell me what status and build number the
presenter reports. Use the VSift skill.

In named-client trials on this repository's synthetic recordings, the smaller models passed 26 of 28 (Claude Sonnet 5.5) and 28 of 28 (GPT-6-Sol; 23 of 28 as run, before the maintainer's reading of one command) full trials, and no run installed anything, leaked a secret or acted on injected text. These are small trials on synthetic video, and the qualification record lists the misses and the limits. Setup and details: using the skill.

Principles

  • Local first. Routine inspection never uploads a recording to a hosted service.
  • Disposable by default. Sessions expire unless you retain them; cleaning up is an explicit command that only touches what VSift created.
  • Source grounded. The original video and audio remain authoritative.
  • Agent friendly. Commands provide stable, versioned JSON alongside readable terminal output.
  • Provider neutral. FFmpeg, speech recognition and future integrations sit behind explicit boundaries.
  • Careful by construction. Shell-free processes, verified and size-bounded downloads, bounded execution, and contained cleanup. Releases carry npm provenance and Sigstore attestations for every file.

Five Rust crates with dependencies pointing inward: vsift-cli depends on the vsift engine, which depends on vsift-infrastructure, then vsift-application, then vsift-domain at the centre. The vsift-contract crate sits beside the engine, and hosts depend only on vsift and vsift-contract. FFmpeg, FFprobe and whisper.cpp run as separate external processes. Rules: no shell, no unsafe code, typed errors, verified and size-bounded downloads.

The architecture overview explains each layer and the boundaries between them.

Built in the open

VSift is built in public, with its reasoning written down. The claims on this page point at records you can read.

📜 Decision records
Every architectural choice, with the options that were weighed and why one won.
Read the decisions
🧪 Qualification records
The evidence behind each work packet, misses and limits included.
Read the records
🚧 Known limits
What is not proven yet, written down before anyone has to ask.
Read the limits
📒 Delivery ledger
The plan as data: every packet, requirement and test, checked on every pull request.
Open the ledger
🔏 Build provenance
Every release file has a checksum and a Sigstore build-provenance attestation; the npm packages carry npm provenance.
Verify a download
🛡️ Threat model
What VSift defends against, and how to report a vulnerability.
Threat model · Security policy

Honest status

VSift is at 0.1.0, a pre-release: the first release of R0, whose full qualification (P14) is in progress. It is not a stable release, and no platform is "supported" yet. The next release, 0.2.0, has a candidate: 0.2.0-rc.3 is a release candidate under qualification and is not announced (it replaces 0.2.0-rc.1 and 0.2.0-rc.2, the first two candidates, which stay published), and the evidence gathered so far, with its gaps, is recorded in the release evidence ledger (p14-evidence-ledger.json).

  • Works today: the whole journey above, on recordings you point it at: ingest, transcript import or local recognition, search, visual candidates, frames, crops, audio, recoverable jobs, a worker-host mode for supervisors, handoff check, and installation from npm or native archives.
  • Measured on a synthetic corpus. Every accuracy figure so far comes from synthetic recordings and a synthetic voice. Real recordings come with the post-R0 trial.
  • Platforms: built for Windows 11 x64, macOS 15 (Apple silicon) and Linux x64. On hosted test machines the published 0.1.0 has installed with npm, pnpm, Yarn and Bun on all three and run the speech and screen-change journeys; a hosted machine is not a clean one, and nobody has yet run VSift on a Mac. Managed tool installation is tested on Ubuntu 24.04 x64 only. Codex's Windows sandbox cannot run VSift today (#204). The support matrix lists what each machine has shown and what is still missing.
  • The executables are not code-signed or notarized. Windows SmartScreen or macOS Gatekeeper may warn about a file you download directly; the installation guide says what to expect and how to verify a download instead.
  • What is next: R0 completes with P14, the release qualification. R1 then adds managed cross-video indexing, enrichment, reconstruction and operated worker growth.

Roadmap. Done: work packets P00 to P13, each with its evidence, and the 0.1.0 pre-release on npm under the next tag. Now: P14, the release qualification with trials and campaigns. Next: release candidates 0.2.0-rc.N under next, then 0.2.0, the R0 release on npm latest, then R1: cross-video indexing, enrichment and workers. Planned steps are plans, not dates.

The roadmap comes from the delivery ledger, ADR 0024 for the release steps and the R1 plan.

Documentation

I want to… Read
Install VSift, upgrade or uninstall it Installation guide
Learn to use it, step by step User guide · command reference
Give my agent the skill Using the skill
Script against the CLI v1 CLI contract · JSON schemas
Run it as a supervised worker Worker-host runbook
Understand the design Architecture · decision records
See what each machine has shown Support matrix
See what is proven, and what is not Qualification records · known limits
Check a release Release runbook
Report a vulnerability Security policy

Data lifecycle

VSift keeps three storage lifecycles apart:

  1. Ephemeral investigation sessions, the default, which become cleanup-eligible after they expire.
  2. Portable evidence bundles, retained only where you choose.
  3. A future opt-in persistent catalogue for cross-video indexing. No one-off recording is ever silently added to a permanent global index.

Build from source

Install the stable Rust toolchain, including rustfmt and Clippy, then:

cargo fmt --all --check
cargo clippy --workspace --all-targets --all-features --locked -- -D warnings
cargo test --workspace --locked

Repository conventions are in Development. Contributions are welcome; please read Contributing and the Security policy first.

Licence

Licensed under either the Apache License, Version 2.0 or the MIT licence, at your option.

来源:GitHub · github.com