Skip to main content

Local meeting recorder with transcription and speaker diarization for Obsidian

Project description

tapeback

Local meeting recorder for Linux. Records system audio + microphone via PipeWire/PulseAudio, transcribes with Whisper, identifies speakers, saves Markdown to your Obsidian vault. Everything runs on your machine, no cloud services or API calls needed for transcription.

Works with any video call platform: Google Meet, Zoom, Teams, Telegram, Discord, Slack huddles.

tapeback in Obsidian

Features

  • Live transcription: read the transcript while the meeting is still going — Whisper transcribes in the background every 60 seconds
  • Platform-agnostic: captures OS-level audio, works with any app
  • Local transcription: faster-whisper on CPU or CUDA GPU
  • Speaker diarization: pyannote identifies who said what
  • Stereo channel separation: your mic (left) vs. others (right) for accurate "You" attribution
  • Obsidian-native output: Markdown with YAML frontmatter, wikilinks to audio files
  • LLM summarization: Anthropic, OpenAI, Groq, Gemini, DeepSeek, OpenRouter, Qwen (with automatic provider fallback)
  • System tray: start/stop recording from the tray icon, no terminal needed
  • CLI-first: tapeback start, Ctrl+C to stop, done

tapeback is modular — the base package handles recording and transcription. Speaker diarization and LLM summaries are optional and installed separately.

Installation

Arch Linux (AUR)

yay -S tapeback                              # recording + transcription
yay -S tapeback tapeback-tray                # + system tray icon
yay -S tapeback tapeback-llm                 # + LLM summaries
yay -S tapeback tapeback-diarize             # + speaker diarization
yay -S tapeback tapeback-tray tapeback-llm tapeback-diarize  # everything

All system dependencies (ffmpeg, PipeWire) are installed automatically.

pip / uv

Install system dependencies first:

# Arch / Manjaro
sudo pacman -S python uv ffmpeg pipewire-pulse

# Ubuntu / Debian
sudo apt install python3 pipx ffmpeg pulseaudio-utils

# Fedora
sudo dnf install python3 pipx ffmpeg pipewire-pulseaudio

Then install tapeback:

uv tool install tapeback                          # recording + transcription
uv tool install "tapeback[tray]"                  # + system tray icon
uv tool install "tapeback[llm]"                   # + LLM summaries
uv tool install "tapeback[diarize]"               # + speaker diarization
uv tool install "tapeback[tray,llm,diarize]"      # everything
pipx or Nix
# pipx
pipx install tapeback
pipx install "tapeback[tray,llm,diarize]"         # everything

# Nix
nix run github:yastcher/tapeback                  # basic
nix run github:yastcher/tapeback#tray             # + system tray icon
nix run github:yastcher/tapeback#llm              # + LLM summaries
nix run github:yastcher/tapeback#diarize          # + speaker diarization
nix run github:yastcher/tapeback#full             # everything

Quick start

tapeback start                     # start recording, Ctrl+C to stop

That's it. The transcript is saved to ~/tapeback/meetings/.

To save to your Obsidian vault instead:

mkdir -p ~/.config/tapeback
echo 'TAPEBACK_VAULT_PATH=~/Documents/obsidian/vault' > ~/.config/tapeback/.env

System tray

Run without a terminal — right-click the tray icon to start/stop recording:

tapeback tray

Icon color shows the current state: gray = idle, red = recording, orange = processing.

To autostart on login, create ~/.config/autostart/tapeback-tray.desktop:

[Desktop Entry]
Name=tapeback
Exec=tapeback tray
Type=Application
X-GNOME-Autostart-enabled=true

Works on any XDG-compatible desktop (KDE, GNOME, Hyprland, Sway, etc.).

Speaker diarization

Speaker diarization identifies who said what in the recording. Without it, tapeback uses stereo channels: your mic is labeled "You", everything else is labeled "Other".

To enable diarization, you need a HuggingFace token with access to pyannote models:

  1. Create account at huggingface.co
  2. Accept license at pyannote/speaker-diarization-3.1
  3. Accept license at pyannote/segmentation-3.0
  4. Create token at huggingface.co/settings/tokens
  5. Add to ~/.config/tapeback/.env:
