https://github.com/rororowyourboat/murmur
Record, transcribe, and summarize meetings locally via PipeWire + FFmpeg. Plugin architecture with faster-whisper, pyannote, and Ollama support.
https://github.com/rororowyourboat/murmur
cli ffmpeg meeting-recorder pipewire python transcription whisper
Last synced: about 1 month ago
JSON representation
Record, transcribe, and summarize meetings locally via PipeWire + FFmpeg. Plugin architecture with faster-whisper, pyannote, and Ollama support.
- Host: GitHub
- URL: https://github.com/rororowyourboat/murmur
- Owner: rororowyourboat
- Created: 2026-03-18T11:07:19.000Z (3 months ago)
- Default Branch: main
- Last Pushed: 2026-03-19T20:31:33.000Z (3 months ago)
- Last Synced: 2026-03-20T10:39:41.171Z (3 months ago)
- Topics: cli, ffmpeg, meeting-recorder, pipewire, python, transcription, whisper
- Language: Python
- Size: 313 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# murmur
Record system audio from meetings (Zoom, Google Meet, Teams, etc.) on Linux using PipeWire + FFmpeg.
## Why
No-fuss local meeting recording — hit a keyboard shortcut when a call starts, hit it again when it ends. Audio is saved locally, no cloud services or meeting bots needed.
## Goals
- **Simple toggle workflow** — one shortcut key to start/stop recording, with desktop notifications
- **Universal** — captures any audio playing through your speakers/headphones, works with any meeting app
- **Local-first** — recordings stay on disk at `~/Recordings/meetings/`, no uploads
- **Low overhead** — just FFmpeg recording a PipeWire monitor source
- **Future: transcription** — pipe recordings through Whisper or a transcription API for searchable meeting notes
## How it works
1. Discovers PipeWire audio sinks via `wpctl`
2. Attaches to the **monitor source** of your default output device (captures everything you hear)
3. Records via FFmpeg's PulseAudio input (`pipewire-pulse` compatibility layer)
4. Saves audio file + JSON metadata (timestamps, source, duration)
## Requirements
- Linux with PipeWire + `pipewire-pulse`
- FFmpeg
- `wpctl` (WirePlumber)
- `notify-send` (for desktop notifications from toggle)
- Python 3.14+ / uv
## Install
```bash
# Core only (recording, toggle, watch, devices)
uv pip install murmur
# With TUI dashboard
uv pip install murmur[tui]
# With AI summarization (DSPy + LiteLLM)
uv pip install murmur[ai]
# With transcription (faster-whisper)
uv pip install murmur[transcribe]
# Everything
uv pip install murmur[all]
# Or run from the project directory
uv run murmur --help
```
## Usage
```bash
# List audio output devices
murmur devices
# Start recording (interactive, Ctrl+C to stop)
murmur start
murmur start --tag standup --format mp3
# Toggle recording on/off (for keyboard shortcuts)
murmur toggle
# Check recording status
murmur status
# List saved recordings
murmur list
```
## Meeting detection
Murmur can watch for meeting apps (Zoom, Google Meet, Teams, etc.) using your microphone and notify you — or automatically start recording.
```bash
# Get notified when a meeting app grabs your mic
murmur watch
# Auto-record when a meeting is detected
murmur watch --auto-record
# Auto-record with mic input (dual-channel: system left, mic right)
murmur watch --auto-record --mic
# Faster polling (default: 5s)
murmur watch --interval 3
```
Works by polling PipeWire for `Stream/Input/Audio` nodes — detects Chrome, Firefox, Zoom, Teams, Slack, Discord, WebEx, Skype, and more. When the app releases the mic, you get a second notification and auto-recording stops.
## Keyboard shortcut
**Super+Shift+R** toggles recording on/off with a desktop notification.
Set up via GNOME custom shortcuts — runs `murmur toggle` in the background.
## Recordings
Saved to `~/Recordings/meetings/` with naming convention:
```
meeting_standup_2026-03-18_14-30-00.flac
meeting_standup_2026-03-18_14-30-00.json # metadata
```
## Configuration
Optional TOML config at `~/.config/murmur/config.toml`:
```toml
[recording]
output_dir = "~/Recordings/meetings"
format = "flac"
[watch]
interval = 3
auto_record = true
apps = ["chrome", "firefox", "zoom", "teams", "slack", "discord"]
[transcribe]
auto = true # auto-transcribe after recording
model = "base" # whisper model size
language = "en"
[summarize]
auto = true # auto-summarize after transcription
model = "llama3" # ollama model
ollama_url = "http://localhost:11434"
[diarize]
hf_token = "hf_..." # hugging face token for pyannote
```
## Plugins
| Plugin | Command | What it does | Install |
|---|---|---|---|
| **watch** | `murmur watch` | Detect meeting apps using the mic, notify + auto-record | built-in |
| **memory** | `murmur memory` | Personal context for LLM summaries | built-in |
| **tui** | `murmur tui` | Live dashboard with artifact viewer + generation | `murmur[tui]` |
| **summarize** | `murmur summarize ` | DSPy structured summarization → `.summary.md` | `murmur[ai]` |
| **transcribe** | `murmur transcribe ` | Whisper transcription → `.txt` + `.srt` | `murmur[transcribe]` |
| **diarize** | `murmur diarize ` | Speaker diarization → `.rttm` + `.diarized.txt` | `murmur[diarize]` |
## Development
```bash
# Set up dev environment
make install
# Run all checks (lint + format + test)
make check
# Individual targets
make lint # ruff check
make format # ruff format (auto-fix)
make format-check # ruff format --check (CI mode)
make test # pytest
make fix # ruff check --fix
```
## Roadmap
- [ ] Automatic transcription (Whisper local / Deepgram API)
- [ ] Speaker diarization
- [x] Auto-detect meeting apps and start recording
- [ ] Web UI for browsing/searching recordings