Personal builds · 2026.10

Meeting Transcriber

I wanted a free, local alternative to Teams AI meeting summaries. This tool turns a recording into a speaker-labelled transcript, with names I assign and optional meeting minutes from a local model. It all runs on my laptop, so the audio never leaves it.

a recordingbecamewho said what

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.

Two options for my meeting recap workflow.
MeasureTeams AI summariesMy transcriber
ProcessingMicrosoft cloudLocal models on my laptop
Service costPaid AI serviceNo 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.

The Meeting Transcriber page, white and yellow headline type on cobalt blue. A black vinyl record labelled Drop it here takes the recording; beside it are empty fields for the meeting name, names and terms, people speaking and language, and status lights for speaker labels and LM Studio
The drop page, waiting for a recording. It only listens on this laptop and refuses requests from other websites, so a page I visit can't push files to it.

Open to work

Got a manual process worth automating?