Local CLI Meeting Recorder for Linux: Stereo Speaker Separation and AI Summaries
The CLI tool tapeback captures audio via PipeWire/PulseAudio, transcribes with faster-whisper, separates speakers by stereo channels, and generates summaries using LLMs. The result is a Markdown file dropped into your specified directoryβeven Obsidian vaults. One command starts recording, Ctrl+C ends it and kicks off the pipeline: capture β transcription β diarization β summary.
Supports Zoom, Teams, Meet, Discord, Telegram. Captures system audioβno service APIs needed.
tapeback start
# meeting happens
# Ctrl+C β processing β Markdown
Stereo Speaker Separation
The architecture leverages stereo WAV files: left channel for your mic ("You"), right channel for the monitor source (everyone else). Whisper processes each channel separately. Pyannote diarization runs only on the right channel to label Speaker 1, 2, etc. Segments are classified by RMS energy levels.
Physical channel separation eliminates clustering errors: no mix-ups between similar voices, no splitting one speaker across clusters. GPU acceleration speeds things up, with CPU fallback on CUDA errors.
βββββββββββββββ ββββββββββββββββ ββββββββββββββββββββββ
β Stereo β β Whisper β β Channel β
β WAV file βββββΆβ (per βββββΆβ Classification: β
β L: mic β β channel) β β L β "You" β
β R: monitor β β β β R β pyannote β
βββββββββββββββ ββββββββββββββββ β for Others β
ββββββββββββββββββββββ
Optional Dependencies
Base install (~320 MB): recording + transcription. Extras skip the 2 GB PyTorch bloat you don't need:
| Variant | Adds | Size |
|---------------|-----------------------|--------|
| tapeback | Recording + Whisper | ~320 MB|
| [llm] | Summaries (Anthropic, OpenAI, Groq...) | +50 MB |
| [diarize] | pyannote + PyTorch | +2 GB |
| [tray] | System tray | +1 MB |
Graceful degradation: no pyannote? Right channel becomes "Other". Lazy imports in __init__.
LLM Integration with Fallbacks
Supports 7 providers: Anthropic, OpenAI, Groq, Gemini, DeepSeek, OpenRouter, Qwen. OpenAI-compatible ones use a unified API with base URLs:
_OPENAI_COMPATIBLE_BASE_URLS = {
"groq": "https://api.groq.com/openai/v1",
"gemini": "https://generativelanguage.googleapis.com/v1beta/openai/",
"deepseek": "https://api.deepseek.com",
# ...
}
Provider error? Auto-fallback to the next. Transcripts always save. Summary in JSON embedded in Markdown:
## Summary
Quick overview.
### Action Items
- [ ] **You:** Send report by Friday
- [ ] **Speaker 1:** Review PR
### Key Decisions
- PostgreSQL over MongoDB
Packaging for Arch Linux
Available in AUR as 4 meta-packages:
tapebackβ core.tapeback-trayβ tray.tapeback-llmβ LLM support.tapeback-diarizeβ PyTorch + pyannote.
yay handles pip deps in a venv. Release via release.sh + PyPI CI (Trusted Publisher) + AUR scripts.
yay -S tapeback tapeback-diarize tapeback-llm tapeback-tray
Config in ~/.config/tapeback/.env:
TAPEBACK_VAULT_PATH=~/Documents/obsidian/vault
Development and Lessons Learned
MVP in 3 days, v0.8.9 in 2 weeks (bugs, tests). Spec-driven: Markdown specs with done criteria. Code from Claude with reviews. Check PyPI/AUR names earlyβnormalization makes echo-vault == echovault.
Key Takeaways
- Stereo separation: Mic (You) vs monitor (Others)βdeterministic, skips pyannote's probabilistic errors.
- Local processing: faster-whisper + optional PyTorch, no cloud.
- Modularity: Extras for diarization/LLM/tray, with smooth fallbacks.
- Integration: Markdown for Obsidian with JSON summaries (action items, decisions).
- Installation:
uv tool install tapeback[tray,diarize,llm]or AUR.
β Editorial Team
No comments yet.