A 41 minute client call. 87 seconds after it ended, I had a full transcript with speaker separation. Everything ran locally on my Mac, and not one second of a client recording touched the cloud. Which is exactly why I could be 100 percent present in the call without writing anything down.
The original version was a tweet in Hebrew. It is the follow-up to I stopped taking notes in client meetings.
What changed since the first version?
Two weeks ago the tool was a single-language transcriber with no idea who was speaking. Since then I upgraded the flow, ran it on two real client milestone calls, one in Hebrew and one in English, and made it my official process. Three things changed:
- Speaker diarization. pyannote runs on top of the transcription and marks who spoke when, so the transcript reads like a script instead of a wall of text.
- An English path. English calls run on
whisper-large-v3-turbo. - Hebrew stays on the finetune. Hebrew calls run on the ivrit.ai finetune of Whisper, which is still a different quality level from stock Whisper on Hebrew.
All of it on device, on Apple Silicon. The code is on GitHub: razamit/audio_transcriber.
How does the full meeting flow work?
The transcription is the middle of a longer flow, and the flow is what actually changed how my meetings feel:
- Before the meeting: all the project's emails live in the project's docs folder in Claude Code. I ask for an agenda, and the file sits open next to the Zoom window. I know what I want to present and what I need to get out of them.
- During: the call is recorded, after letting the other side know, of course. I take zero notes.
- After: the recording goes through the transcriber. Whisper produces the text, pyannote separates the speakers, and the merged transcript lands in a text file about a minute and a half later.
- Then Claude: the transcript goes into Claude and comes out as a meeting summary with action items per participant. From there, a recap email to the client with what was agreed and where we go next.
The real benefit is not the time saved. It is that there is nothing I can miss.
I am the kind of person who reads half of his meeting notes afterwards and cannot tell what they refer to. Now that problem does not exist: the transcript is what was actually said, with names attached to every line.
Why keep transcription local?
Same answer as the first post, only stronger now that this is the official process. A client call is the most sensitive recording I produce in a week: names, numbers, internal politics. Running transcription and diarization on my own machine means that audio never becomes someone else's training data or someone else's breach. It is the clearest case I know of using a local model because the data is the reason, the argument I laid out in where local LLMs actually earn their keep.
What do you need to run it?
- A Mac with Apple Silicon.
- 16GB of RAM as a comfortable minimum for the large models.
- The tool itself: razamit/audio_transcriber, which picks the model by language and runs the diarization pass for you.
Working out which parts of a workflow belong on your own hardware and which do not is a conversation I have with clients every week, as part of AI consulting. This flow is my own answer for the meeting part of it.
FAQ
How do you add speaker diarization to local Whisper transcription?
Run pyannote on top of the Whisper transcription. Whisper produces the text with timestamps, pyannote identifies who spoke when, and the tool merges the two into a speaker separated transcript. All of it runs on device on Apple Silicon, so the recording never leaves the machine.
How fast is local transcription with speaker diarization on a Mac?
On my Apple Silicon Mac, a 41 minute client call produced a full transcript with speaker separation 87 seconds after the meeting ended. Hebrew runs on the ivrit.ai finetune of Whisper, English on whisper-large-v3-turbo, and pyannote handles the diarization pass.