SFSpeechRecognizer — co to je, API a integrace v iOS

Autor: IT Sectr Publikováno: 2026-07-19 Doba čtení: 10 min

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 — hlavní Apple ASR API pro iOS (iOS 10+)
  • On-device — rozpoznávání bez internetu od iOS 17, WER 12–14 % pro ruštinu
  • Streaming — částečné výsledky v reálném čase (partial results)
  • 60+ jazyků — ruština, angličtina, čínština, arabština a další
  • Swift Native — plná integrace s AVFoundation, Combine, Swift Concurrency

Co je SFSpeechRecognizer: přehled možností

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ÚčeliOS Verze
SFSpeechRecognizerHlavní třída rozpoznáváníiOS 10+
SFSpeechAudioBufferRecognitionRequestŽivý audio streamiOS 10+
SFSpeechURLRecognitionRequestAudio soubor (.wav, .m4a)iOS 10+
SFSpeechRecognitionTaskSpráva požadavku (cancel, finish)iOS 10+
On-device recognitionOffline ASRiOS 17+
Combined RecognitionHybrid on-device + cloudiOS 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.

Nastavení a oprávnění SFSpeechRecognizer

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.

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

Streamové rozpoznávání řeči z mikrofonu

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

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

Rozpoznávání audio souborů a nahrávek

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

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

On-device vs Cloud: srovnání režimů

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

ParametrOn-device (iOS 17+)Cloud (iOS 10+)
Vyžaduje internetNeAno
WER (EN)10–12%7%
WER (RU)12–14%12%
Latence (RTF)0.3–0.60.3–0.8 (+síť)
Max. délka2 minuty1 minuta
SoukromíÚplnéZvuk jde na server
ZdarmaAnoAno

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.

Použití SFSpeechRecognizer v iOS aplikacích

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

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

Od jaké verze iOS je SFSpeechRecognizer podporován?

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

Lze SFSpeechRecognizer použít pro spojité rozpoznávání?

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

Jak získat confidence každého slova v SFSpeechRecognizer?

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

Proč SFSpeechRecognizer vrací chybu 203?

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

Čím se SFSpeechRecognizer liší od Whisper Core ML?

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í

  • SFSpeechRecognizer — vestavěné Apple ASR API, iOS 10+, 60+ jazyků
  • Režim On-device — iOS 17+, bez internetu, WER 12–14% pro ruštinu
  • Živý mikrofon — AVAudioEngine + request.append(buffer) + částečné výsledky
  • Audio soubory — SFSpeechURLRecognitionRequest, .m4a/.wav, až 1–2 minuty
  • Segments — časová razítka per-word + confidence (0..1) pro každé slovo
  • Zdarma — bez omezení, bez platby Apple, bez SDK třetích stran
  • Použití — hlasový vstup, transkripce, příkazy, přístupnost, diktování

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

Prodiskutovat projekt

Přečtěte si také