Meeting notes that never leave my machine
Roughly half my week is calls, and a chunk of those sit under NDAs written years before notetaker bots existed. Every cloud meeting assistant I evaluated wanted audio shipped to someone else's servers under retention terms drafted by someone else's lawyers. That was the entire decision, honestly. Since February, my meeting notes have been produced end to end on the M2 Ultra, and no recording has left the machine.
One rule precedes all the tooling: I ask before recording. Consent is a people problem, and no pipeline fixes people problems.
the pipeline, all four stages
Record: ffmpeg captures my mic plus, through BlackHole (the macOS loopback driver), whatever the meeting app plays. Transcribe: whisper.cpp with a large-v3 GGUF on Metal; an hour of audio lands in about nine minutes. Summarize: a mid-size model under Ollama reads the transcript in 20-minute windows, then a merge pass emits JSON: decisions, action items, open questions, pinned down with structured output so the shape never drifts. File: a short script renders that JSON to markdown and drops it into the vault my fully offline RAG indexes, so February's meetings stay searchable next to everything else.
ffmpeg -i call.m4a -ar 16000 -ac 1 call.wav
whisper-cli -m ggml-large-v3.bin -f call.wav -l auto -otxt
For batch runs over old recordings I switch to faster-whisper on the 3090 box. Same output, better throughput, and the Mac stays free for actual work.
two weeks of meetings with myself
The embarrassing part. For the first two weeks the BlackHole routing was wrong, and ffmpeg recorded only my mic. Every transcript was me: my questions, silence where the answers should have been, then my thanks for answers nobody gave. I didn't notice for fourteen days because I was filing the notes without reading them.
A pipeline you never spot-check is a superstition with a cron job.
The fix took four minutes. The habit that prevents a repeat (actually reading one full artifact a week) took longer to stick.
czech-accented english and the word no
Accuracy first: large-v3 handles Czech-accented English better than I expected, mine and colleagues with far heavier accents alike. The failures are more interesting than the average. In Czech, no is a filler that means something like well, yeah. We sprinkle it into English mid-sentence without noticing. Whisper hears English no. One summary confidently reported that a colleague had rejected a proposal she had, on the recording, cheerfully agreed to; I caught it only because the action items contradicted the decision two lines up.
Proper nouns are the other soft spot. Internal project names come back creatively respelled, so a post-pass applies a substitution list that currently holds 34 entries. And on long silences, whisper sometimes invents a polite little sentence from nowhere (folklore blames subtitle data in its training mix), so the summarizer is told to ignore anything outside detected speech.
Going local cost me no accuracy worth naming; it cost me speaker labels and nine minutes an hour.
diarization is still the weak leg
Local diarization exists (pyannote runs offline just fine), and I'd still call the results mediocre with a straight face. Two-person calls come out usable. Five people with crosstalk, and the labels smear until wrong attribution reads worse than none. My compromise since March: labels on for 1:1s and interviews, off for group calls, where the summary tracks what was decided rather than who said it. An unattributed decision beats a confidently misattributed one every time.
what it costs, what it doesn't
Cloud transcription bills by the audio minute, which sounds like nothing until a backlog shows up. I had sixty-odd hours of internal recordings when I built this; the M2 chewed through them in two overnight batches, for electricity I didn't bother to meter. But I'd have built this even at cloud prices of zero. Custody was the point.
The honest limitations: this is an engineer's rig (BlackHole routing, model files, a folder of scripts held together by one person's habits), and I wouldn't expect it to survive a macOS update in a non-technical colleague's hands. It also only covers meetings I record; when the other side's platform bot writes the official notes, mine are the second-best notes in the room. I keep writing them anyway. Mine come with no retention policy but mine.