Speech models

Apple SpeechAnalyzer, up close.

Apple's Speech framework got a new engine in the 26 releases. Here is what it does, how it differs from SFSpeechRecognizer, and how it scored in our own tests.

Download FrazeFirst 30 minutes free, no card.

The short answer

SpeechAnalyzer is the class in Apple's Speech framework that runs an analysis session. You add modules to it, and the one most apps want is SpeechTranscriber, the speech-to-text module. Apple lists both as new in iOS 26, macOS 26 and the other 26 releases. The WWDC25 session says the model is on device and covers every platform but watchOS, with hardware requirements.

Apple has not marked SFSpeechRecognizer as deprecated, but for new work on the 26 releases SpeechAnalyzer is the better fit. Apple's page for the older class tells you to plan for a one-minute limit on audio duration and calls recognition a network-based service with daily limits. The WWDC25 session says the new model is good for long-form and distant audio.

Fraze uses it on macOS 26 for the languages SpeechTranscriber covers. Everywhere else it runs NVIDIA Parakeet TDT 0.6B v3 through sherpa-onnx. Our accuracy numbers are below.

What the two classes do

  • SpeechAnalyzer holds the modules, accepts audio and controls the session, one input sequence at a time. SpeechTranscriber is the transcription module, which Apple calls appropriate for normal conversation and general purposes.
  • Audio goes in as an async sequence of AnalyzerInput values, and results come out of the transcriber's results sequence, which you read in a separate task. Each result carries the time range of the audio it covers.
  • With the volatileResults reporting option the transcriber sends tentative text for a range of audio, refines it, then closes the range with one final result. Without it you get only final results.
  • DictationTranscriber is the fallback for devices SpeechTranscriber does not support. Apple says it uses the same models as SFSpeechRecognizer set to on-device work. It is also new in the 26 releases, so it reaches older devices, not older systems.

Where the model comes from

You do not ship it. Apple's AssetInventory page says these assets are machine learning models downloaded from Apple's servers and managed by the system: once one is installed the system retains it, updates it and shares it with other apps. The WWDC session adds that it sits in system storage and runs outside your app's memory space.

There is no language list in the framework reference, so do not hard-code one. Read supportedLocales for what can be installed, installedLocales for what is already there, and supportedLocale(equivalentTo:) to map a locale such as ja onto one the model has. Apple warns that this last call can return a near equivalent with a different region.

How Fraze drives it

  • Apple documents contextualStrings as words or phrases that should be recognized even if they are not in the system vocabulary. Keep each to one or two words, and under 100 across all tags.
  • Apple's text describes that property for DictationTranscriber and does not say what SpeechTranscriber does with it, so Fraze treats the terms as a hint and keeps going if the call fails.
  • When standard input closes, the helper ends the input stream and calls finalizeAndFinishThroughEndOfInput. The last volatile lines become final and the results loop ends.

Fraze runs SpeechAnalyzer in a small Swift helper. The app writes 16 kHz mono 16-bit PCM to its standard input and reads one JSON object per line back, so a fault in the framework does not take the app down. The transcription path, trimmed:

import Speech

// Inside an async function. Pick a locale the model actually has; this can
// return a near equivalent with a different region.
guard let locale = await SpeechTranscriber.supportedLocale(equivalentTo: Locale(identifier: "ja"))
else { return }

let transcriber = SpeechTranscriber(
  locale: locale,
  transcriptionOptions: [],
  reportingOptions: [.volatileResults],
  attributeOptions: [])

// The model is a system asset. Download it once; the system keeps and updates it.
if await AssetInventory.status(forModules: [transcriber]) != .installed,
   let request = try await AssetInventory.assetInstallationRequest(supporting: [transcriber]) {
  try await request.downloadAndInstall()
}

// The analyzer does not resample. Convert your audio to this format yourself.
guard let format = await SpeechAnalyzer.bestAvailableAudioFormat(compatibleWith: [transcriber])
else { return }
let analyzer = SpeechAnalyzer(modules: [transcriber])

// Custom vocabulary: names and terms to bias recognition toward. A hint, so
// a failure here is ignored.
let context = AnalysisContext()
context.contextualStrings[.general] = ["Fraze", "Parakeet"]
try? await analyzer.setContext(context)

// inputSequence is your AsyncStream<AnalyzerInput>: AnalyzerInput(buffer:) values
// whose AVAudioPCMBuffer is already in `format`.
try await analyzer.start(inputSequence: inputSequence)

for try await result in transcriber.results {
  let text = String(result.text.characters)
  print(result.isFinal ? "final: \(text)" : "volatile: \(text)")
}

Translation, and why only the low-latency strategy

The Translation framework is separate. TranslationSession has existed since macOS 15 and iOS 18, but asking for a strategy is new: Apple lists TranslationSession.Strategy as iOS 26.4 and macOS 26.4. The docs describe lowLatency as fast translation with traditional models, for cases such as translating audio in real time, with languages downloaded before use. The other strategy, highFidelity, uses Apple Intelligence models and may take longer.

Apple's page for the class says all translations using TranslationSession are processed on the user's device. Fraze asks for lowLatency and nothing else, for two reasons. It is the one Apple points at real-time audio. And its state can be checked: Fraze asks LanguageAvailability, with the same strategy, whether a pair is installed, and does not use Apple translation for the pair otherwise.

