Local meeting transcription
with speaker diarization
Ryzen 9 7950X / RTX 3090 Ti / 64 GB
100% local. Zero cloud.
iOS Shortcut
M4A / WAV
via Tailscale
ffmpeg
WAV 16kHz mono
VAD trimming
pyannote.audio 3.1
GPU ~2GB VRAM
who spoke when
faster-whisper
large-v3 ~6GB
FR/DE/EN/IT auto
Merge timeline
who + what
unified segments
Ollama Mistral 7B
~5GB VRAM
structured notes
DATAFLOW
Peak VRAM usage: ~13 GB / 24 GB available. Sequential GPU access. No orchestration overhead.
Realtime factor
Audio duration multiplier.
Faster than real-time processing.
For 1h audio
End-to-end processing time.
From upload to structured notes.
Peak VRAM
Sequential GPU access.
54% of RTX 3090 Ti capacity.
Output format
JSON structured + Markdown meeting notes
Auth via X-API-Key header. Tailscale-only access.
# Submit a meeting recording curl -X POST https://horizon:8400/api/v1/meetings \ -H "X-API-Key: $API_KEY" \ -F "audio=@meeting.m4a" \ -F "title=Standup 2026-03-27" # Response { "meeting_id": "m_7f3a9b2e", "status": "processing", "estimated_duration": "15m" }
# Check status curl https://horizon:8400/api/v1/meetings/m_7f3a9b2e \ -H "X-API-Key: $API_KEY" # Response { "status": "completed", "pipeline": { "diarization": "done", "transcription": "done", "summary": "done" }, "result_url": "/api/v1/meetings/m_7f3a9b2e/result" }
# Get results curl https://horizon:8400/api/v1/meetings/m_7f3a9b2e/result \ -H "X-API-Key: $API_KEY" # Response (truncated) { "summary": { "executive": "Team discussed Q2 roadmap...", "decisions": ["Ship meetily-v2 by March"], "action_items": ["@alex: Deploy to Horizon"] }, "transcript": [ { "speaker": "SPEAKER_00", "start": 0.0, "end": 4.2, "text": "Okay, let's get started." } ] }
End-to-end pipeline
iOS Shortcut integration
Docker Compose deploy
REST API + auth
Speaker voiceprints
Web UI dashboard
Synology storage
Slack notifications
Obsidian sync
Calendar integration
RAG on meeting history
Cross-meeting insights