Two speech engines, three cleanup models, and a device check that runs before the first download so a phone never ends up with weights it cannot hold in memory.
OpenWispr for Android ships two independent speech backends. Parakeet is the default: NVIDIA's Parakeet-TDT 0.6B v2, quantised to int8 and run through sherpa-onnx. Whisper is the alternative, run through whisper.cpp, in three sizes.
The project's own note on why Parakeet is the default, from the code that loads it: on a Galaxy S25 it measures a median on-device transcription of about 238 ms and a 95th percentile of about 491 ms, with a word error rate on prose below that of Whisper small, which is the largest Whisper the app offers. That is the project's own measurement on one device, not an independent benchmark, and it is quoted here as such.
Parakeet arrives as four files rather than one: an encoder, a decoder, a joiner and a token list. The int8 encoder is roughly 98% of the bytes, which is why the download progress you see is essentially the encoder's.
| Model | Engine | Download | Source |
|---|---|---|---|
| Parakeet — the default | sherpa-onnx, Parakeet-TDT 0.6B v2, int8 | ~631 MB across 4 files | Hugging Face: csukuangfj/sherpa-onnx-nemo-parakeet-tdt-0.6b-v2-int8 |
| Whisper tiny — fastest | whisper.cpp, ggml | ~75 MB | Hugging Face: ggerganov/whisper.cpp |
| Whisper base — balanced | whisper.cpp, ggml | ~142 MB | Hugging Face: ggerganov/whisper.cpp |
| Whisper small — most accurate | whisper.cpp, ggml | ~488 MB | Hugging Face: ggerganov/whisper.cpp |
The polish stage — the optional model pass that runs after the deterministic cleanup — has its own small catalogue of GGUF models run through llama.cpp. The default and recommended one is the project's own fine-tune: Qwen3 0.6B, trained specifically on dictation cleanup with the exact prompt the app feeds it at runtime, which is why it ignores the polish-level instructions and simply runs its trained behaviour.
The other two are stock instruct models, offered because a fine-tune is an opinion and some people would rather bring their own.
| Model | Quantisation | Download |
|---|---|---|
| OpenWispr Cleanup (Qwen3 0.6B) — default | Q4_K_M | ~397 MB |
| Gemma 3 270M | Q4_0, quantisation-aware trained | ~241 MB |
| Qwen3 0.6B | Q8_0 | ~639 MB |
The failure mode this exists to prevent is specific and nasty: the download succeeds, the progress bar fills, everything looks fine — and then the first dictation fails on a phone that never had the memory to hold the weights. So before the first download, OpenWispr reads the device's total memory, Android's own low-RAM-device flag, and the free space in the app's own directory, and picks a pair from that.
The thresholds are set just under each nominal tier, because a phone sold as "4 GB" reports roughly 3.6 GiB to Android once the kernel and hardware carve-outs are taken out, and one sold as "6 GB" reports roughly 5.5 GiB.
| Tier | Chosen when | Speech | Cleanup | Total |
|---|---|---|---|---|
| Full | Total RAM at or above 5.4 GiB — roughly a 6 GB-class phone and up | Parakeet | OpenWispr Cleanup fine-tune | ~1,028 MB |
| Compact | Total RAM at or above 3.4 GiB — roughly a 4 GB-class phone | Whisper base | Gemma 3 270M | ~383 MB |
| Minimal | Below that, or any device Android itself flags as low-RAM | Whisper tiny | Gemma 3 270M | ~316 MB |
The ordering matters as much as the numbers, and each of these is a deliberate decision rather than an accident of the code:
A smaller tier is a smaller model, not a cloud fallback and not a cut-down mode. The minimal configuration still transcribes and still cleans up, entirely on the phone, with no account and no network. What you give up is accuracy on long, fast, accented or noisy speech, which is a genuine cost and one worth stating rather than hiding.
None of it is a lock, either. Settings lists every speech model with its size, marks the one recommended for your device with a badge, and lets you move in either direction — a larger model on a modest phone if you want to try it, or a smaller one on a flagship to save the space. Models you are not currently using can be deleted from the same screen; the active one cannot.
Model files are large and phone connections are not reliable, so the download path is built around being interrupted. Everything here is specific and checkable:
Range request with an If-Range condition. If the server answers 200 rather than 206 — meaning the range was ignored or the file changed underneath — the partial is thrown away and the download starts over rather than splicing two different files together. A partial with no recorded validator is also discarded, because there is no way to prove it belongs to this file.This is one of the places where the honest answer is that the source does not settle it, so this page will not pretend otherwise.
The Whisper models are described in the app's own code as a registry of multilingual sizes, and the app never pins them to a language. Beyond that, nothing in the repository states language coverage for Parakeet or for any of the cleanup models: there is no language setting, no locale parameter passed to any recogniser, and no per-model language metadata used for anything. If language coverage matters to your decision, check the upstream model cards for the model you intend to use, rather than trusting a claim on this page.
One platform difference that is in the code: the macOS app uses the English-only .en Whisper builds and pins decoding to English, where Android uses the multilingual ones. See Getting started on macOS.
Open source and entirely on your device. Android from Google Play, macOS from GitHub — no account, no sign-up, just a download.