SFSpeechRecognizer — mi ez, API és integráció iOS-ben

Szerző: IT Sectr Megjelenés: 2026-07-19 Olvasási idő: 10 perc

SFSpeechRecognizer — az Apple fő API-ja a beszédfelismeréshez az iOS ökoszisztémában. A keretrendszer hozzáférést biztosít az eszköz ASR motorjához a Speech.framework révén, támogatva a valós idejű streamelt átírást és az audiofájlok egyszeri felismerését. Az SFSpeechRecognizer iOS 10+, macOS 10.15+, watchOS 6+ és tvOS 17+ rendszereken érhető el. Az iOS 17-től az Apple hozzáadott egy teljes on-device módot, amely lehetővé teszi a beszédfelismerést internetkapcsolat nélkül. A Apple Speech Documentation, 2025 szerint az SFSpeechRecognizer több mint 200 000 App Store alkalmazásban használatos, és naponta milliókérést dolgoz fel 7% WER-rel angol nyelven.

Főbb pontok

  • SFSpeechRecognizer — az Apple fő ASR API-ja iOS-hez (iOS 10+)
  • On-device — felismerés internet nélkül iOS 17-től, WER 12–14% oroszra
  • Streaming — részleges eredmények valós időben (partial results)
  • 60+ nyelv — orosz, angol, kínai, arab és mások
  • Swift Native — teljes integráció AVFoundation-nal, Combine-nal, Swift Concurrency-vel

Mi az SFSpeechRecognizer: képességek áttekintése

SFSpeechRecognizer — egy osztály a Speech.framework-ből, amely egy beszédfelismerőt képvisel egy adott nyelv számára. Locale-lal (ru_RU, en_US, zh_CN) inicializálódik. Az SFSpeechRecognizer kezeli a felismerési kérést (SFSpeechRecognitionRequest) és visszaadja az eredményt (SFSpeechRecognitionResult) átírásokkal és metaadatokkal. Két típusú kérést támogat: SFSpeechAudioBufferRecognitionRequest (élő audiostream) és SFSpeechURLRecognitionRequest (audiofájl). Mindkettő SFTranscription-t — alternatív felismerési változatok tömbjét adja vissza.

SFSpeechRecognitionResult tartalmazza: bestTranscription (legjobb változat, SFTranscription), transcriptions (összes alternatíva), isFinal (végleges/részleges). SFTranscription tartalmazza: formattedString (szöveg), segments (SFTranscriptionSegment tömb időbélyegekkel, confidence-szel, substringRange-szel, alternativeSubstrings-szel). Confidence minden szegmenshez (0..1) — lehetővé teszi a megbízhatatlan töredékek szűrését. segments — a Speech.framework kulcsfontosságú jellemzője: minden szó annotálása megbízhatósággal.

Az SFSpeechRecognizer architektúrája: AVFoundation (hangrögzítés) → Audio Buffer → SFSpeechAudioBufferRecognitionRequest → SFSpeechRecognizer (ASR motor) → SFSpeechRecognitionResult → SFSpeechRecognitionTask (vezérlés: cancel, finish, pause). Az Apple ASR motor hibrid architektúrát használ: Conformer (kódoló) + RNNT (dekódoló) on-device-hez, Transducer cloud-hoz. A modellek Apple Neural Engine (ANE) rendszerre vannak optimalizálva. A17 Pro-n az on-device ASR RTF 0.3–0.6-dal működik (gyorsabb, mint valós idő).

ÖsszetevőCéliOS Verzió
SFSpeechRecognizerFő felismerési osztályiOS 10+
SFSpeechAudioBufferRecognitionRequestÉlő audiostreamiOS 10+
SFSpeechURLRecognitionRequestAudiofájl (.wav, .m4a)iOS 10+
SFSpeechRecognitionTaskKérés kezelése (cancel, finish)iOS 10+
On-device recognitionOffline ASRiOS 17+
Combined RecognitionHibrid on-device + cloudiOS 17+

Hangkövetelmények: Az SFSpeechRecognizer LPCM (16 kHz, 16 bit, mono) vagy Opus (iOS 17+) formátumot fogad el. Az AVFoundation bármilyen formátumban képes pufferelni, a kérés automatikusan konvertál. Minimális hossz: 0,5 másodperc (csend érzékelése). Maximum: 1 perc (cloud) / 2 perc (on-device) kérésenként. Hosszú átíráshoz ossza fel a hangot 30–60 másodperces darabokra 2–5 másodperces átfedéssel.

