SFSpeechRecognizer — шта је, API и интеграција у iOS

Аутор: IT Sectr Објављено: 2026-07-19 Време читања: 10 мин

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 — главни Apple ASR API за iOS (iOS 10+)
  • On-device — препознавање без интернета од iOS 17, WER 12–14% за руски
  • Streaming — делимични резултати у реалном времену (partial results)
  • 60+ језика — руски, енглески, кинески, арапски и други
  • Swift Native — потпуна интеграција са AVFoundation, Combine, Swift Concurrency

Шта је SFSpeechRecognizer: преглед могућности

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 recognitionOffline ASRiOS 17+
Combined RecognitionХибрид on-device + cloudiOS 17+

Аудио захтеви: SFSpeechRecognizer прихвата LPCM (16 kHz, 16 bit, mono) или Opus (iOS 17+). AVFoundation може да хвата бафер у било ком формату, захтев аутоматски конвертује. Минимална дужина: 0.5 секунди (детекција тишине). Максимална: 1 минут (cloud) / 2 минута (on-device) по захтеву. За дугу транскрипцију делите аудио на делове од 30–60 секунди са преклапањем од 2–5 секунди.

Подешавање и дозволе SFSpeechRecognizer

Дозволе корисника: 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/Диктовање у подешавањима). Доступност зависи од региона: кинески — само у Кини, арапски — у УАЕ.

swift
// 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 — корисник види текст одмах, без кашњења. Коначна транскрипција — за чување.

swift
// Препознавање говора уживо
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+).

swift
// Транскрипција аудио датотеке
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 против Cloud: поређење режима

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.60.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 апликацијама

Гласовни унос у прилагођеној тастатури — 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 (прилагођене команде).

swift
// Гласовне команде са контекстним низовима
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 са временским ознакама говорника.

Често постављана питања

Од које верзије iOS се подржава SFSpeechRecognizer?

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 — динамичка листа, зависи од региона и модела уређаја.

Може ли се SFSpeechRecognizer користити за континуирано препознавање?

Да, креирањем нових recognitionTask након isFinal. Поново покрените задатак након финализације претходног за континуирано препознавање. На iOS 17 континуирано ASR on-device троши 2–5% батерије на сат (A15+). На iOS 16- континуирано ASR захтева интернет (потрошња података ~1 MB/минут). За заиста континуирано препознавање (увек слуша) користите Vosk (offline) или Whisper Core ML. SFSpeechRecognizer не подржава увек-укључени режим на iOS 16-.

Како добити confidence сваке речи у SFSpeechRecognizer?

Користите 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 без ручног парсирања.

Зашто SFSpeechRecognizer враћа грешку 203?

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 разликује од Whisper Core ML?

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 — за транскрипцију дугачког звука високе тачности.

Закључак

  • SFSpeechRecognizer — уграђени Apple ASR API, iOS 10+, 60+ језика
  • On-device режим — iOS 17+, без интернета, WER 12–14% за руски
  • Живи микрофон — AVAudioEngine + request.append(buffer) + делимични резултати
  • Аудио датотеке — SFSpeechURLRecognitionRequest, .m4a/.wav, до 1–2 минута
  • Segments — per-word временске ознаке + confidence (0..1) за сваку реч
  • Бесплатно — без ограничења, без плаћања Apple-у, без трећих SDK
  • Примена — гласовни унос, транскрипција, команде, приступачност, диктирање

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође