Scribble

One voice keeps one identity, across every file you own.

Batch transcription with diarization, entirely offline. No API keys, no upload, no monthly bill, and no terms of service that quietly changed while you were asleep.

Fully offline GPL-3.0 Windows 11 v0.3.0
Get the latest release Source on GitHub
The Difference

Speakers are resolved against a corpus, not a file.

Every other tool hands you SPEAKER_00 and SPEAKER_01 inside one recording, then cheerfully starts over at zero on the next one. That is fine for one file and useless for four hundred, because the question you actually have is never "how many people are in this clip". It is "where else does this person show up".

So the first time a voice appears, it gets a durable identity. Every later file matches into it. Name it once and every transcript that person appears in says their name. There is no enrolment step and no sitting there recording reference clips of your coworkers like a weirdo. The corpus enrols itself.

You can still enrol somebody by hand, and for the handful of people who turn up in everything it is worth twenty seconds. Not because the automatic path needs help naming them, but because diarization sometimes splits one person into four speakers inside a single recording, and a rule that is otherwise correct then forces three of those to become new identities. Reference audio of a known person is the one piece of evidence strong enough to overrule that, and it is the difference between five speakers and ninety.

Pipeline

What happens to a folder of recordings.

Anything ffmpeg can demux
Which is everything. Audio, video, whatever the recorder wrote. ffmpeg and ffprobe ship with the installer so there is nothing to go find.
Transcription on the GPU
whisper.cpp through cuBLAS, streaming text as it decodes. NVIDIA Parakeet TDT 0.6B v3 is available as a second backend and beats Whisper on English and European languages.
Diarization and voiceprints
A pyannote segmentation model through sherpa-onnx cuts the audio into speaker turns, then a voiceprint per speaker per file is matched against the store.
Six output formats
SRT, WebVTT, Markdown, JSON, plain text and TSV, written from one SQLite file. Renaming somebody costs zero inference because names resolve when a transcript is written.
It resumes
Files already done are skipped unless they changed on disk. run walks folders recursively, so pointing it at the same tree twice is cheap rather than a second full pass.
Isolation when it helps
isolate = "auto" strips music and background with a UVR model, and measures the noise floor first so it skips clean speech instead of degrading it.
Use

Six commands cover most of it.

scribble run D:\recordings     # walk the tree, skip what is already done
scribble speakers              # everybody, with file count and speech time
scribble name 12 "Will"        # label one identity
scribble enroll "Will" clips\will-*.wav
scribble render                # rewrite transcripts, transcribe nothing

scribble dupes                 # identity pairs too close to call
scribble recluster             # regroup every voiceprint in one pass

dupes reports identity pairs that are close but not close enough to merge without asking. Usually that is one person on two different devices, which no threshold anywhere fixes, so you get a shortlist instead of a guess.

recluster exists because incremental matching assigns identities in arrival order, so the same corpus ingested in a different order groups differently. One pass removes that, and keeps every name you typed. Run it once after a big batch. Once.

There is a GUI with the same functions and a live transcript view, if you would rather click.

Accuracy

Ranked by what actually moves word error rate.

Hardware

The GPU is not always the answer.

Acceleration defaults to auto and is decided per stage from your actual hardware. On a Ryzen 9 7950X with an RTX 4090, over five and a half minutes of audio, vocal isolation takes 38 seconds on the GPU against 113 on the CPU, and Parakeet transcription is a dead heat.

Diarization and voiceprints go the other way: 153 seconds on the GPU against 112 on the CPU. Those are small models run over hundreds of short windows, so launch overhead dominates and a 16 core part eats it alive. On a four core laptop the GPU wins that stage comfortably, which is why auto counts your cores rather than treating one benchmark as scripture.

Requirements

What you need.

Operating system
Windows 11, x64.
GPU
An NVIDIA card if you value your time. CPU works. CPU is slow.
Disk
About 4 GB for models, fetched on first run.
cuDNN 9
Needed by diarization, voiceprints, isolation and Parakeet. NVIDIA's licence forbids redistributing it, so scribble gpu install fetches it for you, about 1.2 GB into local app data. Until you do, those stages run on CPU and say so out loud.
Configuration
scribble.toml, next to the executable or in %LOCALAPPDATA%\Scribble. Unknown keys are rejected rather than ignored, so a typo stops the program with a message instead of quietly doing something else for an hour.
Get It

Download.

Free and open source under the GPLv3. The documentation starts with what the four intimidating toolbar buttons do, in the order you will need them, because the person who built this still could not remember what Recluster did.

Get the latest release