SFSpeechRecognizer beállítása és engedélyei

Felhasználói engedélyek: Az SFSpeechRecognizer két explicit engedélyt igényel. NSMicrophoneUsageDescription (Privacy — Microphone Usage Description) — a mikrofonhoz való hozzáféréshez. NSSpeechRecognitionUsageDescription (Privacy — Speech Recognition Usage Description) — a beszédfelismeréshez való hozzáféréshez. Mindkettő sztring, amely elmagyarázza a felhasználónak, hogy miért. SFSpeechRecognizer.requestAuthorization — az engedély párbeszédablak meghívása. Állapotok: notDetermined, denied, restricted, authorized. Authorized nélkül a recognizer hívása 216-os hibát ad vissza (Speech framework error).

Elérhetőség ellenőrzése: SFSpeechRecognizer.isAvailable — ellenőrzi, hogy az ASR elérhető-e az aktuális nyelvhez. iOS 16- rendszeren isAvailable = false internet nélkül. iOS 17+ rendszeren isAvailable = true az on-device nyelvekhez még offline is. SFSpeechRecognizer.supportedLocales — statikus módszer az eszköz által támogatott nyelvek listájának lekérésére. Javasolt az isAvailable ellenőrzése minden indítás előtt (a felhasználó kikapcsolhatja a Siri/Diktálást a beállításokban). Az elérhetőség régiófüggő: kínai — csak Kínában, arab — az UAE-ben.

swift
// SFSpeechRecognizer beállítása
import Speech

SFSpeechRecognizer.requestAuthorization { status in
    guard status == .authorized else { return }
}

let recognizer = SFSpeechRecognizer(locale: Locale(identifier: "ru_RU"))!
guard recognizer.isAvailable else {
    print("Az ASR nem érhető el. Engedélyezze a Siri és Diktálást a Beállításokban")
    return
}

let request = SFSpeechAudioBufferRecognitionRequest()
request.requiresOnDeviceRecognition = true

Hibakezelés: Az SFSpeechRecognizer completion handler-rel hívódik, amely Error-t adhat vissza. Fő hibák: 203 — no internet (cloud, iOS 16-); 216 — not authorized (nincs engedély); 301 — audio error (mikrofon/formátum probléma); 401 — service unavailable (túlterhelt szolgáltatás); 601 — language unavailable (nyelv nem támogatott az eszközön). On-device iOS 17+ esetén a fő hibák: 301 (audio), 601 (language). Mindig kezelje a completion handler-t — a hibák a felvétel bármely pillanatában felléphetnek.

Streamelt beszédfelismerés mikrofonról

Live ASR pipeline: AVAudioEngine (rögzítés mikrofonról) → installTap (audio puffer) → request.append(buffer) → SFSpeechRecognizer → recognitionTask → delegate/resultHandler. Az AVAudioEngine alacsony késleltetést biztosít (5–10 ms mikrofontól pufferig). SFSpeechRecognitionDelegate: didHypothesizeTranscription (200–500 ms-enként — részleges szöveg), didFinishRecognition (végeredmény). Task.isFinishing — megszakítható, amikor a felismerés befejeződött. Folyamatos felismeréshez (végtelen diktálás) — hozzon létre új task-ot isFinal után.

SFSpeechRecognitionTaskDelegate: opcionális módszerek. speechRecognitionDidDetectSpeech (beszéd kezdete) — UI jelzőhöz. didHypothesizeTranscription (részleges szöveg) — megjelenítéshez beszéd közben. didFinishRecognition (végeredmény) — szöveg rögzítéséhez. didFinishSuccessfully (siker/hiba) — befejezéshez. didProcessAudio (audio puffer feldolgozva) — RMS mérőhöz. A didHypothesizeTranscription megvalósítása javasolt — a felhasználó azonnal látja a szöveget, késedelem nélkül. Végleges átírás — mentéshez.

swift
// Élő beszédfelismerés
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()

