SFSpeechRecognizer ist die primäre Spracherkennungs-API von Apple im iOS-Ökosystem. Das Framework bietet Zugriff auf die ASR-Engine des Geräts über Speech.framework und unterstützt Echtzeit-Streaming-Transkription sowie einmalige Erkennung von Audiodateien. SFSpeechRecognizer ist auf iOS 10+, macOS 10.15+, watchOS 6+ und tvOS 17+ verfügbar. Mit iOS 17 hat Apple einen vollwertigen On-Device-Modus hinzugefügt, der Spracherkennung ohne Internetverbindung ermöglicht. Laut Apple Speech Documentation, 2025 wird SFSpeechRecognizer in über 200.000 App Store-Anwendungen verwendet und verarbeitet Millionen von Anfragen pro Tag mit einer WER von 7% bei Englisch.
Wichtigste Punkte
SFSpeechRecognizer ist eine Klasse aus Speech.framework, die einen Spracherkenner für eine bestimmte Sprache darstellt. Sie wird mit einem Locale (ru_RU, en_US, zh_CN) initialisiert. SFSpeechRecognizer verwaltet eine Erkennungsanfrage (SFSpeechRecognitionRequest) und gibt ein Ergebnis (SFSpeechRecognitionResult) mit Transkriptionen und Metadaten zurück. Es unterstützt zwei Arten von Anfragen: SFSpeechAudioBufferRecognitionRequest (Live-Audio-Stream) und SFSpeechURLRecognitionRequest (Audiodatei). Beide geben SFTranscription zurück — ein Array alternativer Erkennungshypothesen.
SFSpeechRecognitionResult enthält: bestTranscription (beste Hypothese, SFTranscription), transcriptions (alle Alternativen), isFinal (final/intermediär). SFTranscription enthält: formattedString (Text), segments (Array von SFTranscriptionSegment mit Zeitstempeln, Konfidenz, substringRange, alternativeSubstrings). Die Konfidenz für jedes Segment (0..1) — ermöglicht das Filtern unzuverlässiger Fragmente. Segments sind eine Schlüsselfunktion von Speech.framework: sie bieten eine Wort-für-Wort-Markierung mit Konfidenzwerten.
SFSpeechRecognizer Architektur: AVFoundation (Audioerfassung) → Audio Buffer → SFSpeechAudioBufferRecognitionRequest → SFSpeechRecognizer (ASR-Engine) → SFSpeechRecognitionResult → SFSpeechRecognitionTask (Steuerung: cancel, finish, pause). Apples ASR-Engine verwendet eine hybride Architektur: Conformer (Encoder) + RNNT (Decoder) für On-Device, Transducer für Cloud. Die Modelle sind für Apple Neural Engine (ANE) optimiert. Auf dem A17 Pro läuft On-Device-ASR mit RTF 0.3–0.6 (schneller als Echtzeit).
| Komponente | Zweck | iOS-Version |
|---|---|---|
| SFSpeechRecognizer | Haupt-Erkennungsklasse | iOS 10+ |
| SFSpeechAudioBufferRecognitionRequest | Live-Audio-Stream | iOS 10+ |
| SFSpeechURLRecognitionRequest | Audiodatei (.wav, .m4a) | iOS 10+ |
| SFSpeechRecognitionTask | Anfrageverwaltung (cancel, finish) | iOS 10+ |
| On-Device-Erkennung | Offline-ASR | iOS 17+ |
| Kombinierte Erkennung | Hybrid On-Device + Cloud | iOS 17+ |
Audio-Anforderungen: SFSpeechRecognizer akzeptiert LPCM (16 kHz, 16 Bit, Mono) oder Opus (iOS 17+). AVFoundation kann Puffer in jedem Format erfassen, die Anfrage konvertiert automatisch. Mindestlänge: 0,5 Sekunden (Stilleerkennung). Maximum: 1 Minute (Cloud) / 2 Minuten (On-Device) pro Anfrage. Für lange Transkriptionen teilen Sie Audio in 30–60-Sekunden-Chunks mit 2–5 Sekunden Überlappung auf.
Benutzerberechtigungen: SFSpeechRecognizer erfordert zwei explizite Berechtigungen. NSMicrophoneUsageDescription (Privacy — Microphone Usage Description) — für Mikrofonzugriff. NSSpeechRecognitionUsageDescription (Privacy — Speech Recognition Usage Description) — für Spracherkennungszugriff. Beides sind Zeichenfolgen, die dem Benutzer den Grund erklären. SFSpeechRecognizer.requestAuthorization — zeigt den Berechtigungsdialog. Status: notDetermined, denied, restricted, authorized. Ohne authorized-Status gibt der Aufruf des Recognizers den Fehler 216 (Speech framework error) zurück.
Verfügbarkeitsprüfung: SFSpeechRecognizer.isAvailable — prüft, ob ASR für die aktuelle Sprache verfügbar ist. Auf iOS 16- ist isAvailable = false ohne Internet. Auf iOS 17+ ist isAvailable = true für On-Device-Sprachen auch offline. SFSpeechRecognizer.supportedLocales — eine statische Methode, um die Liste der vom Gerät unterstützten Sprachen abzurufen. Es wird empfohlen, isAvailable vor jedem Start zu überprüfen (der Benutzer kann Siri/Diktat in den Einstellungen deaktivieren). Die Verfügbarkeit hängt von der Region ab: Chinesisch — nur in China, Arabisch — in den VAE.
// SFSpeechRecognizer Einrichtung
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 nicht verfügbar. Aktivieren Sie Siri und Diktat in den Einstellungen")
return
}
let request = SFSpeechAudioBufferRecognitionRequest()
request.requiresOnDeviceRecognition = true
Fehlerbehandlung: SFSpeechRecognizer wird mit einem Completion Handler aufgerufen, der einen Error zurückgeben kann. Hauptfehler: 203 — kein Internet (Cloud, iOS 16-); 216 — nicht autorisiert (keine Berechtigung); 301 — Audiofehler (Problem mit Mikrofon/Format); 401 — Dienst nicht verfügbar (Dienst überlastet); 601 — Sprache nicht verfügbar (Sprache wird auf dem Gerät nicht unterstützt). Für On-Device iOS 17+ sind die Hauptfehler: 301 (Audio), 601 (Sprache). Behandeln Sie immer den Completion Handler — Fehler können jederzeit während der Aufnahme auftreten.
Live-ASR-Pipeline: AVAudioEngine (Mikrofonerfassung) → installTap (Audiopuffer) → request.append(buffer) → SFSpeechRecognizer → recognitionTask → delegate/resultHandler. AVAudioEngine bietet niedrige Latenz (5–10 ms vom Mikrofon zum Puffer). SFSpeechRecognitionDelegate: didHypothesizeTranscription (alle 200–500 ms — partieller Text), didFinishRecognition (endgültiges Ergebnis). Task.isFinishing — kann abbrechen, wenn die Erkennung abgeschlossen ist. Für kontinuierliche Erkennung (Endlosdiktat) erstellen Sie eine neue Aufgabe nach isFinal.
SFSpeechRecognitionTaskDelegate: optionale Methoden. speechRecognitionDidDetectSpeech (Sprechbeginn) — für UI-Anzeige. didHypothesizeTranscription (Zwischentext) — zur Anzeige während des Sprechens. didFinishRecognition (endgültiges Ergebnis) — zur Textfinalisierung. didFinishSuccessfully (Erfolg/Fehler) — zur Vervollständigung. didProcessAudio (Audiopuffer verarbeitet) — für RMS-Meter. Es wird empfohlen, didHypothesizeTranscription zu implementieren — der Benutzer sieht den Text sofort ohne Verzögerung. Die endgültige Transkription dient zum Speichern.
// Live-Spracherkennung
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()
Kontinuierliche Erkennung: für den „immer zuhören“-Modus (Spracheingabe, Assistent) muss die Aufgabe nach isFinal neu gestartet werden. Erstellen Sie eine Schleife: finishTask → request = SFSpeechAudioBufferRecognitionRequest() → recognitionTask = recognizer.recognitionTask(with: request). Um Lücken zu vermeiden, überlappen Sie das Ende einer Aufgabe mit dem Beginn der nächsten (starten Sie eine neue Anfrage 1–2 Sekunden vor Ende der vorherigen). AVFoundation AVAudioSession — konfigurieren Sie .playAndRecord für gleichzeitige Wiedergabe und Aufnahme. Auf iOS 17+ verbraucht kontinuierliches ASR mit On-Device 2–5% Akku pro Stunde (A15+).
SFSpeechURLRecognitionRequest — eine Anfrage zur Erkennung einer Audiodatei per URL. Unterstützt Formate: .wav (16 kHz, 16 Bit, Mono), .m4a (AAC), .mp4, .mov. Maximale Länge: ~1 Minute für Cloud, ~2 Minuten für On-Device. Für längere Dateien in Chunks aufteilen (AVAssetExportSession + trim). SFSpeechURLRecognitionRequest unterstützt kein Streaming (keine partiellen Ergebnisse) — nur das endgültige Ergebnis. Für partielle Ergebnisse mit einer Datei in eine Audio-Buffer-Anfrage konvertieren.
Transkription einer Audiodatei erhalten: SFSpeechRecognizer.recognitionTask(with: request) resultHandler. Extrahiere bestTranscription.formattedString. Für Wort-für-Wort-Zeitstempel — segments von bestTranscription.segments (segment.duration, segment.timestamp, segment.substring). Konfidenz pro Segment — ASR-Konfidenz für jedes Wort (zum Filtern verwenden). Alternative Hypothesen — transcriptionFormatter-Alternativen für Wörter mit niedriger Konfidenz. Bei Dateien mit mehreren Sprechern kann SFSpeechRecognitionRequest mehrere Anfragen zurückgeben (eine pro Sprecher, iOS 17+).
// Audiodatei-Transkription
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("Fehler: \(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)
}
}
Aufteilung langer Audiodateien: für Dateien > 1 Minute in 30–60-Sekunden-Chunks mit 2–3 Sekunden Überlappung (Zusammenfügen) aufteilen. AVAssetExportSession + CMTimeRange — Chunks exportieren. Alternative: UISelectionView (Benutzer wählt ein Segment aus). Transkriptionszusammenfügung: Texte verketten, durch Überlappung zusammenfügen (die letzten 2–3 Wörter des vorherigen Chunks werden mit den ersten 2–3 Wörtern des nächsten verglichen — Duplikate entfernen). Vosk und Whisper unterstützen lange Audios nativ, SFSpeechRecognizer nicht. Für lange Transkriptionen empfehle ich Whisper (Core ML) — keine Längenbegrenzung.
On-Device-Modus (iOS 17+): request.requiresOnDeviceRecognition = true. ASR läuft lokal auf Apple Neural Engine (ANE). Vorteile: kein Internet erforderlich, Privatsphäre (Audio verlässt das Gerät nie), keine Kosten (kostenlos), niedrige Latenz (RTF 0.3–0.6). Nachteile: geringere Genauigkeit (WER 12–14% vs 7–12%), 2-Minuten-Limit pro Anfrage, begrenzter Sprachsatz (nicht alle 60 Sprachen sind On-Device verfügbar). Das On-Device-Modell belegt ~50–100 MB auf dem Gerät und wird bei der ersten Anfrage heruntergeladen.
Cloud (iOS 16-): request.requiresOnDeviceRecognition = false (oder Parameter fehlt). ASR auf Apple-Servern — genauer (WER 7% EN, 12% RU), mehr Sprachen, bis zu 1 Minute pro Anfrage. Erfordert Internet (WiFi oder Mobilfunk). Apple berechnet Entwicklern keine Gebühren für Cloud-ASR (kostenlos). Limits: 1 Anfrage pro Minute pro Anwendung (nicht spezifiziert), aber Apple kann im Produktionsmaßstab einschränken. Cloud-ASR bietet Best-Effort-Qualität ohne SLA. Für Unternehmensanwendungen verwenden Sie Google Cloud ASR oder Whisper (Core ML).
| Parameter | On-Device (iOS 17+) | Cloud (iOS 10+) |
|---|---|---|
| Internet erforderlich | Nein | Ja |
| WER (EN) | 10–12% | 7% |
| WER (RU) | 12–14% | 12% |
| Latenz (RTF) | 0.3–0.6 | 0.3–0.8 (+Netzwerk) |
| Maximale Länge | 2 Minuten | 1 Minute |
| Privatsphäre | Vollständig | Audio verlässt Gerät |
| Kostenlos | Ja | Ja |
Kombinierte Erkennung (iOS 17+): request.requiresOnDeviceRecognition = false bei Internet (Cloud), = true bei Offline (Fallback). Apple wählt automatisch den Modus aus. Für präzisionskritische Apps: NetworkMonitor (NWPathMonitor) prüfen — bei Internet Cloud verwenden, bei keinem On-Device. Für datenschutzkritische Apps: immer On-Device. Für Transkription: Cloud (genauer). Für Spracheingabe: On-Device (schneller). Kombiniert wird empfohlen: 80% Cloud, 20% On-Device-Fallback.
Spracheingabe in benutzerdefinierter Tastatur — SFSpeechRecognizer in Tastaturerweiterungen (iOS 10+) integriert. Der Benutzer drückt die Mikrofontaste, ASR transkribiert Sprache in Text und fügt ihn in das Textfeld ein. Anforderungen: partielle Ergebnisse (Text in Echtzeit sehen), On-Device (Tastatur muss ohne Internet funktionieren). SFSpeechRecognizer + AVSpeechSynthesizer — Spracheingabe + Sprachausgabe. Für benutzerdefinierte Tastaturen auf iOS 17+ On-Device verwenden. Einschränkungen von Tastaturerweiterungen: AVAudioEngine ist verfügbar, aber mit zeitlichen Einschränkungen (Hintergrundausführung begrenzt).
Transkription von Besprechungen und Vorlesungen — Apps zum Aufnehmen und Transkribieren von Audio (Otter.ai, Rev, Apple Voice Memos). SFSpeechURLRecognitionRequest verarbeitet .m4a-Dateien. Für lange Aufnahmen (30–60 Minuten) — Whisper Core ML (keine Längenbegrenzung). SFSpeechRecognizer-Segmente mit Zeitstempeln — zur Synchronisation von Text mit Audio (Texthervorhebung während der Wiedergabe). Konfidenz pro Segment — zur Anzeige unzuverlässiger Fragmente (gelbe Hervorhebung). Für Sprecherdiarisierung (wer sprach) — Apple bietet keine API, verwenden Sie pyannote-audio + Whisper auf dem Server.
Sprachbefehle in iOS-Apps — SFSpeechRecognizer + VGS-Framework (Voice Grammar Services) zur Ausführung von Befehlen: „Einstellungen öffnen“, „Nachricht senden“, „Licht einschalten“. Grammatikbasierte Erkennung: SFSpeechRecognitionRequest contextualStrings = Array von Befehlen. Dies verbessert die Befehlserkennungsgenauigkeit auf 95% (vs 85% Freiform). SFSpeechRecognitionTask.cancel — zum Unterbrechen nach Befehlsausführung. VGS + SFSpeechRecognizer + Shortcuts — benutzerdefinierte Sprachbefehle ohne UI-Programmierung. Für Barrierefreiheit: Voice Control (integriert) + SFSpeechRecognizer (benutzerdefinierte Befehle).
// Sprachbefehle mit kontextuellen Zeichenfolgen
let request = SFSpeechAudioBufferRecognitionRequest()
request.requiresOnDeviceRecognition = true
request.shouldReportPartialResults = true
request.contextualStrings = ["open contacts", "send message",
"show notifications", "Taschenlampe einschalten"]
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()
}
}
Diktat in medizinischen und juristischen Apps — SFSpeechRecognier zur Erstellung strukturierter Dokumente per Sprache. Domänenanpassung: contextualStrings mit medizinischen/juristischen Begriffen (500+ Phrasen). SFSpeechRecognitionRequest.customLmProbability — Einfluss von contextualStrings (0.1–1.0). Für medizinisches Diktat On-Device verwenden (Datenschutz der Patientendaten). Whisper, feinabgestimmt auf medizinische Daten — Alternative mit WER 5% statt 12% des Basis-SFSpeechRecognizer. HIPAA-Konformität: On-Device-Modus (Daten verlassen das Gerät nie). Für Termintranskription — SFSpeechURLRecognitionRequest + Segmente mit Sprecherzeitstempeln.
Häufig gestellte Fragen
SFSpeechRecognizer ist ab iOS 10, macOS 10.15, watchOS 6 und tvOS 17 verfügbar. On-Device-Modus ab iOS 17 (requiresOnDeviceRecognition). Auf iOS 10–16 funktioniert SFSpeechRecognizer nur über Apples Cloud-Server (Internet erforderlich). Alle Versionen erfordern eine explizite Benutzerberechtigung (NSMicrophoneUsageDescription + NSSpeechRecognitionUsageDescription). SFSpeechRecognizer.supportedLocales — dynamische Liste, abhängig von Region und Gerätemodell.
Ja, durch Erstellen neuer recognitionTask nach isFinal. Starten Sie die Aufgabe nach Abschluss der vorherigen für kontinuierliche Erkennung neu. Auf iOS 17 verbraucht kontinuierliches On-Device-ASR 2–5% Akku pro Stunde (A15+). Auf iOS 16- erfordert kontinuierliches ASR Internet (Verkehr ~1 MB/Minute). Für wirklich kontinuierliche Erkennung (immer zuhörend) verwenden Sie Vosk (offline) oder Whisper Core ML. SFSpeechRecognizer unterstützt den Always-On-Modus auf iOS 16- nicht.
Verwenden Sie result.bestTranscription.segments — jedes SFTranscriptionSegment enthält confidence (Float 0..1) für das Wort. segments[i].substring — Text des Wortes. segments[i].confidence — ASR-Konfidenz für dieses Wort. Wörter mit confidence < 0,5 sind unzuverlässig — heben Sie sie in der UI hervor. segments[i].timestamp — Startzeit (TimeInterval). segments[i].duration — Dauer. segments[i].alternativeSubstrings — alternative Erkennungshypothesen für das Wort. Bei langen Dateien liefert die Iteration über Segments Wort-für-Wort-Konfidenz ohne manuelles Parsen.
203 ist SFSpeechError.ErrorCode.opportunistic (kein Internet für Cloud-ASR). Tritt auf iOS 16- oder bei request.requiresOnDeviceRecognition = false ohne Internet auf. Lösung: setzen Sie requiresOnDeviceRecognition = true (iOS 17+) für den Offline-Betrieb. Auf iOS 16- NWPathMonitor verwenden — bei fehlendem Internet eine Meldung anzeigen: „Spracherkennung erfordert eine Internetverbindung“. Alternative: Vosk (offline, iOS 12+) als Fallback, wenn kein Netzwerk verfügbar ist.
SFSpeechRecognizer — Apples integrierte API, kostenlos, einfach zu integrieren, aber mit Längenbegrenzung (1–2 Minuten), WER-Genauigkeit 7–14% und nur für das iOS-Ökosystem. Whisper Core ML — Open-Source (MIT), unterstützt 99 Sprachen, WER 6–10%, keine Längenbegrenzung, erfordert jedoch manuelle Integration, Core ML-Modelle (39M–769M Parameter), RTF 0.5–6 (langsamer als SFSpeechRecognizer). SFSpeechRecognizer — für standardmäßige Spracheingabe. Whisper — für hochpräzise Transkription langer Audiodateien.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch