SFSpeechRecognizer — главни Apple API за препознавање говора у iOS екосистему. Оквир пружа приступ ASR мотору уређаја преко Speech.framework, подржавајући стриминг транскрипцију у реалном времену и једнократно препознавање аудио датотека. SFSpeechRecognizer је доступан на iOS 10+, macOS 10.15+, watchOS 6+ и tvOS 17+. Од iOS 17 Apple је додао потпуни on-device режим који омогућава препознавање говора без интернет везе. Према Apple Speech Documentation, 2025, SFSpeechRecognizer се користи у преко 200.000 App Store апликација и обрађује милионе захтева дневно са WER 7% за енглески језик.
Главне тачке
SFSpeechRecognizer — класа из Speech.framework која представља препознавач говора за одређени језик. Иницијализује се са Locale (ru_RU, en_US, zh_CN). SFSpeechRecognizer управља захтевом за препознавање (SFSpeechRecognitionRequest) и враћа резултат (SFSpeechRecognitionResult) са транскриптима и метаподацима. Подржава два типа захтева: SFSpeechAudioBufferRecognitionRequest (живи аудио ток) и SFSpeechURLRecognitionRequest (аудио датотека). Оба враћају SFTranscription — низ алтернативних варијанти препознавања.
SFSpeechRecognitionResult садржи: bestTranscription (најбоља варијанта, SFTranscription), transcriptions (све алтернативе), isFinal (коначни/привремени). SFTranscription садржи: formattedString (текст), segments (низ SFTranscriptionSegment са временским ознакама, confidence, substringRange, alternativeSubstrings). Confidence за сваки сегмент (0..1) — омогућава филтрирање nepouzdanih фрагмената. segments — кључна карактеристика Speech.framework: обезбеђује анотацију сваке речи са сигурношћу.
Архитектура SFSpeechRecognizer: AVFoundation (хватање звука) → Audio Buffer → SFSpeechAudioBufferRecognitionRequest → SFSpeechRecognizer (ASR мотор) → SFSpeechRecognitionResult → SFSpeechRecognitionTask (контрола: cancel, finish, pause). Apple ASR мотор користи хибридну архитектуру: Conformer (енкодер) + RNNT (декодер) за on-device, Transducer за cloud. Модели су оптимизовани за Apple Neural Engine (ANE). На A17 Pro on-device ASR ради са RTF 0.3–0.6 (брже од реалног времена).
| Компонента | Намена | iOS Верзија |
|---|---|---|
| SFSpeechRecognizer | Главна класа препознавања | iOS 10+ |
| SFSpeechAudioBufferRecognitionRequest | Живи аудио ток | iOS 10+ |
| SFSpeechURLRecognitionRequest | Аудио датотека (.wav, .m4a) | iOS 10+ |
| SFSpeechRecognitionTask | Управљање захтевом (cancel, finish) | iOS 10+ |
| On-device recognition | Offline ASR | iOS 17+ |
| Combined Recognition | Хибрид on-device + cloud | iOS 17+ |
Аудио захтеви: SFSpeechRecognizer прихвата LPCM (16 kHz, 16 bit, mono) или Opus (iOS 17+). AVFoundation може да хвата бафер у било ком формату, захтев аутоматски конвертује. Минимална дужина: 0.5 секунди (детекција тишине). Максимална: 1 минут (cloud) / 2 минута (on-device) по захтеву. За дугу транскрипцију делите аудио на делове од 30–60 секунди са преклапањем од 2–5 секунди.
Дозволе корисника: SFSpeechRecognizer захтева две експлицитне дозволе. NSMicrophoneUsageDescription (Privacy — Microphone Usage Description) — за приступ микрофону. NSSpeechRecognitionUsageDescription (Privacy — Speech Recognition Usage Description) — за приступ препознавању говора. Оба су низови који објашњавају кориснику зашто. SFSpeechRecognizer.requestAuthorization — позив дијалога за дозволе. Статуси: notDetermined, denied, restricted, authorized. Без authorized позив recognizer-а враћа грешку 216 (Speech framework error).
Провера доступности: SFSpeechRecognizer.isAvailable — проверава да ли је ASR доступан за текући језик. На iOS 16- isAvailable = false без интернета. На iOS 17+ isAvailable = true за on-device језике чак и offline. SFSpeechRecognizer.supportedLocales — статички метод за добијање листе подржаних језика уређаја. Препоручује се провера isAvailable пре сваког покретања (корисник може искључити Siri/Диктовање у подешавањима). Доступност зависи од региона: кинески — само у Кини, арапски — у УАЕ.
// 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 није доступан. Омогућите Siri и Диктовање у Подешавањима")
return
}
let request = SFSpeechAudioBufferRecognitionRequest()
request.requiresOnDeviceRecognition = true
Обрада грешака: SFSpeechRecognizer се позива са completion handler-ом који може вратити грешку. Главне грешке: 203 — no internet (cloud, iOS 16-); 216 — not authorized (нема дозволе); 301 — audio error (проблем са микрофоном/форматом); 401 — service unavailable (услуга преоптерећена); 601 — language unavailable (језик није подржан на уређају). За on-device iOS 17+ главне грешке: 301 (audio), 601 (language). Увек обрађујте completion handler — грешке могу настати у било ком тренутку снимања.
Live ASR pipeline: AVAudioEngine (хватање са микрофона) → installTap (аудио бафер) → request.append(buffer) → SFSpeechRecognizer → recognitionTask → delegate/resultHandler. AVAudioEngine обезбеђује ниску латенцију (5–10 ms од микрофона до бафера). SFSpeechRecognitionDelegate: didHypothesizeTranscription (сваких 200–500 ms — делимични текст), didFinishRecognition (коначни резултат). Task.isFinishing — може се отказати када је препознавање завршено. За континуирано препознавање (бесконачно диктирање) — креирајте нови task након isFinal.
SFSpeechRecognitionTaskDelegate: опционалне методе. speechRecognitionDidDetectSpeech (почетак говора) — за UI индикацију. didHypothesizeTranscription (привремени текст) — за приказ током изговарања. didFinishRecognition (коначни резултат) — за фиксирање текста. didFinishSuccessfully (успех/грешка) — за завршетак. didProcessAudio (аудио бафер обрађен) — за RMS метар. Препоручује се имплементација didHypothesizeTranscription — корисник види текст одмах, без кашњења. Коначна транскрипција — за чување.
// Препознавање говора уживо
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()
Континуирано препознавање: за режим “слушај увек” (гласовни унос, асистент) потребно је поновно покретање задатка након isFinal. Направите петљу: finishTask → request = SFSpeechAudioBufferRecognitionRequest() → recognitionTask = recognizer.recognitionTask(with: request). Да бисте избегли паузе, преклапајте крај једног задатка са почетком следећег (покрените нови захтев 1–2 секунде пре завршетка претходног). AVFoundation AVAudioSession — подешавање .playAndRecord за истовремену репродукцију и снимање. На iOS 17+ континуирано ASR са on-device троши 2–5% батерије на сат (A15+).
SFSpeechURLRecognitionRequest — захтев за препознавање аудио датотеке преко URL-а. Подржава формате: .wav (16 kHz, 16 bit, mono), .m4a (AAC), .mp4, .mov. Максимална дужина: ~1 минут за cloud, ~2 минута за on-device. За дуже датотеке — делите на делове (AVAssetExportSession + trim). SFSpeechURLRecognitionRequest не подржава стриминг (нема делимичних резултата) — само коначни резултат. За делимичне резултате са датотеком — конвертујте у Audio Buffer Request.
Добијање транскрипције аудио датотеке: SFSpeechRecognizer.recognitionTask(with: request) resultHandler. Извуците bestTranscription.formattedString. За временске ознаке на нивоу речи — segments из bestTranscription.segments (segment.duration, segment.timestamp, segment.substring). Confidence по сегменту — сигурност ASR-а у свакој речи (користите за филтрирање). Алтернативне варијанте — алтернативе transcriptionFormatter за речи са ниским confidence. За датотеке са више говорника — SFSpeechRecognitionRequest може враћати више захтева (по један по говорнику, iOS 17+).
// Транскрипција аудио датотеке
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("Грешка: \(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)
}
}
Подела дугих аудио датотека: за датотеке > 1 минута сеците на делове од 30–60 секунди са преклапањем од 2–3 секунде (спајање). AVAssetExportSession + CMTimeRange — извоз делова. Алтернатива: UISelectionView (корисник бира сегмент). Спајање транскрипција: конкатенација текстова, спајање по преклапању (последње 2–3 речи претходног дела се пореде са првих 2–3 речи следећег — уклоните дупликате). Vosk и Whisper подржавају дугачке аудио записе природно, SFSpeechRecognizer — не. За дугу транскрипцију препоручујем Whisper (Core ML) — без ограничења дужине.
On-device режим (iOS 17+): request.requiresOnDeviceRecognition = true. ASR се извршава локално на Apple Neural Engine (ANE). Предности: без интернета, приватност (аудио не напушта уређај), нулти трошак (бесплатно), ниска латенција (RTF 0.3–0.6). Недостаци: нижа тачност (WER 12–14% vs 7–12%), ограничење 2 минута по захтеву, ограничен скуп језика (нису свих 60 доступни on-device). On-device модел заузима ~50–100 MB на уређају, учитава се при првом захтеву.
Cloud (iOS 16-): request.requiresOnDeviceRecognition = false (или параметар недостаје). ASR на Apple серверима — тачнији (WER 7% EN, 12% RU), више језика, до 1 минут по захтеву. Захтева интернет (WiFi или мобилни). Apple не наплаћује програмеру за cloud ASR (бесплатно). Ограничења: 1 захтев у минути по апликацији (неодређено), али за производни обим Apple може ограничити. cloud ASR — квалитет best-effort, без SLA. За корпоративне апликације користите Google Cloud ASR или Whisper (Core ML).
| Параметар | On-device (iOS 17+) | Cloud (iOS 10+) |
|---|---|---|
| Захтева интернет | Не | Да |
| WER (EN) | 10–12% | 7% |
| WER (RU) | 12–14% | 12% |
| Латенција (RTF) | 0.3–0.6 | 0.3–0.8 (+мрежа) |
| Макс. дужина | 2 минута | 1 минут |
| Приватност | Потпуна | Аудио иде на сервер |
| Бесплатно | Да | Да |
Combined Recognition (iOS 17+): request.requiresOnDeviceRecognition = false са интернетом (cloud), = true при offline (fallback). Apple аутоматски бира режим. За апликације критичне за тачност: проверавајте NetworkMonitor (NWPathMonitor) — са интернетом cloud, без њега on-device. За апликације критичне за приватност: увек on-device. За транскрипцију: cloud (тачнији). За гласовни унос: on-device (бржи). Препоручује се Combined: 80% cloud, 20% on-device fallback.
Гласовни унос у прилагођеној тастатури — SFSpeechRecognizer се уграђује у проширења тастатуре (iOS 10+). Корисник притиска дугме микрофона — ASR транскрибује говор у текст и убацује га у текстуално поље. Захтеви: делимични резултати (видети текст у реалном времену), on-device (тастатура мора радити без интернета). SFSpeechRecognizer + AVSpeechSynthesizer — гласовни унос + гласовни излаз. За прилагођену тастатуру на iOS 17+ користите on-device. Ограничења проширења тастатуре: AVAudioEngine је доступан, али са временским ограничењима (background execution limited).
Транскрипција састанака и предавања — апликације за снимање и транскрипцију звука (Otter.ai, Rev, Apple Voice Memos). SFSpeechURLRecognitionRequest обрађује .m4a датотеку. За дуга снимања (30–60 минута) — Whisper Core ML (без ограничења дужине). SFSpeechRecognizer сегменти са временским ознакама — за синхронизацију текста са звуком (истицање текста током репродукције). Confidence по сегменту — за приказ nepouzdanih фрагмената (жуто истицање). За дијаризацију говорника (ко је говорио) — Apple не пружа API, користите pyannote-audio + Whisper на серверу.
Гласовне команде у iOS апликацијама — SFSpeechRecognizer + VGS framework (Voice Grammar Services) за извршавање команди: “отвори подешавања”, “пошаљи поруку”, “упали светло”. Препознавање засновано на граматици: SFSpeechRecognitionRequest contextualStrings = низ команди. Ово повећава тачност препознавања команди до 95% (vs 85% free-form). SFSpeechRecognitionTask.cancel — за прекид након извршења команде. VGS + SFSpeechRecognizer + Shortcuts — прилагођене гласовне команде без писања интерфејса. За приступачност: Voice Control (уграђени) + SFSpeechRecognizer (прилагођене команде).
// Гласовне команде са контекстним низовима
let request = SFSpeechAudioBufferRecognitionRequest()
request.requiresOnDeviceRecognition = true
request.shouldReportPartialResults = true
request.contextualStrings = ["open contacts", "send message",
"show notifications", "упали батерију"]
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()
}
}
Диктирање у медицинским и правним апликацијама — SFSpeechRecognizer за креирање структурираних докумената гласом. Domain Adaptation: contextualStrings са медицинским/правним терминима (500+ фраза). SFSpeechRecognitionRequest.customLmProbability — утицај contextualStrings (0.1–1.0). За медицинско диктирање користите on-device (приватност података пацијента). Whisper прилагођен на медицинским подацима — алтернатива са WER 5% уместо 12% основног SFSpeechRecognizer. Усклађеност са HIPAA: on-device режим (подаци не напуштају уређај). За транскрипцију прегледа — SFSpeechURLRecognitionRequest + segments са временским ознакама говорника.
Често постављана питања
SFSpeechRecognizer је доступан од iOS 10, macOS 10.15, watchOS 6 и tvOS 17. On-device режим — од iOS 17 (requiresOnDeviceRecognition). На iOS 10–16 SFSpeechRecognizer ради само преко Apple cloud сервера (захтева интернет). На свим верзијама је потребна експлицитна дозвола корисника (NSMicrophoneUsageDescription + NSSpeechRecognitionUsageDescription). SFSpeechRecognizer.supportedLocales — динамичка листа, зависи од региона и модела уређаја.
Да, креирањем нових recognitionTask након isFinal. Поново покрените задатак након финализације претходног за континуирано препознавање. На iOS 17 континуирано ASR on-device троши 2–5% батерије на сат (A15+). На iOS 16- континуирано ASR захтева интернет (потрошња података ~1 MB/минут). За заиста континуирано препознавање (увек слуша) користите Vosk (offline) или Whisper Core ML. SFSpeechRecognizer не подржава увек-укључени режим на iOS 16-.
Користите result.bestTranscription.segments — сваки SFTranscriptionSegment садржи confidence (Float 0..1) за реч. segments[i].substring — текст речи. segments[i].confidence — сигурност ASR-а у овој речи. Речи са confidence < 0.5 — nepouzdane, истичите их у интерфејсу. segments[i].timestamp — време почетка (TimeInterval). segments[i].duration — трајање. segments[i].alternativeSubstrings — алтернативне варијанте препознавања речи. За дуге датотеке пролазак кроз segments даје confidence per-word без ручног парсирања.
203 — SFSpeechError.ErrorCode.opportunistic (нема интернета за cloud ASR). Јавља се на iOS 16- или при request.requiresOnDeviceRecognition = false без интернета. Решење: поставите requiresOnDeviceRecognition = true (iOS 17+) за рад offline. На iOS 16- користите NWPathMonitor — при недостатку интернета прикажите поруку “за препознавање говора је потребан интернет”. Алтернатива: Vosk (offline, iOS 12+) као fallback у одсуству мреже.
SFSpeechRecognizer — уграђени Apple API, бесплатан, једноставан за интеграцију, али са ограничавањем дужине (1–2 минута), тачношћу WER 7–14% и само за iOS екосистем. Whisper Core ML — отвореног кода (MIT), подржава 99 језика, WER 6–10%, без ограничења дужине, али захтева ручну интеграцију, Core ML моделе (39M–769M параметара), RTF 0.5–6 (спорији од SFSpeechRecognizer). SFSpeechRecognizer — за стандардни гласовни унос. Whisper — за транскрипцију дугачког звука високе тачности.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође