Personal build · Python · local models
The problem
I needed a transcript of an hour-long meeting, and I wanted who said what, not one long wall of words. I wanted the kind of recap Teams AI summaries provide, without paying for an AI service or uploading other people's conversation to someone else's servers. The usual open-source route, WhisperX, pins its own versions of the libraries underneath it and fights Windows and newer GPUs. And the transcript is the easy half. People rarely say "action item," so the minutes have to work out what was decided, who volunteered, and what was only floated.
The approach
The pipeline pairs faster-whisper for the words with pyannote for who spoke when, then merges the two itself. Where people talk over each other, the speaker model sometimes hands a few words of one person's sentence to someone else, so those fragments get folded back into the sentence they interrupted. A drag-and-drop page, designed like a jazz record sleeve, does the rest: drop a recording on the vinyl, name each speaker from their longest lines (with a play button for each), and save to Markdown, Word, an HTML page, plain text, or OneNote. Each meeting gets its own folder by name and date, and a list of past meetings reopens any of them without transcribing again. A names-and-terms box gives Whisper hints, which is how "John" finally became Jon. Minutes come from whichever model is already loaded in LM Studio, in four formats: action minutes, highlights, a decision log, and a follow-up email draft. It runs on the CPU by default, because my laptop has a history with heavy GPU loads.
The result
Transcribing an hour of meeting audio takes about 15 to 20 minutes on the laptop's CPU. Speaker processing, assigning names, and optional minutes generation take additional time. The resulting Markdown transcript has the names I assign and drops straight into my notes or any AI tool. Nothing is uploaded: the page works on a copy of the recording and deletes it when it's done. Every next step in the minutes says how firm it is (Committed, Offered, or Suggested), because the gap between "I'll do it" and "we should" is most of what a recap is for.
| Measure | Teams AI summaries | My transcriber |
|---|---|---|
| Processing | Microsoft cloud | Local models on my laptop |
| Service cost | Paid AI service | No service fee |
How I check it
The first real test was a 64-minute meeting, and the minutes said there were no actions and no decisions, and listed nothing between minute 24 and minute 54. The model hadn't summarized too much; it had lost the middle. So now it reads the meeting in ten-minute parts, takes notes on each, and merges the notes by reference, and any commitment the merge drops is added back. Every item cites where it was said, and a cited time has to land within two seconds of a real transcript line or it's flagged before I share anything. "Committed" has to trace back to the owner actually speaking at that moment, or it's downgraded to Offered. I ran that same meeting through three local models: the slowest took 25 minutes and was the most faithful, the fastest took 95 seconds and was the most cautious, and the one in between wrote the most detail but made people sound more in agreement than they were.





