Skip to content
KekosoDownload

"On-device" transcription: how to check the claim, and what it costs

By Andrey ChmerevI build Kekoso, which makes this claim, so take the argument with the interest it carries — and then run the checks on my app too. The disk figures are from my own machine and include a number that is worse than what my own model catalogue says; I left it in because that is the point of the section.

A stated model size next to the space it actually occupies once compiled, the second bar roughly twice the first

“Runs on your device” is not a promise you have to take on faith. It is one of the few claims in software you can check yourself, in under a minute, without tools.

That is worth doing, because the phrase is used loosely. Some products mean on-device transcription in the literal sense: the recognition happens on your machine. Others mean the app is installed on your machine while the audio goes to a server. Both get described as “local” in marketing copy, and offline transcription is the one of the two you can test.

Voice to text offline is the promise; voice recognition offline is what has to be true for it. Those are checkable in a minute.

The one-minute test

Turn off the network and try it. Wi-Fi off, ethernet unplugged, airplane mode if the app has a mobile version. Then transcribe something.

If it works, the audio did not go anywhere. Nothing else about the claim matters after that — no policy, no wording, no certification. If it fails or hangs, you have your answer too.

Two more precise checks, if you want them:

# every socket the app has open, while it is transcribing
lsof -i -a -p $(pgrep -x YourApp)

An app that recognises locally shows nothing here during a transcription, or connections that clearly are not the audio. The third option is a per-app firewall — Little Snitch and its equivalents show you each attempted connection and let you deny it while the app runs. Deny everything and dictate: real offline speech to text carries on regardless.

Run these on my app too. That is the point of publishing them.

Where even a local app uses the network

An honest local app is not a network-silent app, and a vendor claiming zero connections is either simplifying or wrong. Four things normally still need a connection, and none of them are your audio:

Fetching the model. Speech models are hundreds of megabytes, so they are downloaded on first use rather than shipped inside the app. This is a one-time transfer of the vendor’s file to you, not of your file to anyone.

Licence checks. Whatever proves you paid.

Update checks. The app asking whether a newer version exists.

Anything you explicitly point at the internet. Pasting a link to an online video, for example, obviously fetches that video.

The question to ask a vendor is not “does the app ever use the network” but “does the recognition”. Those are different sentences, and a product that blurs them is telling you something.

Running a model locally also means agreeing to its licence, and the three families differ there more than people expect: what those licences do and do not cover.

What it costs: disk

Here is where I have to report a number that is inconvenient for me.

Model sizes are advertised as the download. What lands on your disk is the compiled form, and it is bigger. On my own machine, with everything installed:

Model Listed On disk
Parakeet TDT v3 240 MB 461 MB
Parakeet TDT-CTC 110M 217 MB 217 MB
SenseVoiceSmall 226 MB 229 MB
Whisper (both variants) 616 + 207 MB 823 MB
Total 1.7 GB

The Parakeet v3 row is nearly double, and the encoder alone accounts for 425 MB of it. My own model catalogue shows the smaller number, which means my app understates it — I found this while writing this article, and it is now a bug on my list rather than a footnote.

The practical rule: budget about twice the advertised size per model, and remember that a fast model and a small model are not the same thing.

What it costs: the first run

The first time a model runs on a machine, CoreML compiles it for the Neural Engine. That compilation is cached afterwards, and it is slow.

Measured on an M4 Max, 23 August 2026: the first ever load of Whisper large-v3-turbo took 2 minutes 35 seconds. The second took 1.5 seconds. SenseVoiceSmall’s first compile took around ten minutes.

No benchmark will warn you about this, because benchmarks measure steady state, and it happens once per model per machine. It is, however, exactly what a person meets the first time they try a local app — and if the app shows a spinner without saying what it is doing, it looks broken rather than busy.

What running locally does not buy you

Accuracy. On-device transcription is not more accurate for being on-device — location and accuracy are unrelated. Local models on Apple silicon are at parity with cloud services for clean dictation, and cloud services can afford bigger models. If someone tells you local is more accurate because it is local, they have the argument backwards.

Speaker labels. Diarization — working out who spoke when from a single mixed recording — is a separate problem from transcription, and the local models discussed here do not do it. Splitting a two-person interview by speaker is not something a better transcription model fixes. The exception is a recording where the two sides were captured separately in the first place, which is why a call recorded on your own Mac can be labelled while a file of the same call cannot.

Silence handling. Whisper in particular invents text over long pauses, an artefact of training on subtitled video, and it does that identically whether it runs on your laptop or someone’s server.

Reading the claim on someone else’s site

Four phrasings, and what they usually mean:

“Processed on device” — the strong claim. Testable in a minute with the network off.

“Your data is encrypted in transit” — the audio leaves. Encryption in transit is about the wire, not about the destination.

“We don’t store your recordings” — the audio leaves, and they say they delete it. That is a retention promise, not a locality one, and it is only as good as the company.

“Private” and “secure”, unqualified — no claim has been made. These words survive any implementation.

The training clause is a separate axis again: a service can process in the cloud and not train on your content, or run a local-feeling desktop app and still train on de-identified data. Do not let one answer stand in for the other.

Disk figures are from my own machine, macOS 26.5.2, read on 4 September 2026; the first-run timings were measured on 23 August 2026. The commands are in the text so that none of it has to be taken on my word.

Questions people ask

How can I check whether transcription really happens on my device?

Turn off Wi-Fi and unplug the ethernet, then transcribe something. If it works, nothing was sent. That single test settles the question more reliably than any privacy policy, because it does not depend on trusting the wording. Two finer checks: run lsof -i -a -p $(pgrep -x AppName) while it transcribes to list its open sockets, or watch it with a per-app firewall like Little Snitch.

Does offline speech to text mean the app never uses the network at all?

Almost never, and the distinction matters. A local app typically still fetches its speech model on first run, checks licences, and looks for updates. What should be offline is the recognition itself. Ask which of the two an app means, because 'runs locally' is sometimes said about a product that uploads audio and processes it in a cloud region near you.

How much disk does a local speech model need?

More than the model's advertised size, because what lands on disk is the compiled form. On my Mac, a model listed at 240 MB occupied 461 MB once installed — the encoder alone was 425 MB. Five models across three families came to 1.7 GB. Budget roughly double the download figure per model.

Why does the first transcription take minutes?

That is CoreML compiling the model for the Neural Engine, once per model per machine. In my measurements the first load of Whisper large-v3-turbo took 2 minutes 35 seconds and every later load took 1.5 seconds; SenseVoiceSmall's first compile took around ten minutes. It never appears in benchmarks, which measure steady state.

Does running locally mean better accuracy?

No. Location and accuracy are unrelated axes. Local models on Apple silicon are at parity with cloud services for clean dictation, and cloud services can afford larger models. What local recognition buys is that the audio does not leave, which is a privacy and cost argument, not a quality one.

Can a local app tell me who is speaking?

Not from a single mixed recording — speaker diarization is a separate problem from transcription, and none of the local models discussed here do it. The exception is when the two sides were captured separately to begin with, as with a call recorded on your own machine, where the labels come from the capture rather than from the model.