SFSpeechRecognizer — hlavní API Apple pro rozpoznávání řeči v ekosystému iOS. Framework poskytuje přístup k ASR motoru zařízení prostřednictvím Speech.framework, podporuje streamovací transkripci v reálném čase a jednorázové rozpoznávání audio souborů. SFSpeechRecognizer je dostupný na iOS 10+, macOS 10.15+, watchOS 6+ a tvOS 17+. S iOS 17 Apple přidal plnohodnotný režim on-device, který umožňuje rozpoznávání řeči bez připojení k internetu. Podle Apple Speech Documentation, 2025 je SFSpeechRecognizer používán ve více než 200 000 aplikacích App Store a denně zpracovává miliony požadavků s WER 7 % pro angličtinu.
Hlavní body
SFSpeechRecognizer — třída z Speech.framework představující rozpoznávač řeči pro konkrétní jazyk. Inicializuje se s Locale (ru_RU, en_US, zh_CN). SFSpeechRecognizer spravuje požadavek na rozpoznání (SFSpeechRecognitionRequest) a vrací výsledek (SFSpeechRecognitionResult) s transkripcemi a metadaty. Podporuje dva typy požadavků: SFSpeechAudioBufferRecognitionRequest (živý audio stream) a SFSpeechURLRecognitionRequest (audio soubor). Oba vracejí SFTranscription — pole alternativních variant rozpoznání.
SFSpeechRecognitionResult obsahuje: bestTranscription (nejlepší varianta, SFTranscription), transcriptions (všechny alternativy), isFinal (konečný/dočasný). SFTranscription obsahuje: formattedString (text), segments (pole SFTranscriptionSegment s časovými razítky, confidence, substringRange, alternativeSubstrings). Confidence pro každý segment (0..1) — umožňuje filtrovat nespolehlivé fragmenty. segments — klíčová vlastnost Speech.framework: poskytuje anotaci každého slova s jistotou.
Architektura SFSpeechRecognizer: AVFoundation (zachycení zvuku) → Audio Buffer → SFSpeechAudioBufferRecognitionRequest → SFSpeechRecognizer (ASR motor) → SFSpeechRecognitionResult → SFSpeechRecognitionTask (řízení: cancel, finish, pause). ASR motor Apple používá hybridní architekturu: Conformer (kodér) + RNNT (dekodér) pro on-device, Transducer pro cloud. Modely jsou optimalizovány pro Apple Neural Engine (ANE). Na A17 Pro on-device ASR pracuje s RTF 0.3–0.6 (rychleji než v reálném čase).
| Komponenta | Účel | iOS Verze |
|---|---|---|
| SFSpeechRecognizer | Hlavní třída rozpoznávání | iOS 10+ |
| SFSpeechAudioBufferRecognitionRequest | Živý audio stream | iOS 10+ |
| SFSpeechURLRecognitionRequest | Audio soubor (.wav, .m4a) | iOS 10+ |
| SFSpeechRecognitionTask | Správa požadavku (cancel, finish) | iOS 10+ |
| On-device recognition | Offline ASR | iOS 17+ |
| Combined Recognition | Hybrid on-device + cloud | iOS 17+ |
Požadavky na zvuk: SFSpeechRecognizer přijímá LPCM (16 kHz, 16 bit, mono) nebo Opus (iOS 17+). AVFoundation může zachytit vyrovnávací paměť v libovolném formátu, požadavek automaticky převádí. Minimální délka: 0,5 sekundy (detekce ticha). Maximální: 1 minuta (cloud) / 2 minuty (on-device) na jeden požadavek. Pro dlouhou transkripci rozdělte zvuk na části po 30–60 sekundách s překryvem 2–5 sekund.
Uživatelská oprávnění: SFSpeechRecognizer vyžaduje dva explicitní souhlasy. NSMicrophoneUsageDescription (Privacy — Microphone Usage Description) — pro přístup k mikrofonu. NSSpeechRecognitionUsageDescription (Privacy — Speech Recognition Usage Description) — pro přístup k rozpoznávání řeči. Oba jsou řetězce vysvětlující uživateli proč. SFSpeechRecognizer.requestAuthorization — vyvolání dialogu oprávnění. Stavy: notDetermined, denied, restricted, authorized. Bez authorized volání recognizer vrátí chybu 216 (Speech framework error).
Kontrola dostupnosti: SFSpeechRecognizer.isAvailable — kontroluje, zda je ASR dostupný pro aktuální jazyk. Na iOS 16- isAvailable = false bez internetu. Na iOS 17+ isAvailable = true pro on-device jazyky i offline. SFSpeechRecognizer.supportedLocales — statická metoda pro získání seznamu podporovaných jazyků zařízení. Doporučuje se kontrola isAvailable před každým spuštěním (uživatel může vypnout Siri/Diktování v nastavení). Dostupnost závisí na regionu: čínština — pouze v Číně, arabština — v SAE.
// Nastavení SFSpeechRecognizer
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 není k dispozici. Povolte Siri a Diktování v Nastavení")
return
}
let request = SFSpeechAudioBufferRecognitionRequest()
request.requiresOnDeviceRecognition = true
Zpracování chyb: SFSpeechRecognizer je volán s completion handlerem, který může vrátit Error. Hlavní chyby: 203 — no internet (cloud, iOS 16-); 216 — not authorized (žádný souhlas); 301 — audio error (problém s mikrofonem/formátem); 401 — service unavailable (služba přetížena); 601 — language unavailable (jazyk není podporován na zařízení). Pro on-device iOS 17+ hlavní chyby: 301 (audio), 601 (language). Vždy zpracovávejte completion handler — chyby mohou nastat kdykoli během nahrávání.
Live ASR pipeline: AVAudioEngine (zachycení z mikrofonu) → installTap (audio buffer) → request.append(buffer) → SFSpeechRecognizer → recognitionTask → delegate/resultHandler. AVAudioEngine zajišťuje nízkou latenci (5–10 ms od mikrofonu k bufferu). SFSpeechRecognitionDelegate: didHypothesizeTranscription (každých 200–500 ms — částečný text), didFinishRecognition (konečný výsledek). Task.isFinishing — lze zrušit, když je rozpoznávání dokončeno. Pro spojité rozpoznávání (nekonečné diktování) — vytvořte nový task po isFinal.
SFSpeechRecognitionTaskDelegate: volitelné metody. speechRecognitionDidDetectSpeech (začátek řeči) — pro UI indikaci. didHypothesizeTranscription (dočasný text) — pro zobrazení během mluvení. didFinishRecognition (konečný výsledek) — pro fixaci textu. didFinishSuccessfully (úspěch/chyba) — pro dokončení. didProcessAudio (audio buffer zpracován) — pro RMS metr. Doporučuje se implementovat didHypothesizeTranscription — uživatel vidí text okamžitě, bez zpoždění. Konečná transkripce — pro uložení.
// Živé rozpoznávání řeči
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()
Spojité rozpoznávání: pro režim „stále poslouchej“ (hlasový vstup, asistent) je vyžadováno restartování úkolu po isFinal. Vytvořte smyčku: finishTask → request = SFSpeechAudioBufferRecognitionRequest() → recognitionTask = recognizer.recognitionTask(with: request). Aby se zabránilo pauzám, překrývejte konec jednoho úkolu se začátkem dalšího (spusťte nový požadavek 1–2 sekundy před dokončením předchozího). AVFoundation AVAudioSession — konfigurace .playAndRecord pro současný přehrávání a nahrávání. Na iOS 17+ spojité ASR s on-device spotřebovává 2–5% baterie za hodinu (A15+).
SFSpeechURLRecognitionRequest — požadavek na rozpoznání audio souboru URL. Podporuje formáty: .wav (16 kHz, 16 bit, mono), .m4a (AAC), .mp4, .mov. Maximální délka: ~1 minuta pro cloud, ~2 minuty pro on-device. Pro delší soubory — rozdělte na části (AVAssetExportSession + trim). SFSpeechURLRecognitionRequest nepodporuje streamování (žádné částečné výsledky) — pouze konečný výsledek. Pro částečné výsledky se souborem — převeďte na Audio Buffer Request.
Získání transkripce audio souboru: SFSpeechRecognizer.recognitionTask(with: request) resultHandler. Získejte bestTranscription.formattedString. Pro časová razítka na úrovni slov — segments z bestTranscription.segments (segment.duration, segment.timestamp, segment.substring). Confidence na segment — jistota ASR v každém slově (použijte pro filtrování). Alternativní varianty — alternativy transcriptionFormatter pro slova s nízkým confidence. Pro soubory s více mluvčími — SFSpeechRecognitionRequest může vrátit více požadavků (jeden na mluvčího, iOS 17+).
// Transkripce audio souboru
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("Chyba: \(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)
}
}
Dělení dlouhých audio souborů: pro soubory > 1 minuty nakrájejte na části po 30–60 sekundách s překryvem 2–3 sekund (spojování). AVAssetExportSession + CMTimeRange — export částí. Alternativa: UISelectionView (uživatel vybírá segment). Spojování transkripcí: konkatenace textů, spojení překryvem (poslední 2–3 slova předchozí části se porovnají s prvními 2–3 slovy následující — odstranit duplicity). Vosk a Whisper podporují dlouhý zvuk nativně, SFSpeechRecognizer — ne. Pro dlouhou transkripci doporučuji Whisper (Core ML) — bez omezení délky.
Režim On-device (iOS 17+): request.requiresOnDeviceRecognition = true. ASR běží lokálně na Apple Neural Engine (ANE). Výhody: bez internetu, soukromí (zvuk neopouští zařízení), nulové náklady (zdarma), nízká latence (RTF 0.3–0.6). Nevýhody: nižší přesnost (WER 12–14% vs 7–12%), omezení 2 minuty na požadavek, omezená sada jazyků (ne všech 60 jazyků je dostupných on-device). On-device model zabírá ~50–100 MB na zařízení, načítá se při prvním požadavku.
Cloud (iOS 16-): request.requiresOnDeviceRecognition = false (nebo parametr chybí). ASR na serverech Apple — přesnější (WER 7% EN, 12% RU), více jazyků, až 1 minuta na požadavek. Vyžaduje internet (WiFi nebo mobilní). Apple neúčtuje vývojáři poplatky za cloud ASR (zdarma). Omezení: 1 požadavek za minutu na aplikaci (nespecifikováno), ale pro produkční měřítko může Apple omezit. cloud ASR — kvalita best-effort, bez SLA. Pro podnikové aplikace použijte Google Cloud ASR nebo Whisper (Core ML).
| Parametr | On-device (iOS 17+) | Cloud (iOS 10+) |
|---|---|---|
| Vyžaduje internet | Ne | Ano |
| WER (EN) | 10–12% | 7% |
| WER (RU) | 12–14% | 12% |
| Latence (RTF) | 0.3–0.6 | 0.3–0.8 (+síť) |
| Max. délka | 2 minuty | 1 minuta |
| Soukromí | Úplné | Zvuk jde na server |
| Zdarma | Ano | Ano |
Combined Recognition (iOS 17+): request.requiresOnDeviceRecognition = false s internetem (cloud), = true při offline (fallback). Apple automaticky vybírá režim. Pro aplikace kritické z hlediska přesnosti: kontrolujte NetworkMonitor (NWPathMonitor) — s internetem cloud, bez něj on-device. Pro aplikace kritické z hlediska soukromí: vždy on-device. Pro transkripci: cloud (přesnější). Pro hlasový vstup: on-device (rychlejší). Doporučený Combined: 80% cloud, 20% on-device fallback.
Hlasový vstup ve vlastní klávesnici — SFSpeechRecognizer je vložen do rozšíření klávesnice (iOS 10+). Uživatel stiskne tlačítko mikrofonu — ASR přepisuje řeč na text a vkládá jej do textového pole. Požadavky: částečné výsledky (vidět text v reálném čase), on-device (klávesnice musí fungovat bez internetu). SFSpeechRecognizer + AVSpeechSynthesizer — hlasový vstup + hlasový výstup. Pro vlastní klávesnici na iOS 17+ použijte on-device. Omezení rozšíření klávesnice: AVAudioEngine je dostupný, ale s časovými omezeními (background execution limited).
Transkripce schůzek a přednášek — aplikace pro nahrávání a přepis zvuku (Otter.ai, Rev, Apple Voice Memos). SFSpeechURLRecognitionRequest zpracovává .m4a soubor. Pro dlouhé nahrávky (30–60 minut) — Whisper Core ML (bez omezení délky). Segmenty SFSpeechRecognizer s časovými razítky — pro synchronizaci textu se zvukem (zvýraznění textu při přehrávání). Confidence na segment — pro zobrazení nespolehlivých fragmentů (žluté zvýraznění). Pro diarizaci mluvčích (kdo mluvil) — Apple neposkytuje API, použijte pyannote-audio + Whisper na serveru.
Hlasové příkazy v iOS aplikacích — SFSpeechRecognizer + VGS framework (Voice Grammar Services) pro provádění příkazů: „otevři nastavení“, „pošli zprávu“, „rozsvit“. Rozpoznávání založené na gramatice: SFSpeechRecognitionRequest contextualStrings = pole příkazů. To zvyšuje přesnost rozpoznávání příkazů na 95% (vs 85% free-form). SFSpeechRecognitionTask.cancel — pro přerušení po provedení příkazu. VGS + SFSpeechRecognizer + Shortcuts — vlastní hlasové příkazy bez psaní rozhraní. Pro přístupnost: Voice Control (vestavěný) + SFSpeechRecognizer (vlastní příkazy).
// Hlasové příkazy s kontextovými řetězci
let request = SFSpeechAudioBufferRecognitionRequest()
request.requiresOnDeviceRecognition = true
request.shouldReportPartialResults = true
request.contextualStrings = ["open contacts", "send message",
"show notifications", "zapni baterku"]
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()
}
}
Diktování v lékařských a právních aplikacích — SFSpeechRecognizer pro vytváření strukturovaných dokumentů hlasem. Domain Adaptation: contextualStrings s lékařskými/právními termíny (500+ frází). SFSpeechRecognitionRequest.customLmProbability — vliv contextualStrings (0.1–1.0). Pro lékařské diktování použijte on-device (soukromí dat pacienta). Whisper fine-tuned na lékařských datech — alternativa s WER 5% místo 12% základního SFSpeechRecognizer. Soulad s HIPAA: režim on-device (data neopouštějí zařízení). Pro transkripci konzultací — SFSpeechURLRecognitionRequest + segments s časovými razítky mluvčího.
Často kladené otázky
SFSpeechRecognizer je dostupný od iOS 10, macOS 10.15, watchOS 6 a tvOS 17. Režim on-device — od iOS 17 (requiresOnDeviceRecognition). Na iOS 10–16 SFSpeechRecognizer funguje pouze přes cloudové servery Apple (vyžaduje internet). Na všech verzích je vyžadován explicitní souhlas uživatele (NSMicrophoneUsageDescription + NSSpeechRecognitionUsageDescription). SFSpeechRecognizer.supportedLocales — dynamický seznam, závisí na regionu a modelu zařízení.
Ano, vytvářením nových recognitionTask po isFinal. Restartujte úkol po finalizaci předchozího pro spojité rozpoznávání. Na iOS 17 spojité ASR on-device spotřebovává 2–5% baterie za hodinu (A15+). Na iOS 16- spojité ASR vyžaduje internet (spotřeba dat ~1 MB/minutu). Pro opravdu spojité rozpoznávání (vždy poslouchá) použijte Vosk (offline) nebo Whisper Core ML. SFSpeechRecognizer nepodporuje režim stále zapnuto na iOS 16-.
Použijte result.bestTranscription.segments — každý SFTranscriptionSegment obsahuje confidence (Float 0..1) pro slovo. segments[i].substring — text slova. segments[i].confidence — jistota ASR v tomto slově. Slova s confidence < 0.5 — nespolehlivá, zvýrazněte je v UI. segments[i].timestamp — čas začátku (TimeInterval). segments[i].duration — doba trvání. segments[i].alternativeSubstrings — alternativní varianty rozpoznání slova. Pro dlouhé soubory průchod segments poskytuje per-word confidence bez ručního parsování.
203 — SFSpeechError.ErrorCode.opportunistic (žádný internet pro cloud ASR). Vyskytuje se na iOS 16- nebo při request.requiresOnDeviceRecognition = false bez internetu. Řešení: nastavte requiresOnDeviceRecognition = true (iOS 17+) pro práci offline. Na iOS 16- použijte NWPathMonitor — při nedostatku internetu zobrazte zprávu „pro rozpoznávání řeči je vyžadován internet“. Alternativa: Vosk (offline, iOS 12+) jako fallback při absenci sítě.
SFSpeechRecognizer — vestavěné Apple API, zdarma, snadné na integraci, ale s omezením délky (1–2 minuty), přesností WER 7–14% a pouze pro iOS ekosystém. Whisper Core ML — open-source (MIT), podporuje 99 jazyků, WER 6–10%, bez omezení délky, ale vyžaduje ruční integraci, modely Core ML (39M–769M parametrů), RTF 0.5–6 (pomalejší než SFSpeechRecognizer). SFSpeechRecognizer — pro standardní hlasový vstup. Whisper — pro transkripci dlouhého zvuku s vysokou přesností.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také