Live Recording
Always-on environmental audio capture. Records continuously, transcribes with whisper-cpp (Metal-accelerated), appends timestamped entries to an org file viewable live in Emacs.
Activation
1. Start tmux capture session
tmux new-session -d -s capture \
'while true; do bash ~/v/scripts/always-on-capture.sh; echo "[restart] $(date)"; sleep 2; done'
The auto-restart loop ensures crash resilience. The script records 6s WAV chunks via ffmpeg avfoundation device :1, silence-detects via sox RMS (< 0.005), transcribes non-silent chunks with whisper-cli --model ~/v/ggml-base.en.bin, and appends ** [timestamp]\ntext\n entries to ~/v/audio-capture.org.
2. Open in Emacs with live updates
M-x server-start ;; required for emacsclient
C-x C-f ~/v/audio-capture.org ;; open the file
M-x auto-revert-tail-mode ;; live tail as entries append
auto-revert-tail-mode (not auto-revert-mode) tails the end of the buffer as new entries arrive, keeping your cursor at the latest transcription.
3. Monitor (optional)
tmux attach -t capture # watch capture output
tail -f ~/v/audio-capture.org # terminal tail
Stopping
tmux kill-session -t capture
Configuration (in always-on-capture.sh)
| Variable | Default | Purpose |
|---|---|---|
AUDIO_DEVICE |
:1 |
avfoundation device (:0 = screen, :1 = mic) |
CHUNK_SECONDS |
6 |
Recording window per chunk |
SILENCE_THRESHOLD |
0.005 |
RMS below this = silence (suppressed) |
MIN_TEXT_LEN |
6 |
Discard transcriptions shorter than this |
MODEL |
~/v/ggml-base.en.bin |
Whisper GGML model path |
ORG_FILE |
~/v/audio-capture.org |
Output org file |
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| All chunks "no audio" | Wrong device index | ffmpeg -f avfoundation -list_devices true -i "" to find mic |
| All chunks "silence" | Threshold too high | Lower SILENCE_THRESHOLD in script (default 0.005) |
| Emacs not updating | No server-start | M-x server-start then reopen file |
| Emacs not tailing | Wrong mode | Use auto-revert-tail-mode not auto-revert-mode |
| Script exits immediately | set -e + non-fatal error |
Script uses set -uo pipefail (no -e) |
Related Files
~/v/audio-capture.org-- live output file~/v/scripts/always-on-capture.sh-- capture script~/v/audio_acset.duckdb-- structured audio database (ACSets schema)~/v/scripts/audio-capture-org.py-- Python/mlx-whisper alternative