Point it at an audio file and it writes a folder next to it with the transcript and a table of who spoke, for how long, and how often. Tell it how many people were in the room, or let it work that out. Renaming a speaker takes seconds, because the slow parts are saved and reused.
transcribe
transcribe turns a recording into a written transcript with the speakers labeled, with one command, on your own Mac.
Private buildCLImacOS
$ transcribe sample.m4a --prompt "beach cleanup, shoreline, volunteers" [23:26:54] converting to 16 kHz mono [23:26:55] transcribing with mlx-community/whisper-large-v3-turbo (this is the slow step) Fetching 4 files: 100%|██████████| 4/4 [00:00<00:00, 3571.14it/s] [23:26:57] transcribed 9 segments [23:26:58] embedding 14 phrases by voice [23:26:58] 2 speakers: fit score 0.720 [23:26:58] 3 speakers: fit score 0.563 [23:26:58] 4 speakers: fit score 0.526 [23:26:58] 5 speakers: fit score 0.400 [23:26:58] 6 speakers: fit score 0.376 [23:26:58] chose 2 speakers [23:26:58] wrote ~/demo/sample-transcript/transcript.md Speaker A 0:21 58% Speaker B 0:16 42% $ grep '^\*\*' sample-transcript/transcript.md | head -6 **[0:00] Speaker B:** Good morning. Thanks for joining the planning call for Saturday's beach cleanup. **[0:04] Speaker A:** Good morning. I have the permit confirmed for 8 o'clock, and the lifeguard station will be open for supplies. **[0:11] Speaker B:** Great. How many volunteers have signed up so far? **[0:15] Speaker A:** 42 adults and 11 students. We should split them into 3 zones along the shoreline. I will bring 200 trash **[0:23] Speaker B:** bags and 60 pairs of gloves. Can you handle the scales for weighing the collection? **[0:28] Speaker A:** Yes. I will borrow two hanging scales and a clipboard to log every bag by weight.
What it does
Hard problem we solved
Sorting a long meeting into separate voices
Telling voices apart is harder than writing down words. The first attempt used average-linkage clustering, and on a long meeting it folded everyone into one speaker.
The pipeline now runs ffmpeg to make a 16 kHz mono copy, then Whisper large-v3-turbo through MLX on the Apple GPU, which gives a start and end time for every word. Words group into short phrases at pauses over half a second, capped at four seconds. Each phrase of 0.8 seconds or more gets a voice embedding, and the phrases cluster by voice with k-means. You set the speaker count, or the tool tries from 2 up to a limit and keeps the best silhouette score. Phrases too short to embed well take the label of the nearest long phrase, and a JSON overrides file can relabel a time range by hand when a short speaker gets merged into another.
The tool exists at all because a newer NumPy broke the numba package that Whisper's word timing needs. It now runs in its own Python 3.12 environment that pins NumPy below 2.5, and the README gives one command to rebuild it.
Where it stands
A private tool in daily use, about 250 lines of Python.
Runs one prompt across 19 AI models and shows which answer is best, and what each one cost.
Next in Tools