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 AssetInventory documentation 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 with AssetInventory.assetInstallationRequest(supporting:) and calls downloadAndInstall() on the request.
  • Locale support is queryable. SpeechTranscriber.supportedLocales lists locales "including locales that may not be installed but are downloadable", and installedLocales lists 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 that SFSpeechRecognizer only 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.

Whisper converted to Core ML. OpenAI's Whisper models can be converted to Apple's Core ML format, which lets iOS schedule the work on the Neural Engine. Public conversions give a good sense of what fits on a phone: the base model is a folder of about 147 MB, and compressed large variants sit around 600 MB (a compressed large-v3 at 626 MB, a distilled large-v3 at 594 MB).

Whisper in the ggml format. Ports written in C and C++ use smaller quantized files and recommend the tiny, base or small models for phones. Tiny is 78 MB (32 MB when quantized to 5 bits), base 148 MB (60 MB), small 488 MB (190 MB).

Larger models in general. Apps that run bigger speech or language 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 has to switch to its app, at least when that app is not already running, 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:

  1. 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.
  2. 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 diagnostics, no domains at all.

Add the App Store privacy label and whether the app demands an account, and you have most of the picture.

Speech to text you can use today

ThinkScribe works within these rules. On iPhone and iPad it transcribes your recordings on your device, works offline, needs no account, and your recordings and transcripts are never sent to us. Its voice typing keyboard hands recording to the ThinkScribe app and returns the text, exactly as described above; setup is in the offline dictation guide, and first steps are in getting started on iPhone. If you want to watch the words appear while you record, see live transcription on iPhone.

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. Whisper can be converted to Apple's Core ML format and run on the Neural Engine, and C and C++ ports recommend the tiny, base or small models for phones. 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.