TAPEBACK_HF_TOKEN=hf_your_token_here

First run downloads the pyannote model (~1 GB). An NVIDIA GPU is strongly recommended — diarization on CPU is very slow.

LLM summarization

After transcription, tapeback can add a brief summary, action items, and key decisions using an LLM.

Set an API key for at least one provider in ~/.config/tapeback/.env:

TAPEBACK_LLM_PROVIDER=gemini
GEMINI_API_KEY=...
Provider Env var Default model
anthropic ANTHROPIC_API_KEY claude-sonnet-4-20250514
openai OPENAI_API_KEY gpt-4o
groq GROQ_API_KEY llama-3.3-70b-versatile
gemini GEMINI_API_KEY gemini-2.5-flash
openrouter OPENROUTER_API_KEY google/gemini-2.5-flash:free
deepseek DEEPSEEK_API_KEY deepseek-chat
qwen DASHSCOPE_API_KEY qwen-turbo

If the primary provider fails, tapeback automatically tries the next available provider (any provider with an API key set).

CLI reference

tapeback start [NAME]              Start recording (Ctrl+C to stop)
tapeback stop                      Stop recording from another terminal
tapeback tray                      System tray icon
tapeback process <FILE> [--name N] Transcribe an existing audio file
tapeback summarize <FILE>          Add LLM summary to transcript
tapeback status                    Show recording status and settings
tapeback start --no-live           # disable live transcription (old mode)
tapeback start --no-diarize        # skip speaker identification
tapeback start --no-summarize      # skip LLM summary
tapeback process meeting.mp3 --name "weekly-standup"
tapeback summarize notes.md --provider gemini --model gemini-2.5-pro

Output format

Stereo recordings produce two transcript sections:

  • Transcript — raw Whisper output with channel-based labels (You / Other)
  • Diarized Transcript — speaker-identified output (You / Speaker 1 / Speaker 2 / ...)

Words where Whisper is uncertain (probability < 0.5) are shown in italics.

---
date: 2026-03-23
time: "14:30"
duration: "01:23:45"
language: en
audio: "[[attachments/audio/2026-03-23_14-30-00.wav]]"
tags:
  - meeting
  - transcript
---

## Summary

Brief overview of the meeting.

### Action Items

- [ ] **You:** Send the report by Friday
- [ ] **Speaker 1:** Review the PR

### Key Decisions

- Use PostgreSQL instead of MongoDB

---
# Meeting 2026-03-23 14:30

**Duration:** 1h 23m 45s | **Language:** en

---

## Transcript

[00:00:01] **You:** Hello, let's start with the *backend* changes.

[00:01:23] **Other:** Sure, I have the slides ready.

---

## Diarized Transcript

[00:00:01] **You:** Hello, let's start with the *backend* changes.

[00:01:23] **Speaker 1:** Sure, I have the slides ready.

[00:02:45] **Speaker 1:** Can we move on to the frontend?

Configuration reference

All settings via environment variables (prefix TAPEBACK_) or ~/.config/tapeback/.env file.

Core

Variable Default Description
TAPEBACK_VAULT_PATH ~/tapeback Path to output directory (Obsidian vault)
TAPEBACK_MEETINGS_DIR meetings Subdirectory for meeting notes
TAPEBACK_ATTACHMENTS_DIR attachments/audio Subdirectory for audio files

Transcription

Variable Default Description
TAPEBACK_WHISPER_MODEL large-v3-turbo Whisper model (tiny, base, small, medium, large-v3-turbo)
TAPEBACK_LANGUAGE auto Language code (auto for auto-detection, or en, ru, fr, etc.)
TAPEBACK_DEVICE cuda cuda or cpu
TAPEBACK_COMPUTE_TYPE auto auto, float16, int8, or float32 (auto picks int8 when free VRAM < 4 GiB)
TAPEBACK_BEAM_SIZE 5 Whisper beam search width
TAPEBACK_CHUNK_LENGTH 7 Max VAD chunk (seconds) before splitting for Whisper; prevents lost speech after long pauses
TAPEBACK_NO_SPEECH_THRESHOLD 0.4 Whisper silence-rejection threshold (lower = more aggressive; suppresses training-data hallucinations on pauses)
TAPEBACK_PAUSE_THRESHOLD 1.0 Seconds; split segments on silence gaps >= this