Folyamatos felismerés: a „mindig hallgass” módhoz (hangbemenet, asszisztens) a task újraindítása szükséges isFinal után. Hozzon létre egy ciklust: finishTask → request = SFSpeechAudioBufferRecognitionRequest() → recognitionTask = recognizer.recognitionTask(with: request). A szünetek elkerülése érdekében fedje át az egyik task végét a következő elejével (indítson új kérést 1–2 másodperccel az előző befejeződése előtt). AVFoundation AVAudioSession — .playAndRecord konfiguráció egyidejű lejátszáshoz és rögzítéshez. iOS 17+ rendszeren a folyamatos ASR on-device móddal 2–5% akkumulátort fogyaszt óránként (A15+).

Audiofájlok és felvételek felismerése

SFSpeechURLRecognitionRequest — kérés audiofájl URL-en keresztüli felismeréséhez. Támogatott formátumok: .wav (16 kHz, 16 bit, mono), .m4a (AAC), .mp4, .mov. Maximális hossz: ~1 perc cloud-hoz, ~2 perc on-device-hez. Hosszabb fájlokhoz — ossza fel darabokra (AVAssetExportSession + trim). Az SFSpeechURLRecognitionRequest nem támogatja a streamelést (nincs részleges eredmény) — csak végeredmény. Részleges eredményekhez fájllal — konvertálja Audio Buffer Request-té.

Audiofájl átírásának lekérése: SFSpeechRecognizer.recognitionTask(with: request) resultHandler. Bontsa ki a bestTranscription.formattedString-et. Szó szintű időbélyegekhez — segments a bestTranscription.segments-ből (segment.duration, segment.timestamp, segment.substring). Szegmensenkénti confidence — az ASR bizonyossága minden szóban (használja szűréshez). Alternatív változatok — transcriptionFormatter alternatívák alacsony confidence-ű szavakhoz. Több beszélős fájlokhoz — az SFSpeechRecognitionRequest több kérést is visszaadhat (egyet beszélőnként, iOS 17+).

swift
// Audiofájl átírása
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("Hiba: \(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)
    }
}

Hosszú audiofájlok darabolása: > 1 perces fájlokhoz vágja 30–60 másodperces darabokra 2–3 másodperces átfedéssel (összeillesztés). AVAssetExportSession + CMTimeRange — darabok exportálása. Alternatíva: UISelectionView (a felhasználó választ szegmenst). Átírások összeillesztése: szövegek konkatenációja, összeillesztés átfedéssel (az előző darab utolsó 2–3 szava összehasonlítva a következő első 2–3 szavával — ismétlődések eltávolítása). A Vosk és Whisper natívan támogatja a hosszú hangot, az SFSpeechRecognizer — nem. Hosszú átíráshoz a Whisper (Core ML) ajánlott — nincs hosszkorlát.

On-device kontra Cloud: módok összehasonlítása

On-device mód (iOS 17+): request.requiresOnDeviceRecognition = true. Az ASR lokálisan fut az Apple Neural Engine (ANE) rendszeren. Előnyök: internet nélkül, adatvédelem (hang nem hagyja el az eszközt), nulla költség (ingyenes), alacsony késleltetés (RTF 0.3–0.6). Hátrányok: alacsonyabb pontosság (WER 12–14% vs 7–12%), 2 perces korlát kérésenként, korlátozott nyelvkészlet (nem mind a 60 nyelv érhető el on-device). Az on-device modell ~50–100 MB-ot foglal az eszközön, az első kérésnél töltődik be.

Cloud (iOS 16-): request.requiresOnDeviceRecognition = false (vagy a paraméter hiányzik). ASR az Apple szerverein — pontosabb (WER 7% EN, 12% RU), több nyelv, akár 1 perc kérésenként. Internetet igényel (WiFi vagy mobil). Az Apple nem számít fel díjat a fejlesztőnek a cloud ASR-ért (ingyenes). Korlátok: 1 kérés percenként alkalmazásonként (nincs meghatározva), de termelési méretben az Apple korlátozhat. cloud ASR — best-effort minőség, SLA nélkül. Vállalati alkalmazásokhoz használja a Google Cloud ASR-t vagy a Whisper-t (Core ML).

