Capture Helper
Capture Helper belongs to a collection of libraries called AI Helpers developed for building Artificial Intelligence.
Local-first library that turns a live camera or microphone into data the rest of the AI Helpers suite already knows how to consume, plus a browser GUI for arranging several such sources at once. A camera feed becomes a stream of ordinary images: iter_camera_frames yields one array per frame, a grid of pixel colors with a height, a width, and three color channels stored blue, then green, then red (the format OpenCV and the rest of this suite use, called BGR uint8), matching video-helper's extract_frames. A microphone feed becomes a stream of sound samples: iter_mic_audio yields MicFrames, small chunks of raw audio measurements taken over time (pulse-code modulation, or PCM), matching podcast-helper's extract_audio_stream. Because both iterators speak the same shapes as their sibling packages, code written against a recorded video file or a downloaded podcast runs unchanged against a live camera or microphone. On top of that, the GUI lets you drag several live sources onto a canvas, preview them in the browser, and save the layout as a reusable JSON scene the CLI or API can replay later. The two iterators are the stable foundation; the scene configurator, added more recently, builds on top of them.
The Promise
Local-first by design. capture-helper runs entirely on your machine; camera and microphone data is captured and processed locally, never uploaded to any third-party service, with no telemetry, no account, no cloud lock-in. Part of the AI Helpers suite: sovereignty over your data through local-first Open Source.
Documentation
Features
Here is exactly what exists today.
Capture layer (stable contracts)
SourceKindliteral ("camera"|"microphone")Sourcetyped dict (kind, name, index, platform, driver)MicFrametyped dict, mirroringpodcast_helper.PcmFramelist_sources(kind=None): cross-platform device enumeration viaffmpeg -list_devices(macOS avfoundation, Windows dshow, Linux v4l2 + pulse)pick_source(kind, *, name_substring=..., index=...): picks the first matching device, raisesValueErrorif nothing matchesiter_camera_frames(source, *, width=..., height=..., output_width=..., output_height=..., fps=..., max_frames=...): yields(H, W, 3)BGR uint8 numpy arrays, the same contract asvideo_helper.extract_framesiter_mic_audio(source, *, target_sample_rate=16000, to_mono=True, frame_ms=20): async iterator yieldingMicFrames, the same contract aspodcast_helper.extract_audio_streamffmpeg_input_args(source): a low-level helper exposed for users wiring their own ffmpeg pipelines
Live multi-source scene configurator (new, additive)
- Browser GUI at
GET /gui: enumerate all cameras and microphones, drop them onto a 16:9 canvas, live-preview each camera as an in-browser MJPEG stream, watch live microphone level meters, drag them into place, then save the visual design as a reusable JSON scene (and load one back). No build step: vanilla JS + Tailwind CDN. - Scene model:
Scene/SceneSourcetyped dicts,new_scene(...),add_source(...),validate_scene(...),save_scene(...),load_scene(...),resolve_scene_sources(...)(maps a scene onto the current machine's devices),scene_from_available_devices(...). - Live-preview primitives:
snapshot_jpeg(source)(one live JPEG),iter_camera_jpeg(source)(JPEG stream for MJPEG),mic_level(source)(RMS / peak dBFS for a VU meter),frame_to_jpeg(frame). - Scene CLI:
capture-helper scene-auto(auto-populate from devices),scene-validate,scene-show(reports how each source resolves here). - Scene / preview HTTP endpoints:
GET /scene,POST /scene/save,POST /scene/load,GET /preview/camera.jpg,GET /preview/camera.mjpeg,GET /preview/mic-level.
What makes this more than a live-preview widget is that the layout itself becomes data: arranging cameras and microphones on the canvas produces a portable JSON file, so the same scene can be replayed later, on a different machine, from the command line, with no browser involved.
import asyncio
import capture_helper as ch
# Enumerate available devices
for s in ch.list_sources():
print(f"{s['kind']:10s} [{s['index']}] {s['name']:40s} (driver={s['driver']})")
# camera [0] FaceTime HD Camera (driver=avfoundation)
# microphone [0] Built-in Microphone (driver=avfoundation)
# Camera → numpy BGR frames (drop-in for video_helper.extract_frames)
cam = ch.pick_source("camera")
for frame in ch.iter_camera_frames(cam, output_width=640, output_height=360,
fps=30, max_frames=300):
# frame.shape == (360, 640, 3), dtype uint8, BGR.
do_something(frame)
# Microphone → async PCM stream (drop-in for podcast_helper.extract_audio_stream)
async def listen():
mic = ch.pick_source("microphone")
async for f in ch.iter_mic_audio(mic, target_sample_rate=16000,
to_mono=True, frame_ms=20):
# f["pcm"].shape == (320,), 20ms of audio at 16kHz mono.
await asr.feed(f["pcm"])
asyncio.run(listen())
Installation
Prerequisites: Python 3.10-3.13 and git, ffmpeg, PortAudio, cross-platform:
- 🍎 macOS (Homebrew):
brew install python git ffmpeg portaudio - 🐧 Ubuntu/Debian:
sudo apt update && sudo apt install -y python3 python3-pip git ffmpeg portaudio19-dev - 🪟 Windows (PowerShell):
winget install Python.Python.3.12 Git.Git Gyan.FFmpeg(PortAudio ships inside the Python wheels)
We recommend using Python environments. Check this link if you're unfamiliar with setting one up: 🥸 Tech tips.
You still need ffmpeg on PATH for device enumeration and live capture to return anything.
From PyPI (recommended)
# Core INPUT layer (list/pick sources, camera + mic iterators)
pip install capture-helper
# Optional surfaces
pip install "capture-helper[cli]" # click-based CLI twin
pip install "capture-helper[api]" # FastAPI HTTP surface
From source (no PyPI)
git clone https://github.com/warith-harchaoui/capture-helper.git
cd capture-helper
pip install -e .
# Optional surfaces
pip install -e ".[cli]"
pip install -e ".[api]"
Roadmap
| Version | Layer | Scope |
|---|---|---|
| v0.0.1 | INPUT scaffold | list_sources + types |
| v0.1.0 | INPUT | pick_source(...), iter_camera_frames(source, ...), iter_mic_audio(source, ...); composes with the video-helper / podcast-helper contracts |
| v0.3.0 (this release) | SCENES + GUI | Scene model (save / load / validate / resolve), live-preview primitives (camera JPEG / MJPEG, mic level), and the browser-based live multi-source scene configurator at /gui |
| next | INPUT extended | Screen / window capture; basic filter chain (noise gate, gain, scale) |
| later | PROCESS | Multi-source mixer: mix_audio([sources], levels=[...]) + compose_video([sources], layout=...), running a saved scene into a single output |
For a full cookbook (per-OS ffmpeg input strings, snapshot capture, live preview, scene save/load, ASR / VAD wiring), see 📋 EXAMPLES.md. For the exhaustive trigger catalogue, see 📋 TRIGGERS.md.
Multi-surface exposure
capture-helper ships the same capabilities through six surfaces, so it plugs in wherever you already work with no rewrite needed.
| Surface | Install | Entry point | Use case |
|---|---|---|---|
| Python library | pip install capture-helper |
import capture_helper as ch |
Notebooks, scripts, other AI Helpers |
| argparse CLI | (no extra) | capture-helper … |
Shells, cron, CI, container CMD |
| click CLI | [cli] extra |
capture-helper-click … |
Users on a click-native stack (completion, colored --help) |
| FastAPI HTTP | [api] extra |
uvicorn capture_helper.api:app |
Reverse-proxied service, JSON / multipart clients |
| Browser GUI | [api] extra |
GET /gui |
Live multi-source scene configurator (preview + arrange + save) |
| MCP | [mcp] extra |
capture-helper-mcp |
Any MCP-aware agent host (same FastAPI app, /mcp endpoint) |
# CLI (argparse, always available)
capture-helper list-sources
capture-helper pick-source --kind camera --name FaceTime
capture-helper capture-mic --output mic.wav --seconds 3
capture-helper stream-mic | my-live-consumer # raw f32le PCM, unbounded
# CLI (click twin, same subcommands)
capture-helper-click list-sources
capture-helper-click capture-camera --output-dir frames/ \
--output-width 640 --output-height 360 --max-frames 30
# HTTP surface
uvicorn capture_helper.api:app --host 0.0.0.0 --port 8000
curl http://localhost:8000/sources
curl -o frames.zip \
'http://localhost:8000/capture/camera?output_width=320&output_height=240&max_frames=10'
# Browser GUI: live multi-source scene configurator
uvicorn capture_helper.api:app --port 8000
# open http://localhost:8000/gui (or just http://localhost:8000/)
# Docker (ships FastAPI + GUI by default)
docker build -t capture-helper .
docker run --rm -p 8000:8000 capture-helper
The GUI at /gui is the live multi-source scene configurator: it enumerates your cameras and microphones, live-previews each camera (MJPEG) and each mic (level meter), lets you arrange them on a canvas, and saves the design as a reusable .scene.json the CLI / API can replay. See 📋 GUI.md.
Author
Acknowledgements
Special thanks to Mohamed Chelali and Bachir Zerroug for fruitful discussions.
License
This project is licensed under the BSD-3-Clause License; see the LICENSE file for details.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file capture_helper-1.2.2.tar.gz.
File metadata
- Download URL: capture_helper-1.2.2.tar.gz
- Upload date:
- Size: 72.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9edf74993483935bbec18d19b499e789ba2e700e21f5ed5f2012b444cd5b07c2
|
|
| MD5 |
b3a66d7d15c27f0572fb3c73dd98d5c8
|
|
| BLAKE2b-256 |
88d2a25e4fc7207656e4993706fb9239677341f285d8fb6e124bda60d6492a92
|
File details
Details for the file capture_helper-1.2.2-py3-none-any.whl.
File metadata
- Download URL: capture_helper-1.2.2-py3-none-any.whl
- Upload date:
- Size: 63.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
74c4d71929c371156a5264af06c31072548cfeb8266c3deb16e20fcd818220ba
|
|
| MD5 |
dfc2403c6bb989ec00ee7b948963e14a
|
|
| BLAKE2b-256 |
fdff964baf3d461a1382fa4c942fd06279b39f0df58906dbefce2c1e90b58919
|