The second reason comes from an observation of our own. Without a strategy set, a session returned translations for pairs whose language packs we had not added in System Settings. Apple's highFidelity page gives a possible cause: those models are already downloaded when Apple Intelligence is on, so no language download is needed. We did not test further.

How accurate is it

LibriSpeech cleanEarnings-22GermanJapanese
Apple SpeechAnalyzer1.8212.037.376.09
Parakeet TDT 0.6B v32.1511.206.21not supported
Whisper turbo, WhisperKit1.9312.35not runnot run
Whisper turbo, hosted1.9811.905.335.11
Soniox (cloud)2.7811.614.412.92
FrazeApple or ParakeetApple or ParakeetApple or ParakeetApple only
  • Spanish: Parakeet 6.05, Apple 7.04, hosted Whisper 5.68, Soniox 5.04.
  • French: Parakeet 7.83, Apple 8.42, hosted Whisper 6.82, Soniox 5.72.
  • Russian: Parakeet 9.18, hosted Whisper 7.48, Soniox 6.52. The Apple engine had no Russian in our run.
  • Korean: Apple 15.61, hosted Whisper 13.66, Soniox 9.62. Parakeet v3 has no Korean.
  • Chinese: Apple 6.76, hosted Whisper 6.01, Soniox 4.71. Parakeet v3 has no Chinese.

Word error rate in percent, lower is better, from our own runs on an Apple silicon Mac. Japanese and Chinese are character error rate. The per-language numbers are FLEURS read speech, 200 clips each, measured on 2026-08-30.

Whisper large-v3-turbo appears twice. One row ran on-device through WhisperKit, a Core ML port, not OpenAI's reference PyTorch build. The other is a hosted copy, the only one we ran on FLEURS. Parakeet ran through parakeet-mlx, not the int8 sherpa-onnx build Fraze ships.

What that means, and the limits

  • Apple platforms only, and no way to run the model outside Apple's frameworks.
  • The 26 releases only, and not watchOS. DictationTranscriber is new in 26 as well, so on older systems the choice is SFSpeechRecognizer.
  • The WWDC session mentions hardware requirements, so check SpeechTranscriber.isAvailable first.
  • The model is closed. Apple publishes no weights, and you cannot pin a version: Apple says the system updates the assets automatically.
  • Choosing a translation strategy needs macOS 26.4 or iOS 26.4.

On clean read English the top is a tie. Apple's 1.82 has a 95 percent interval of 1.66 to 1.99, which takes in Whisper turbo. LibriSpeech is in Parakeet's training data, and several cloud engines scored lower than all of these.

Conference calls are closer to what a meeting sounds like. There Apple scored 12.03 (11.52 to 12.56) against Parakeet v3's 11.20 (10.71 to 11.74). The intervals overlap, but the benchmark's paired test on the same clips puts Apple 0.5 to 1.2 points behind Parakeet, and level with Whisper through WhisperKit at 12.35 (11.87 to 12.86). The repository says the reference PyTorch Whisper turbo scores about 11.1 on this set, level with Parakeet.

Outside English the cloud engine led Apple by two to three points, and by six on Korean, with hosted Whisper in between. Apple was about a point behind Parakeet on German, Spanish and French. At 200 clips the intervals run about a point either side, so read small gaps as ties. Apple and Parakeet both ran at about 0.02 times real time. The repository does not rank engines on speed.

The Fraze row shows which engine the app runs: Apple's on macOS 26 where it has the language, Parakeet otherwise. What the Apple engine adds for Fraze is languages: Japanese, Korean and Chinese, which Parakeet v3 does not have.

Questions

What is Apple's SpeechAnalyzer API?

The class in Apple's Speech framework that manages a speech analysis session. You add modules, pass audio in as an async sequence, and read results out of another. For speech to text the module is SpeechTranscriber.

SpeechAnalyzer vs SFSpeechRecognizer: which should I use?

SpeechAnalyzer, if you can require the 26 releases. Apple's own page for SFSpeechRecognizer says to plan for a one-minute limit on audio duration, calls recognition a network-based service with daily limits, and notes that some languages need a connection. The older class can be told to stay on device with requiresOnDeviceRecognition, where Apple says requests won't be as accurate. On systems before 26 it is the only choice of the two.

Does SpeechTranscriber run on device?

The transcription does. The WWDC25 session says the model is on device. Apple's AssetInventory page says the models are downloaded from Apple's servers, so that download is the step that needs a connection.

Which languages does SpeechTranscriber support?

The framework reference has no fixed list, and the WWDC25 session showed one with more to come. Ask at runtime with supportedLocales and installedLocales. Fraze adds the Apple languages to its menu from that answer.

Does Fraze use SpeechAnalyzer?

Yes, on macOS 26, for the languages SpeechTranscriber covers on that Mac. For other languages, on older macOS and on Windows, Fraze runs Parakeet. The app picks the engine for you. Either way no audio and no transcript text leaves the computer.

Try it on your next call.

Download Fraze

macOS 14 or later on Apple silicon. The Windows 11 build is not out yet. Needs a free account.