Meeting transcription desktop app with speaker identification. Echobox watches one or more Google Calendars, captures system audio during scheduled meetings, and produces speaker-labeled transcripts. All processing runs locally.
- Monitors multiple Google Calendars for meeting events
- Speaker diarization via pyannote.audio ("who said what")
- System audio capture via PipeWire
- Electron desktop app with week view and transcript browser
- Local processing: audio, transcription, and diarization stay on your machine
- Python: 3.10 or higher
- Node.js: 18 or higher
- PipeWire: For audio capture (standard on modern Linux distributions)
- NVIDIA GPU (optional): Significantly faster diarization with CUDA support
- 16GB RAM minimum (24GB+ recommended for larger meetings)
- Multi-core CPU for transcription during meetings
- GPU with 8GB+ VRAM for faster post-meeting diarization (optional)
git clone https://github.com/mumtazm1/echobox.git
cd echoboxpython -m venv .venv
source .venv/bin/activate
pip install -e .cd frontend
npm install
cd ..Copy .env.example to .env and fill in the values:
cp .env.example .envYou must set HF_TOKEN (see Configuration below) for speaker diarization to
work. The other variables have defaults that work for a standard local setup.
For each Google account whose calendar you want to watch:
- Open Google Cloud Console and create or select a project.
- Enable the Google Calendar API.
- Create OAuth 2.0 credentials of type Desktop application.
- Download the client secret JSON.
- Place it in
$EB_KEYS_DIR(default:~/.config/echobox/keys). The filename stem becomes the calendar slug (e.g.work_client_secret_abc.jsonbecomes slugwork).
mkdir -p ~/.config/echobox/keys
mv ~/Downloads/client_secret_*.json ~/.config/echobox/keys/Then run eb-calendar setup to generate ~/.config/echobox/calendars.json
from the client secrets, followed by eb-calendar auth for each calendar.
See config/calendars.example.json for the full schema if you prefer to
hand-edit the file.
Start the backend and frontend in separate terminals:
# Terminal 1: Start Python backend
eb-server
# Terminal 2: Start Electron frontend
cd frontend && npm run devThe app will open at http://localhost:5173 (dev server) with hot reload enabled.
Build and install the desktop application:
# Build packages
./scripts/build.sh
# Install desktop entry and icon
./scripts/install.shThe built packages will be in frontend/dist/:
- AppImage: Portable executable
- .deb: Debian/Ubuntu package
| Variable | Description | Default |
|---|---|---|
EB_KEYS_DIR |
Directory containing Google OAuth client secret JSON files | ~/.config/echobox/keys |
EB_CONFIG_DIR |
Runtime config directory (stores calendars.json, cached tokens) |
~/.config/echobox |
EB_TRANSCRIPTS_DIR |
Root directory for transcript storage | ./transcripts |
HF_TOKEN |
HuggingFace token for pyannote speaker diarization | required |
ECHOBOX_SKIP_BACKEND |
Skip spawning backend from Electron (for development) | unset |
Echobox reads its calendar list from $EB_CONFIG_DIR/calendars.json. Each
entry maps a Google Calendar to a local slug, display name, color, and
output directory. A template lives at config/calendars.example.json:
{
"calendars": [
{
"calendar_id": "primary",
"name": "work",
"display_name": "Work",
"color": "#4285f4",
"output_dir": "./transcripts/work",
"client_secret_path": "~/.config/echobox/keys/work_client_secret.json",
"enabled": true
}
]
}nameis the slug used for URL filters, token filenames, and the transcript subdirectory. Lowercase, no spaces.display_nameis what the UI shows on tabs and badges. Falls back to a title-cased slug if omitted.coloris any hex code. Tab borders, event block backgrounds, and CSS custom properties (--calendar-<slug>) are generated from this at runtime, so you can add as many calendars as you want.
Transcripts are written under $EB_TRANSCRIPTS_DIR/<slug>/, one
subdirectory per calendar defined in calendars.json.
The Echobox UI provides two main views:
Calendar View
- Week-at-a-glance calendar showing meetings from all connected calendars
- Color-coded meeting blocks by calendar source
- Click on any meeting to view its transcript
Transcript Browser
- List of all transcripts with search and filtering
- Filter by calendar tab
- Full transcript reader with speaker-labeled segments
- Start/Stop Recording: Manual recording controls for non-calendar meetings
- Status Indicator: Shows current recording state and backend connection
- Real-time Updates: Live status updates via WebSocket connection
Echobox provides CLI commands for automation and debugging:
# Start the API server
eb-server
# Capture system audio
eb-capture
# Transcribe audio file
eb-transcribe recording.wav
# Run speaker diarization
eb-diarize recording.wav
# Process and merge transcript with diarization
eb-process recording.wav
# Calendar operations (auth, list, events, next, setup, config, watch)
eb-calendar --help
# Enroll a speaker's voice fingerprint for automatic labeling
eb-enroll alice alice-sample.wav
# Inspect enrolled speakers
eb-speakers list
# Run transcript correction via Claude API
eb-correct transcript.json
# Full meeting pipeline
eb-meeting- Audio capture via PipeWire/PulseAudio
- Transcription using faster-whisper (CTranslate2)
- Speaker diarization using pyannote.audio
- REST API + WebSocket for real-time updates
- Electron 40+ with Vite build system
- React 19 with TanStack Query
- CSS custom properties for theming
- Backend lifecycle management in production
echobox/
src/ # Python backend source
api/ # FastAPI server and routes
capture/ # Audio capture modules
transcription/ # Whisper transcription
diarization/ # Speaker diarization
calendar_integration/ # Google Calendar sync
correction/ # LLM transcript correction
pipeline/ # Full processing pipeline
frontend/ # Electron/React frontend
src/main/ # Electron main process
src/renderer/ # React app
src/preload/ # Electron preload scripts
config/ # Example config templates
scripts/ # Build and install scripts
# Backend tests
pytest
# Frontend type checking
cd frontend && npm run typecheck# Full build (AppImage + deb)
./scripts/build.sh
# Just create unpacked directory (faster for testing)
cd frontend && npm run packMIT. See LICENSE.
Issues and pull requests are welcome. Please open an issue to discuss substantial changes before sending a PR.