An open API service indexing awesome lists of open source software.

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.

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