ParaméterOn-device (iOS 17+)Cloud (iOS 10+)
Internetet igényelNemIgen
WER (EN)10–12%7%
WER (RU)12–14%12%
Késleltetés (RTF)0.3–0.60.3–0.8 (+hálózat)
Max. hossz2 perc1 perc
AdatvédelemTeljesHang a szerverre kerül
IngyenesIgenIgen

Combined Recognition (iOS 17+): request.requiresOnDeviceRecognition = false internettel (cloud), = true offline (fallback). Az Apple automatikusan választ módot. Pontosság-kritikus alkalmazásokhoz: ellenőrizze a NetworkMonitor-t (NWPathMonitor) — internettel cloud, nélküle on-device. Adatvédelem-kritikus alkalmazásokhoz: mindig on-device. Átíráshoz: cloud (pontosabb). Hangbemenethez: on-device (gyorsabb). Ajánlott Combined: 80% cloud, 20% on-device fallback.

SFSpeechRecognizer alkalmazása iOS-alkalmazásokban

Hangbemenet egyedi billentyűzetben — az SFSpeechRecognizer be van ágyazva a billentyűzetbővítményekbe (iOS 10+). A felhasználó megnyomja a mikrofon gombot — az ASR átírja a beszédet szöveggé és beszúrya a szövegmezőbe. Követelmények: részleges eredmények (szöveg látása valós időben), on-device (a billentyűzetnek internet nélkül kell működnie). SFSpeechRecognizer + AVSpeechSynthesizer — hangbemenet + hangkimenet. Egyedi billentyűzethez iOS 17+ rendszeren használjon on-device-t. A billentyűzetbővítmény korlátai: az AVAudioEngine elérhető, de időkorlátokkal (background execution limited).

Értekezletek és előadások átírása — alkalmazások hang rögzítésére és átírására (Otter.ai, Rev, Apple Voice Memos). Az SFSpeechURLRecognitionRequest feldolgozza a .m4a fájlt. Hosszú felvételekhez (30–60 perc) — Whisper Core ML (nincs hosszkorlát). SFSpeechRecognizer szegmensek időbélyegekkel — szöveg és hang szinkronizálásához (szöveg kiemelése lejátszás közben). Szegmensenkénti confidence — megbízhatatlan töredékek megjelenítéséhez (sárga kiemelés). Beszélő diarizációhoz (ki beszélt) — az Apple nem biztosít API-t, használja a pyannote-audio + Whisper-t a szerveren.

Hangutasítások iOS-alkalmazásokban — SFSpeechRecognizer + VGS framework (Voice Grammar Services) utasítások végrehajtásához: „nyisd meg a beállításokat”, „küldj üzenetet”, ‚kapcsold fel a villanyt”. Nyelvtanalapú felismerés: SFSpeechRecognitionRequest contextualStrings = utasítások tömbje. Ez 95%-ra növeli az utasítások felismerésének pontosságát (85% free-form helyett). SFSpeechRecognitionTask.cancel — megszakításhoz az utasítás végrehajtása után. VGS + SFSpeechRecognizer + Shortcuts — egyedi hangutasítások felület írása nélkül. Akadálymentesítéshez: Voice Control (beépített) + SFSpeechRecognizer (egyedi utasítások).

swift
// Hangutasítások kontextuális sztringekkel
let request = SFSpeechAudioBufferRecognitionRequest()
request.requiresOnDeviceRecognition = true
request.shouldReportPartialResults = true
request.contextualStrings = ["open contacts", "send message",
                             "show notifications", "kapcsold fel a lámpát"]

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()
    }
}

Diktálás egészségügyi és jogi alkalmazásokban — SFSpeechRecognizer strukturált dokumentumok hanggal történő létrehozásához. Domain Adaptation: contextualStrings orvosi/jogi kifejezésekkel (500+ kifejezés). SFSpeechRecognitionRequest.customLmProbability — a contextualStrings hatása (0.1–1.0). Orvosi diktáláshoz használjon on-device-t (betegadatok védelme). Whisper orvosi adatokra finomhangolva — alternatíva 5% WER-rel a 12% WERű alap SFSpeechRecognizer helyett. HIPAA-megfelelés: on-device mód (az adatok nem hagyják el az eszközt). Konzultációk átírásához — SFSpeechURLRecognitionRequest + segments beszélő időbélyegekkel.

Gyakran ismételt kérdések

Melyik iOS verziótól támogatott az SFSpeechRecognizer?

SFSpeechRecognizer iOS 10, macOS 10.15, watchOS 6 és tvOS 17 rendszerektől érhető el. On-device mód — iOS 17-től (requiresOnDeviceRecognition). iOS 10–16 rendszereken az SFSpeechRecognizer csak Apple cloud szervereken keresztül működik (internetet igényel). Minden verzióban kötelező a felhasználó explicit engedélye (NSMicrophoneUsageDescription + NSSpeechRecognitionUsageDescription). SFSpeechRecognizer.supportedLocales — dinamikus lista, régiótól és eszközmodelltől függ.

Használható az SFSpeechRecognizer folyamatos felismerésre?

Igen, új recognitionTask létrehozásával isFinal után. Indítsa újra a task-ot az előző befejeződése után a folyamatos felismeréshez. iOS 17 rendszeren a folyamatos on-device ASR 2–5% akkumulátort fogyaszt óránként (A15+). iOS 16- rendszeren a folyamatos ASR internetet igényel (~1 MB/perc adatforgalom). Tényleg folyamatos felismeréshez (mindig hallgat) használja a Vosk (offline) vagy Whisper Core ML-t. Az SFSpeechRecognizer nem támogatja a mindig-be van kapcsolva módot iOS 16- rendszeren.

Hogyan kapom meg az egyes szavak confidence-ét az SFSpeechRecognizer-ben?

Használja a result.bestTranscription.segments-t — minden SFTranscriptionSegment confidence-t (Float 0..1) tartalmaz a szóhoz. segments[i].substring — a szó szövege. segments[i].confidence — az ASR bizonyossága ebben a szóban. A confidence < 0.5 szavak — megbízhatatlanok, emelje ki őket a felületen. segments[i].timestamp — kezdési idő (TimeInterval). segments[i].duration — időtartam. segments[i].alternativeSubstrings — a szó alternatív felismerési változatai. Hosszú fájlokhoz a segments bejárása per-word confidence-t ad kézi elemzés nélkül.

Miért ad vissza az SFSpeechRecognizer 203-as hibát?

203 — SFSpeechError.ErrorCode.opportunistic (nincs internet cloud ASR-hez). iOS 16- rendszeren vagy request.requiresOnDeviceRecognition = false esetén fordul elő internet nélkül. Megoldás: állítsa be a requiresOnDeviceRecognition = true értéket (iOS 17+) offline működéshez. iOS 16- rendszeren használja az NWPathMonitor-t — internet hiányában jelenítse meg a „beszédfelismeréshez internet szükséges” üzenetet. Alternatíva: Vosk (offline, iOS 12+) fallbackként hálózat hiányában.

Miben különbözik az SFSpeechRecognizer a Whisper Core ML-től?

SFSpeechRecognizer — beépített Apple API, ingyenes, egyszerűen integrálható, de hosszkorláttal (1–2 perc), WER 7–14% pontossággal és csak iOS ökoszisztémához. Whisper Core ML — nyílt forráskódú (MIT), 99 nyelvet támogat, WER 6–10%, nincs hosszkorlát, de kézi integrációt igényel, Core ML modellek (39M–769M paraméter), RTF 0.5–6 (lassabb, mint SFSpeechRecognizer). SFSpeechRecognizer — standard hangbemenethez. Whisper — nagy pontosságú hosszú hang átírásához.

Összefoglalás

  • SFSpeechRecognizer — beépített Apple ASR API, iOS 10+, 60+ nyelv
  • On-device mód — iOS 17+, internet nélkül, WER 12–14% oroszra
  • Élő mikrofon — AVAudioEngine + request.append(buffer) + részleges eredmények
  • Audiofájlok — SFSpeechURLRecognitionRequest, .m4a/.wav, akár 1–2 percig
  • Segments — per-word időbélyegek + confidence (0..1) minden szóhoz
  • Ingyenes — korlátozások nélkül, Apple fizetés nélkül, harmadik fél SDK nélkül
  • Alkalmazás — hangbemenet, átírás, utasítások, akadálymentesítés, diktálás

Kulcsrakész mobilalkalmazást fejlesztünk

Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.

Projekt megbeszélése

Olvassa el is