Live transcription

Variable Default Description
TAPEBACK_LIVE true Enable live transcription during recording
TAPEBACK_LIVE_INTERVAL 60 Seconds between transcription cycles
TAPEBACK_LIVE_OVERLAP 2.0 Seconds of overlap between chunks
TAPEBACK_LIVE_MIN_CHUNK 5.0 Minimum new audio (seconds) to trigger transcription

Audio

Variable Default Description
TAPEBACK_MONITOR_SOURCE auto PulseAudio monitor source name
TAPEBACK_MIC_SOURCE auto PulseAudio mic source name
TAPEBACK_SAMPLE_RATE 48000 Recording sample rate

Speaker diarization

Variable Default Description
TAPEBACK_DIARIZE true Enable speaker diarization
TAPEBACK_HF_TOKEN (empty) HuggingFace token (setup)
TAPEBACK_MAX_SPEAKERS (auto) Maximum number of speakers
TAPEBACK_SPECTRAL_MERGE_THRESHOLD 0.96 Spectral speaker merging (0 = off; lower merges more aggressively)

LLM summarization

Variable Default Description
TAPEBACK_SUMMARIZE true Enable LLM summarization
TAPEBACK_LLM_PROVIDER anthropic Primary provider (list)
TAPEBACK_LLM_API_KEY (empty) API key (or use provider-specific env var)
TAPEBACK_LLM_MODEL (provider default) Override model name

Uninstall

# Arch Linux
yay -R tapeback tapeback-tray tapeback-diarize tapeback-llm

# pip / uv
uv tool uninstall tapeback

# Remove cached ML models (~2-5 GB)
# Skip if you use HuggingFace for other projects
rm -rf ~/.cache/huggingface/

Roadmap

  • Speaker profiles: learn and remember recurring speakers across meetings
  • Multi-language meetings: detect and handle language switches mid-meeting
  • Windows support: WASAPI loopback capture

Support

If you find tapeback useful, consider a small donation:

USDT (TRC-20) ADA (Cardano)
TAECw9FebnoSN2n3H2Fk9Bv5aA8fwpCuBB addr1q9tqg2g8wxpxawsrvea84lms3ampuda0ygzawuxq77sxwr48mxj2vq2rzd4nsmhpdhy6lftp30tz78tetzr29mtvkqmsskrmp7

Links

License

Apache-2.0. See LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

tapeback-0.9.1.tar.gz (222.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

tapeback-0.9.1-py3-none-any.whl (51.6 kB view details)

Uploaded Python 3

File details

Details for the file tapeback-0.9.1.tar.gz.

File metadata

  • Download URL: tapeback-0.9.1.tar.gz
  • Upload date:
  • Size: 222.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for tapeback-0.9.1.tar.gz
Algorithm Hash digest
SHA256 8e6c58c2634d8949631e9bf0a90804f948574f54360a064b5095893261a6dbfa
MD5 a47da56fd2b7606cc59d0da83cade629
BLAKE2b-256 3c5acfdea40bda33c3073fec2c2656b70320a7b4787ef4b9ecf662159ab5ee07

See more details on using hashes here.

Provenance

The following attestation bundles were made for tapeback-0.9.1.tar.gz:

Publisher: publish.yml on yastcher/tapeback

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tapeback-0.9.1-py3-none-any.whl.

File metadata

  • Download URL: tapeback-0.9.1-py3-none-any.whl
  • Upload date:
  • Size: 51.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for tapeback-0.9.1-py3-none-any.whl
Algorithm Hash digest
SHA256 4dfdffc2d66d719fa20ada9de3529f8faebe18ab421b0c27bee3ad1e51ec702b
MD5 562643bfd53b49540818481501a2b65a
BLAKE2b-256 b1bfa34828512bab64670a5340a44a10b86044e1d2af90079b9808ad47677a4f

See more details on using hashes here.

Provenance

The following attestation bundles were made for tapeback-0.9.1-py3-none-any.whl:

Publisher: publish.yml on yastcher/tapeback

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page