Benchmarks

LokalBot local model benchmarks

Accuracy and speed of the models that transcribe, label speakers, search, summarize, and autocomplete on your Mac, with the methods, sources, and what has not been measured.

Key results

Every number comes from a report checked into the LokalBot repository. These are engine-level measurements on one machine, an Apple M4 Max MacBook Pro with 48 GB of unified memory. They are not end-to-end UI timings.

Speech recognition accuracy and speed

The fixed set is 44 public clips totalling 271.3 seconds: 24 conversational clips from the AMI meeting corpus and 20 clean LibriSpeech clips. Every model received identical 16 kHz mono audio. Word error rate uses the standard Whisper English normalizer, so contractions such as “I've” and “I have” score the same. Run date: September 7, 2026.

MeasureGranite 4.1 Q4Granite 4.1 Q8Granite 5 TurboCTC
Normalized word error rate4.42%4.93%5.18%
AMI meeting audio8.83%9.09%10.13%
LibriSpeech read speech0.25%0.99%0.49%
Audio seconds per second (warm)33.2×29.3×280.2×
Median clip latency161 ms187 ms17.5 ms
Sampled peak memory (RSS)2.87 GiB3.62 GiB1.05 GiB

Granite Speech 5 was about 8× faster but English-only and unpunctuated, and it is not integrated into LokalBot. With a set this small, the accuracy differences do not establish a reliable ranking. Qwen3-ASR 1.7B, the default since LokalBot 0.8.1, was not part of this run. Parakeet and Whisper large-v3 turbo have not been scored against this set either. Source: model alternatives report.

Speaker diarization

Diarization decides who spoke when. The test set is four English AMI meetings, each scored as a headset mix and as a distant-microphone recording: 8 conditions and 184.55 minutes of audio, with four speakers in every meeting. Diarization error rate (DER) adds missed speech, false alarms, and speaker confusion, divided by reference speaker time. Overlapping speech is scored, the main comparison uses no boundary collar, and no model was told how many speakers to expect. Run date: September 23, 2026.

MeasurePyannote Community-1 (previous default)Nemotron 3
DER, no collar43.44%14.56%
DER, 250 ms collar30.45%8.34%
Correct speaker count5/88/8
Speed, 17.5-minute recording (warm)243× realtime500× realtime
Peak process memory (RSS)0.68 GiB0.67 GiB

Nemotron 3 ran as full-precision Core ML through FluidAudio. It reduced speaker confusion from 8.87 to 1.77 points, missed speech from 15.34 to 8.40, and false alarms from 19.23 to 4.38, and it beat the baseline on all eight recordings. The baseline is the pinned FluidAudio implementation of Pyannote Community-1; keeping overlapping output or switching to community defaults did not close the gap. That makes this a comparison with one implementation, not with every Pyannote setup. Pyannote Community-1 remains selectable in the app. Source: diarization report.

Semantic search quality

Search was tested on 48 authored queries: 24 in English and 24 in Serbian/Montenegrin, across Latin and Cyrillic scripts, against 60 synthetic passages. The relevant passage for each query was fixed before inference. Both models used Q8 weights on the same llama.cpp build; Harrier returns 1,024-dimension vectors and EmbeddingGemma 2 returns 768.

MeasureHarrier 0.6BEmbeddingGemma 2
Correct passage ranked first40/48 (83.3%)43/48 (89.6%)
Correct passage in top five47/48 (97.9%)48/48 (100%)
English, ranked first22/2423/24
Serbian/Montenegrin, ranked first18/2420/24
Mean reciprocal rank0.9030.944
Median query latency13.1 ms9.0 ms
Model download0.64 GB0.31 GB

On 48 correlated queries the 6-point gain is within noise (95% interval −4 to +17 points), so EmbeddingGemma 2 was adopted because it matched or beat Harrier at half the download, half the idle memory, and faster queries, not for a proven quality jump. Harrier had replaced Qwen3-Embedding 0.6B (35/48) in September. Sources: EmbeddingGemma 2 report, model alternatives report.

Meeting summary and action-item speed

This replay runs LokalBot's production summary and action extractor against two meeting transcripts with Qwen3.5 4B (Q4_K_M) on llama.cpp b10173. “Cold” includes starting the model runtime; “warm” reuses a loaded runtime. Transcription time is excluded. Run date: September 9, 2026.

