SFSpeechRecognizer — de primaire Apple API voor spraakherkenning in het iOS-ecosysteem. Het framework biedt toegang tot de ASR-engine van het apparaat via Speech.framework en ondersteunt real-time streaming transcriptie en eenmalige herkenning van audiobestanden. SFSpeechRecognizer is beschikbaar op iOS 10+, macOS 10.15+, watchOS 6+ en tvOS 17+. Met iOS 17 voegde Apple een volledige on-device modus toe, waarmee spraakherkenning zonder internetverbinding mogelijk is. Volgens Apple Speech Documentation, 2025 wordt SFSpeechRecognizer gebruikt in meer dan 200.000 App Store-apps en verwerkt het dagelijks miljoenen verzoeken met WER 7% voor Engels.
Belangrijkste punten
SFSpeechRecognizer — een klasse uit Speech.framework die een spraakherkenner voor een specifieke taal vertegenwoordigt. Het wordt geïnitialiseerd met Locale (ru_RU, en_US, zh_CN). SFSpeechRecognizer beheert het herkenningsverzoek (SFSpeechRecognitionRequest) en retourneert een resultaat (SFSpeechRecognitionResult) met transcripties en metadata. Ondersteunt twee soorten verzoeken: SFSpeechAudioBufferRecognitionRequest (live audiostream) en SFSpeechURLRecognitionRequest (audiobestand). Beide retourneren SFTranscription — een array van alternatieve herkenningsvarianten.
SFSpeechRecognitionResult bevat: bestTranscription (beste variant, SFTranscription), transcriptions (alle alternatieven), isFinal (definitief/tussentijds). SFTranscription bevat: formattedString (tekst), segments (array van SFTranscriptionSegment met tijdstempels, confidence, substringRange, alternativeSubstrings). Confidence voor elk segment (0..1) — maakt het filteren van onbetrouwbare fragmenten mogelijk. segments — de belangrijkste functie van Speech.framework: biedt annotatie van elk woord met vertrouwen.
Architectuur van SFSpeechRecognizer: AVFoundation (audio vastleggen) → Audio Buffer → SFSpeechAudioBufferRecognitionRequest → SFSpeechRecognizer (ASR-engine) → SFSpeechRecognitionResult → SFSpeechRecognitionTask (controle: cancel, finish, pause). De ASR-engine van Apple gebruikt een hybride architectuur: Conformer (encoder) + RNNT (decoder) voor on-device, Transducer voor cloud. Modellen zijn geoptimaliseerd voor Apple Neural Engine (ANE). Op A17 Pro werkt on-device ASR met RTF 0.3–0.6 (sneller dan real-time).
| Component | Doel | iOS Versie |
|---|---|---|
| SFSpeechRecognizer | Primaire herkenningsklasse | iOS 10+ |
| SFSpeechAudioBufferRecognitionRequest | Live audiostream | iOS 10+ |
| SFSpeechURLRecognitionRequest | Audiobestand (.wav, .m4a) | iOS 10+ |
| SFSpeechRecognitionTask | Verzoekbeheer (cancel, finish) | iOS 10+ |
| On-device recognition | Offline ASR | iOS 17+ |
| Combined Recognition | Hybride on-device + cloud | iOS 17+ |
Audio vereisten: SFSpeechRecognizer accepteert LPCM (16 kHz, 16 bit, mono) of Opus (iOS 17+). AVFoundation kan de buffer in elk formaat vastleggen, het verzoek converteert automatisch. Minimale lengte: 0,5 seconde (stiltedetectie). Maximaal: 1 minuut (cloud) / 2 minuten (on-device) per verzoek. Voor lange transcriptie verdeel je audio in brokken van 30–60 seconden met overlapping van 2–5 seconden.
Gebruikersmachtigingen: SFSpeechRecognizer vereist twee expliciete machtigingen. NSMicrophoneUsageDescription (Privacy — Microphone Usage Description) — voor toegang tot de microfoon. NSSpeechRecognitionUsageDescription (Privacy — Speech Recognition Usage Description) — voor toegang tot spraakherkenning. Beide zijn strings die aan de gebruiker uitleggen waarom. SFSpeechRecognizer.requestAuthorization — het aanroepen van de machtigingsdialoog. Statussen: notDetermined, denied, restricted, authorized. Zonder authorized geeft de recognizer-aanroep fout 216 (Speech framework error).
Beschikbaarheid controleren: SFSpeechRecognizer.isAvailable — controleert of ASR beschikbaar is voor de huidige taal. Op iOS 16- is isAvailable = false zonder internet. Op iOS 17+ is isAvailable = true voor on-device talen, zelfs offline. SFSpeechRecognizer.supportedLocales — statische methode om de lijst met ondersteunde talen van het apparaat te verkrijgen. Het wordt aanbevolen om isAvailable te controleren voor elke start (de gebruiker kan Siri/Dicteren uitschakelen in instellingen). Beschikbaarheid hangt af van de regio: Chinees — alleen in China, Arabisch — in de VAE.
// SFSpeechRecognizer instellen
import Speech
SFSpeechRecognizer.requestAuthorization { status in
guard status == .authorized else { return }
}
let recognizer = SFSpeechRecognizer(locale: Locale(identifier: "ru_RU"))!
guard recognizer.isAvailable else {
print("ASR niet beschikbaar. Schakel Siri en Dicteren in in Instellingen")
return
}
let request = SFSpeechAudioBufferRecognitionRequest()
request.requiresOnDeviceRecognition = true
Foutafhandeling: SFSpeechRecognizer wordt aangeroepen met een completion handler die een Error kan retourneren. Belangrijkste fouten: 203 — no internet (cloud, iOS 16-); 216 — not authorized (geen machtiging); 301 — audio error (probleem met microfoon/formaat); 401 — service unavailable (dienst overbelast); 601 — language unavailable (taal wordt niet ondersteund op het apparaat). Voor on-device iOS 17+ belangrijkste fouten: 301 (audio), 601 (language). Verwerk altijd de completion handler — fouten kunnen op elk moment tijdens de opname optreden.
Live ASR-pipeline: AVAudioEngine (opnemen via microfoon) → installTap (audiobuffer) → request.append(buffer) → SFSpeechRecognizer → recognitionTask → delegate/resultHandler. AVAudioEngine zorgt voor lage latentie (5–10 ms van microfoon naar buffer). SFSpeechRecognitionDelegate: didHypothesizeTranscription (elke 200–500 ms — gedeeltelijke tekst), didFinishRecognition (definitief resultaat). Task.isFinishing — kan worden geannuleerd wanneer herkenning is voltooid. Voor continue herkenning (onbeperkt dicteren) — maak een nieuwe task na isFinal.
SFSpeechRecognitionTaskDelegate: optionele methoden. speechRecognitionDidDetectSpeech (begin van spraak) — voor UI-indicatie. didHypothesizeTranscription (tussentijdse tekst) — om weer te geven tijdens het spreken. didFinishRecognition (definitief resultaat) — voor het vastleggen van tekst. didFinishSuccessfully (succes/fout) — voor voltooiing. didProcessAudio (audiobuffer verwerkt) — voor RMS-meter. Het wordt aanbevolen om didHypothesizeTranscription te implementeren — de gebruiker ziet de tekst onmiddellijk, zonder vertraging. Definitieve transcriptie — voor opslag.
// Live spraakherkenning
let audioEngine = AVAudioEngine()
let request = SFSpeechAudioBufferRecognitionRequest()
request.shouldReportPartialResults = true
recognitionTask = recognizer.recognitionTask(with: request) { result, error in
if let result = result {
textView.text = result.bestTranscription.formattedString
}
if error != nil || result?.isFinal == true {
audioEngine.stop()
request.endAudio()
}
}
let inputNode = audioEngine.inputNode
let recordingFormat = inputNode.outputFormat(forBus: 0)
inputNode.installTap(onBus: 0, bufferSize: 1024,
format: recordingFormat) { buffer, _ in
request.append(buffer)
}
audioEngine.prepare()
try audioEngine.start()
Continue herkenning: voor de modus ‘altijd luisteren’ (spraakinvoer, assistent) is het opnieuw starten van de taak na isFinal vereist. Maak een lus: finishTask → request = SFSpeechAudioBufferRecognitionRequest() → recognitionTask = recognizer.recognitionTask(with: request). Om pauzes te voorkomen, overlap het einde van de ene taak met het begin van de volgende (start een nieuw verzoek 1–2 seconden voor het einde van de vorige). AVFoundation AVAudioSession — configuratie .playAndRecord voor gelijktijdig afspelen en opnemen. Op iOS 17+ verbruikt continue ASR met on-device 2–5% batterij per uur (A15+).
SFSpeechURLRecognitionRequest — verzoek voor herkenning van een audiobestand via URL. Ondersteunt formaten: .wav (16 kHz, 16 bit, mono), .m4a (AAC), .mp4, .mov. Maximale lengte: ~1 minuut voor cloud, ~2 minuten voor on-device. Voor langere bestanden — verdeel in brokken (AVAssetExportSession + trim). SFSpeechURLRecognitionRequest ondersteunt geen streaming (geen gedeeltelijke resultaten) — alleen definitief resultaat. Voor gedeeltelijke resultaten met bestand — converteer naar Audio Buffer Request.
Transcriptie van audiobestand verkrijgen: SFSpeechRecognizer.recognitionTask(with: request) resultHandler. Haal bestTranscription.formattedString op. Voor tijdstempels op woordniveau — segments van bestTranscription.segments (segment.duration, segment.timestamp, segment.substring). Confidence per segment — het vertrouwen van ASR in elk woord (gebruik voor filtering). Alternatieve varianten — transcriptionFormatter-alternatieven voor woorden met lage confidence. Voor bestanden met meerdere sprekers — SFSpeechRecognitionRequest kan meerdere verzoeken retourneren (één per spreker, iOS 17+).
// Audiobestand transcriptie
let audioURL = Bundle.main.url(forResource: "recording", withExtension: "m4a")!
let request = SFSpeechURLRecognitionRequest(url: audioURL)
request.requiresOnDeviceRecognition = true
recognizer.recognitionTask(with: request) { result, error in
guard let result = result, error == nil else {
print("Fout: \(error?.localizedDescription ?? "unknown")")
return
}
let transcription = result.bestTranscription
let text = transcription.formattedString
let words = transcription.segments.map { segment in
Word(text: segment.substring,
start: segment.timestamp,
duration: segment.duration,
confidence: segment.confidence)
}
}
Verdelen van lange audiobestanden: voor bestanden > 1 minuut knip je in brokken van 30–60 seconden met overlapping van 2–3 seconden (samenvoegen). AVAssetExportSession + CMTimeRange — export van brokken. Alternatief: UISelectionView (gebruiker selecteert segment). Samenvoegen van transcripties: concatenatie van teksten, samenvoegen via overlapping (laatste 2–3 woorden van vorig brok vergelijken met eerste 2–3 woorden van volgende — verwijder duplicaten). Vosk en Whisper ondersteunen lange audio native, SFSpeechRecognizer — niet. Voor lange transcriptie beveel ik Whisper (Core ML) aan — geen lengtebeperking.
On-device modus (iOS 17+): request.requiresOnDeviceRecognition = true. ASR wordt lokaal uitgevoerd op Apple Neural Engine (ANE). Voordelen: zonder internet, privacy (audio verlaat het apparaat niet), nul kosten (gratis), lage latentie (RTF 0.3–0.6). Nadelen: lagere nauwkeurigheid (WER 12–14% vs 7–12%), limiet van 2 minuten per verzoek, beperkte talenset (niet alle 60 talen beschikbaar on-device). Het on-device model neemt ~50–100 MB in beslag op het apparaat, wordt geladen bij het eerste verzoek.
Cloud (iOS 16-): request.requiresOnDeviceRecognition = false (of parameter ontbreekt). ASR op Apple-servers — nauwkeuriger (WER 7% EN, 12% RU), meer talen, tot 1 minuut per verzoek. Vereist internet (WiFi of mobiel). Apple brengt geen kosten in rekening aan de ontwikkelaar voor cloud ASR (gratis). Limieten: 1 verzoek per minuut per app (niet gespecificeerd), maar voor productieschaal kan Apple beperken. cloud ASR — best-effort kwaliteit, zonder SLA. Gebruik voor bedrijfsapps Google Cloud ASR of Whisper (Core ML).
| Parameter | On-device (iOS 17+) | Cloud (iOS 10+) |
|---|---|---|
| Vereist internet | Nee | Ja |
| WER (EN) | 10–12% | 7% |
| WER (RU) | 12–14% | 12% |
| Latentie (RTF) | 0.3–0.6 | 0.3–0.8 (+netwerk) |
| Max. lengte | 2 minuten | 1 minuut |
| Privacy | Volledig | Audio gaat naar server |
| Gratis | Ja | Ja |
Combined Recognition (iOS 17+): request.requiresOnDeviceRecognition = false met internet (cloud), = true bij offline (fallback). Apple kiest automatisch de modus. Voor apps die kritisch zijn voor nauwkeurigheid: controleer NetworkMonitor (NWPathMonitor) — met internet cloud, zonder on-device. Voor apps die kritisch zijn voor privacy: altijd on-device. Voor transcriptie: cloud (nauwkeuriger). Voor spraakinvoer: on-device (sneller). Aanbevolen Combined: 80% cloud, 20% on-device fallback.
Spraakinvoer in aangepast toetsenbord — SFSpeechRecognizer is ingebouwd in toetsenbordextensies (iOS 10+). De gebruiker drukt op de microfoonknop — ASR transcribeert spraak naar tekst en voegt deze in het tekstveld in. Vereisten: gedeeltelijke resultaten (tekst in real-time zien), on-device (toetsenbord moet zonder internet werken). SFSpeechRecognizer + AVSpeechSynthesizer — spraakinvoer + spraakuitvoer. Gebruik voor aangepast toetsenbord op iOS 17+ on-device. Beperkingen van toetsenbordextensie: AVAudioEngine is beschikbaar, maar met tijdsbeperkingen (background execution limited).
Transcriptie van vergaderingen en lezingen — apps voor het opnemen en transcriberen van audio (Otter.ai, Rev, Apple Voice Memos). SFSpeechURLRecognitionRequest verwerkt het .m4a-bestand. Voor lange opnames (30–60 minuten) — Whisper Core ML (geen lengtebeperking). SFSpeechRecognizer-segmenten met tijdstempels — voor synchronisatie van tekst met audio (markeren van tekst tijdens afspelen). Confidence per segment — voor weergave van onbetrouwbare fragmenten (gele markering). Voor sprekerdiarisatie (wie sprak) — Apple biedt geen API, gebruik pyannote-audio + Whisper op de server.
Spraakopdrachten in iOS-apps — SFSpeechRecognizer + VGS framework (Voice Grammar Services) voor het uitvoeren van opdrachten: “open instellingen”, “verstuur bericht”, “doe licht aan”. Grammatica-gebaseerde herkenning: SFSpeechRecognitionRequest contextualStrings = array van opdrachten. Dit verhoogt de nauwkeurigheid van opdracht herkenning tot 95% (vs 85% free-form). SFSpeechRecognitionTask.cancel — voor onderbreken na uitvoering van opdracht. VGS + SFSpeechRecognizer + Shortcuts — aangepaste spraakopdrachten zonder interface te schrijven. Voor toegankelijkheid: Voice Control (ingebouwd) + SFSpeechRecognizer (aangepaste opdrachten).
// Spraakopdrachten met contextuele strings
let request = SFSpeechAudioBufferRecognitionRequest()
request.requiresOnDeviceRecognition = true
request.shouldReportPartialResults = true
request.contextualStrings = ["open contacts", "send message",
"show notifications", "zet zaklamp aan"]
recognitionTask = recognizer.recognitionTask(with: request) { result, _ in
guard let text = result?.bestTranscription.formattedString.lowercased() else { return }
voiceCommands.first { text.contains($0) }.map { command in
DispatchQueue.main.async { self.executeCommand(command) }
recognitionTask?.cancel()
}
}
Dicteren in medische en juridische apps — SFSpeechRecognizer voor het maken van gestructureerde documenten met spraak. Domain Adaptation: contextualStrings met medische/juridische termen (500+ zinnen). SFSpeechRecognitionRequest.customLmProbability — invloed van contextualStrings (0.1–1.0). Gebruik voor medisch dicteren on-device (privacy van patiëntgegevens). Whisper fine-tuned op medische gegevens — alternatief met WER 5% in plaats van 12% van de basis SFSpeechRecognizer. HIPAA-naleving: on-device modus (gegevens verlaten het apparaat niet). Voor transcriptie van consulten — SFSpeechURLRecognitionRequest + segments met tijdstempels van spreker.
Veelgestelde vragen
SFSpeechRecognizer is beschikbaar vanaf iOS 10, macOS 10.15, watchOS 6 en tvOS 17. On-device modus — vanaf iOS 17 (requiresOnDeviceRecognition). Op iOS 10–16 werkt SFSpeechRecognizer alleen via Apple-cloudservers (vereist internet). Op alle versies is expliciete toestemming van de gebruiker vereist (NSMicrophoneUsageDescription + NSSpeechRecognitionUsageDescription). SFSpeechRecognizer.supportedLocales — dynamische lijst, afhankelijk van regio en apparaatmodel.
Ja, door nieuwe recognitionTask te maken na isFinal. Herstart de taak na finalisatie van de vorige voor continue herkenning. Op iOS 17 verbruikt continue on-device ASR 2–5% batterij per uur (A15+). Op iOS 16- vereist continue ASR internet (dataverbruik ~1 MB/minuut). Gebruik voor echt continue herkenning (altijd luisteren) Vosk (offline) of Whisper Core ML. SFSpeechRecognizer ondersteunt de altijd-aan modus niet op iOS 16-.
Gebruik result.bestTranscription.segments — elke SFTranscriptionSegment bevat confidence (Float 0..1) voor het woord. segments[i].substring — tekst van het woord. segments[i].confidence — het vertrouwen van ASR in dit woord. Woorden met confidence < 0.5 — onbetrouwbaar, markeer ze in de UI. segments[i].timestamp — starttijd (TimeInterval). segments[i].duration — duur. segments[i].alternativeSubstrings — alternatieve herkenningsvarianten van het woord. Voor lange bestanden geeft het doorlopen van segments per-word confidence zonder handmatig parsen.
203 — is SFSpeechError.ErrorCode.opportunistic (geen internet voor cloud ASR). Treedt op op iOS 16- of met request.requiresOnDeviceRecognition = false zonder internet. Oplossing: stel requiresOnDeviceRecognition = true in (iOS 17+) voor offline werking. Gebruik op iOS 16- NWPathMonitor — toon bij geen internet het bericht “voor spraakherkenning is internet vereist”. Alternatief: Vosk (offline, iOS 12+) als fallback bij geen netwerk.
SFSpeechRecognizer — ingebouwde Apple API, gratis, eenvoudig te integreren, maar met lengtebeperking (1–2 minuten), nauwkeurigheid WER 7–14% en alleen voor iOS-ecosysteem. Whisper Core ML — open-source (MIT), ondersteunt 99 talen, WER 6–10%, geen lengtebeperking, maar vereist handmatige integratie, Core ML-modellen (39M–769M parameters), RTF 0.5–6 (langzamer dan SFSpeechRecognizer). SFSpeechRecognizer — voor standaard spraakinvoer. Whisper — voor hoge-nauwkeurigheid transcriptie van lange audio.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook