Offline speech to text on iPhone: what the platform allows
Offline speech recognition on iPhone: Apple's on-device dictation, the iOS 26 SpeechAnalyzer API, Whisper models, and why keyboard extensions cannot use the mic.
An iPhone can transcribe speech entirely offline, through Apple's own on-device dictation, through the Speech framework, or through third-party models such as Whisper running on the Neural Engine. What it cannot do is let a custom keyboard listen to the microphone: Apple's extension rules forbid it, which is why every third-party voice keyboard on iOS records somewhere else and pastes the text back. This article lays out what the platform allows, with the documentation to back each claim, so you can judge any dictation app's privacy story yourself.
Apple's own dictation: on device for many languages, not all
The keyboard microphone button uses Apple's dictation service. For the languages Apple lists under "On-Device and Modeless Dictation" on the iOS feature availability page, recognition runs on the phone with no network; for other languages the audio goes to Apple's servers. The list changes with each release, so check the iOS feature availability page for your language rather than trusting a blog post. The practical test is the same as for any app: put the phone in Airplane Mode and dictate. If the words appear, recognition is local for that language.
The Speech framework: SFSpeechRecognizer and SpeechAnalyzer
Third-party apps have had access to Apple's recognizer since iOS 10 through SFSpeechRecognizer. It was designed as a network service with an on-device option added in iOS 13: supportsOnDeviceRecognition "indicates whether the speech recognizer can operate without network access", and a request can set requiresOnDeviceRecognition only when that is true. The documentation is candid about the server path's limits: "the framework stops speech recognition tasks that last longer than one minute", and "individual devices may be limited in the number of recognitions that can be performed per day".
iOS 26 introduced a new API in the same framework. SpeechAnalyzer is the session object; you attach modules to it, and "many use cases only need a SpeechTranscriber module, which performs speech-to-text transcriptions". Three things differ from the old class:
- The models are on-device assets managed by the system. Apple's
AssetInventorydocumentation says they are "machine-learning models downloaded from Apple's servers and managed by the system", retained and updated automatically and shared between apps. An app asks for them withAssetInventory.assetInstallationRequest(supporting:)and callsdownloadAndInstall()on the request. - Locale support is queryable.
SpeechTranscriber.supportedLocaleslists locales "including locales that may not be installed but are downloadable", andinstalledLocaleslists what is already on the phone. - There is a second module,
DictationTranscriber, that "uses the same speech-to-text machine learning models as system dictation features do" and is "compatible with older devices", but "does not support languages or locales thatSFSpeechRecognizeronly supports via network access".
SpeechAnalyzer, SpeechTranscriber and DictationTranscriber are all marked iOS 26.0 and later in Apple's documentation, and macOS 26.0 for the Mac. SpeechTranscriber.isAvailable tells an app whether the current device's hardware can run it at all.
Third-party engines that run on an iPhone
Apps that need a specific model, a language Apple does not cover on device, or the same engine on every platform bring their own.
WhisperKit (Argmax) runs OpenAI's Whisper through Core ML, which schedules work on the Neural Engine. Its Swift package declares iOS 16 as the minimum, and it downloads models from the argmaxinc/whisperkit-coreml repository on Hugging Face on first use. That repository is the best public reference for what fits on a phone: openai_whisper-base is a 147 MB folder, and the compressed large models carry their size in the name, such as openai_whisper-large-v3-v20240930_626MB and distil-whisper_distil-large-v3_594MB.
whisper.cpp ships an iOS example app, and its README recommends "the tiny, base or small models for running on an iOS device". The ggml files are small: tiny is 78 MB (32 MB at q5_1), base 148 MB (60 MB), small 488 MB (190 MB). It can use a Core ML encoder on the Neural Engine, with the decoder still running from the ggml file.
MLX has Swift bindings and example apps that run on iOS, including a language model chat example. Larger models need Apple's com.apple.developer.kernel.increased-memory-limit entitlement, which is "only available on some device models", and even then the app must "still behave correctly if additional memory isn't available".
The parameter counts explain the sizes: Whisper tiny is 39 M parameters, base 74 M, small 244 M, medium 769 M, large 1,550 M and turbo 809 M. Distil-Whisper's distil-large-v3 is 756 M, English only, and claimed at 6.3 times the speed of large-v3 within about 1 percent word error rate on long-form audio. On a phone, small and the compressed or distilled large variants are the practical range; full-precision large-v3 is a Mac model.
The thermal reality is that a Neural Engine job at full tilt warms the phone within minutes, iOS lowers clock speeds as it does, and a 45-minute recording transcribed in one pass finishes slower than the first five minutes suggested. Battery cost scales the same way. That is a platform constraint, not a flaw in any one model.
Why a custom keyboard cannot record
Apple's App Extension Programming Guide is direct: "Custom keyboards, like all app extensions in iOS 8.0, have no access to the device microphone, so dictation input is not possible." Nothing since has changed that for keyboards. A keyboard extension also cannot select text, cannot type into secure fields (the system keyboard replaces it there) and draws only inside its own view.
"Allow Full Access", the RequestsOpenAccess key in the keyboard's Info.plist, is often assumed to be the switch that grants microphone access. It is not. The guide lists what it grants: a shared container with the containing app, network access (the keyboard can "send keystrokes and other input events over the network for server-side processing"), the pasteboard, Location Services, contacts, the photo library and iCloud settings sync. Microphone is absent from the list. The same key is why iOS warns that the keyboard may transmit what you type; a voice keyboard that keeps recognition local still needs Full Access for the shared container, so the warning does not by itself mean audio or text is leaving the phone.
The other hard limit is memory. Apple's guide states that "memory limits for running app extensions are significantly lower than the memory limits imposed on a foreground app" and that "the system may aggressively terminate extensions". Developers who have measured it put the keyboard ceiling at roughly 48 to 60 MB; the figure is approximate and varies with iOS version and device. When a keyboard exceeds it, the system kills it without a crash report and switches back to the previous keyboard. Even the smallest Whisper model would not fit that budget alongside the keyboard's own UI, so memory rules out an in-keyboard engine as firmly as the microphone rule does. Extensions are also barred from background modes: including UIBackgroundModes in an extension's Info.plist gets it rejected from the App Store.
What every voice keyboard on iOS actually does
Given those rules, a third-party voice keyboard has two possible shapes. It can hand the user to a system-provided interface that does the recording, or it can open its own container app, a normal app with microphone permission, a normal memory limit and room for a speech model, record and transcribe there, and pass the text back through the shared container that Full Access enables. Either way the recognition happens outside the keyboard's process, and the keyboard's job is to insert the result. That is why a "keyboard that dictates" on iOS always switches away from the current app for a moment, and it holds for every product in the category, on-device or cloud.
The privacy difference between products is therefore not whether they open an app but what the app does with the audio once it has it, which is the on-device versus cloud question. Setting up an on-device keyboard is covered in the offline dictation on iPhone guide.
Background execution and long transcriptions
A foreground app can run a speech model as long as it likes. Once the user switches away, iOS gives the app "a finite amount of time" through beginBackgroundTask(expirationHandler:), and "if you don't call endBackgroundTask(_:) for each task before time expires, the system kills the app"; in practice that window is under a minute. The audio background mode keeps an app alive only while it "plays audible content in the background" or is actively recording, not to run a model after a recording has stopped. For deferred work there is BGProcessingTask, "a time-consuming processing task that runs while the app is in the background", which can run for minutes but "only when the device is idle", and the system, not the app, decides when. Transcribing a two-hour lecture on an iPhone therefore happens while the app is in front, or in pieces when the system allows, and an honest app tells you which.
Where the models live and how big a download is acceptable
Apple's system models (dictation, the Speech framework assets) are stored and updated by iOS outside any app's sandbox. Third-party models are bundled in the app or downloaded to its container after install. App Store Connect allows an iOS app up to 4 GB uncompressed, but the App Store's cellular setting defaults to asking before downloads over 200 MB, so most apps ship small and fetch the speech model on first launch. A base or small Whisper is a few hundred megabytes; a compressed large-v3 or Parakeet-class model is roughly 600 MB to 1.2 GB. An app that needs more than a gigabyte before it can transcribe should say so up front and do it once.
Privacy claims you can verify yourself
Two checks require no trust in the vendor:
- Airplane Mode. After the model is installed, turn on Airplane Mode and transcribe. If it works, the recognition is on device. If it stalls, it is not, whatever the description says.
- App Privacy Report. In Settings, tap Privacy & Security, scroll to App Privacy Report and turn it on. It records, for the past seven days, when each app accessed the microphone and which network domains it contacted. A local transcription app should show microphone access and, apart from a model download and optional crash reporting, no domains at all.
Add the App Store privacy label and whether the app demands an account, and you have most of the picture.
Where ThinkScribe fits
Frequently asked questions
Can a custom keyboard on iOS use the microphone?
No. Apple's App Extension Programming Guide states that custom keyboards have no access to the device microphone, and enabling Allow Full Access does not change that; it grants network, pasteboard and shared-container access, not audio input. Every voice keyboard on iOS records in its container app or in a system interface and inserts the text afterwards.
Does iPhone dictation work offline?
For the languages Apple lists under on-device dictation on its iOS feature availability page, yes, with no network needed. For other languages the audio is sent to Apple's servers. Airplane Mode is the quickest way to find out which applies to your language.
Can Whisper run on an iPhone?
Yes. WhisperKit runs Whisper through Core ML on the Neural Engine on iOS 16 and later, and whisper.cpp has an iOS example that recommends the tiny, base or small models. Compressed and distilled large variants around 600 MB are usable on recent iPhones; full-precision large-v3 is not a practical phone model.
What is SpeechAnalyzer in iOS 26?
It is the new session class in Apple's Speech framework. Apps attach a SpeechTranscriber module for general transcription or a DictationTranscriber for dictation-style text on older devices, the models are on-device assets downloaded and managed by the system through AssetInventory, and the API exposes which locales are supported and which are already installed.