MeetingTranscriptColdWarmModel calls
26-minute meeting4,477 words59.8 s33.4 s5
91-minute meeting11,229 words71.5 s74.2 s8

All four runs completed without truncated output. LokalBot's validator dropped notes and actions it could not tie to transcript evidence or to the right owner. That check covers evidence and ownership, not meaning, so factual coverage still needs human review. In the same September 7 pilot, the smaller MiniCPM5 2B model was faster on long context but misattributed action items and looped on one summary. Qwen3.5 4B remains the default. Sources: summary replay results and model alternatives report.

Autocomplete

The autocomplete benchmark runs LokalBot's production autocomplete engine on one model, with fresh-install settings and nothing else from the app. It has three parts:

Run date: October 15, 2026, on a Release build.

MeasureGemma 4 E2B Base (Q6_K), defaultLFM2.5 1.2B Instruct (Q4_K_M), Lightweight
Unsafe results in 140 checks00
Next-word accuracy23.1%20.7%
Accuracy in English / other languages25.3% / 14.6%24.2% / 7.3%
Suggestion shown46%48%
Right when shown50%43%
Word completions12/1312/13
Per keystroke, median / p9556 / 102 ms26 / 76 ms
Model load0.65 s0.16 s

Accuracy counts a missing suggestion as a miss. When unsure of the first word, LokalBot shows nothing rather than guessing, so “right when shown” is closer to what you see while typing.

Gemma 4 E2B Base's suggestions are right more often, and it suggests in Serbian, where LFM2.5 almost never does. In English the two are within noise: the difference is +1.1 points, with a 95% interval of −1.4 to +3.5. LFM2.5 is two to three times faster, and both stay near 100 ms or less per keystroke on this Mac.

Both models showed a suggestion in 24 of the 28 checks:

These are engine timings. They leave out the pause before a suggestion is requested, reading the text field, and drawing the suggestion. The phrases are synthetic and were written for earlier LokalBot studies. Source: autocomplete engine benchmark.

Earlier versions of this check reported model loading as latency. They also counted a held-back suggestion as a safety failure. Their July and October 14 results are kept in the repository.

Screenshot text recognition

When you opt in to saving screen text, LokalBot reads it with Apple Vision. On 5 synthetic screenshots with known text, Apple Vision scored 0.971 token F1 at 120 ms per image. The closest open-source engine, PP-OCRv6 medium, scored 0.974 but took 6.78 seconds per image and about 15 seconds to load. On 15 real screenshots, Apple Vision averaged 243 ms per image; every alternative tested took 1.3 to 22 seconds. Run date: June 24, 2026. Sources: synthetic OCR results and real-screenshot OCR results.

What has not been measured yet

Model choices change between releases. Settings → Models in the app shows your active selections, download sizes, and presets. For choosing a speech engine, see the local transcription model guide.

FAQ

Common questions

What hardware were these benchmarks run on?

All published runs used one Apple M4 Max MacBook Pro with 48 GB of unified memory. Results on M1, M2, and M3 Macs have not been measured yet, so treat the timings as one data point rather than per-chip guidance.

Which speech model does LokalBot use by default?

Qwen3-ASR 1.7B has been the default transcription model since LokalBot 0.8.1. The accuracy run on this page predates that change and compares IBM Granite Speech models; a Qwen3-ASR accuracy run has not been published yet.

How accurate is LokalBot's transcription?

On 44 public AMI and LibriSpeech clips, Granite Speech 4.1 (Q4) reached a 4.42% normalized word error rate: 8.83% on conversational AMI meeting audio and 0.25% on clean LibriSpeech read speech. Accuracy on your own recordings depends on microphones, accents, crosstalk, and vocabulary.

Can I reproduce these results?

Yes. The scripts, pinned model manifests, and raw results are in the Benchmarks folder on GitHub. A few inputs, such as a private transcript used only as a search distractor, are kept out of the repository and are noted in each report.

Try it locally

Your personal context engine.

Free, open source, and no account. For Mac, with Windows and Linux in alpha.

Download for macOS

Apple Silicon · macOS 15+ · or with Homebrew: brew install --cask stevyhacker/tap/lokalbot

macOS · Windows · Linux (alpha) · requirements