SFSpeechRecognizer — wat is het, API en integratie in iOS

Auteur: IT Sectr Gepubliceerd: 2026-07-19 Leestijd: 10 min

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 — de belangrijkste Apple ASR API voor iOS (iOS 10+)
  • On-device — herkenning zonder internet vanaf iOS 17, WER 12–14% voor Russisch
  • Streaming — gedeeltelijke resultaten in real-time (partial results)
  • 60+ talen — Russisch, Engels, Chinees, Arabisch en andere
  • Swift Native — volledige integratie met AVFoundation, Combine, Swift Concurrency

Wat is SFSpeechRecognizer: overzicht van mogelijkheden

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).

ComponentDoeliOS Versie
SFSpeechRecognizerPrimaire herkenningsklasseiOS 10+
SFSpeechAudioBufferRecognitionRequestLive audiostreamiOS 10+
SFSpeechURLRecognitionRequestAudiobestand (.wav, .m4a)iOS 10+
SFSpeechRecognitionTaskVerzoekbeheer (cancel, finish)iOS 10+
On-device recognitionOffline ASRiOS 17+
Combined RecognitionHybride on-device + cloudiOS 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.

Instellen en machtigingen van SFSpeechRecognizer

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.

swift
// 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 spraakherkenning via microfoon

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.

swift
// 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+).

Herkenning van audiobestanden en opnames

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+).

swift
// 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 versus Cloud: vergelijking van modi

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).

ParameterOn-device (iOS 17+)Cloud (iOS 10+)
Vereist internetNeeJa
WER (EN)10–12%7%
WER (RU)12–14%12%
Latentie (RTF)0.3–0.60.3–0.8 (+netwerk)
Max. lengte2 minuten1 minuut
PrivacyVolledigAudio gaat naar server
GratisJaJa

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.

Toepassing van SFSpeechRecognizer in iOS-apps

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).

swift
// 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

Vanaf welke iOS-versie wordt SFSpeechRecognizer ondersteund?

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.

Kan SFSpeechRecognizer worden gebruikt voor continue herkenning?

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-.

Hoe krijg ik confidence van elk woord in SFSpeechRecognizer?

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.

Waarom retourneert SFSpeechRecognizer fout 203?

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.

Wat is het verschil tussen SFSpeechRecognizer en Whisper Core ML?

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

  • SFSpeechRecognizer — ingebouwde Apple ASR API, iOS 10+, 60+ talen
  • On-device modus — iOS 17+, zonder internet, WER 12–14% voor Russisch
  • Live microfoon — AVAudioEngine + request.append(buffer) + gedeeltelijke resultaten
  • Audiobestanden — SFSpeechURLRecognitionRequest, .m4a/.wav, tot 1–2 minuten
  • Segments — per-word tijdstempels + confidence (0..1) voor elk woord
  • Gratis — zonder beperkingen, zonder betaling aan Apple, zonder externe SDK’s
  • Toepassing — spraakinvoer, transcriptie, opdrachten, toegankelijkheid, dicteren

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.

Bespreek het project

Lees ook