SFSpeechRecognizer — bu nima, API va iOS da integratsiya

Muallif: IT Sectr Nashr etilgan: 2026-07-19 O'qish vaqti: 10 daq

SFSpeechRecognizer — iOS ekotizimidagi nutqni aniqlash uchun Apple-ning asosiy API-si. Framework Speech.framework orqali qurilmaning ASR dvigateliga kirishni ta’minlaydi, real vaqtda oqim transkripsiyasi va audio fayllarni bir martalik aniqlashni qo‘llab-quvvatlaydi. SFSpeechRecognizer iOS 10+, macOS 10.15+, watchOS 6+ va tvOS 17+ da mavjud. iOS 17 dan boshlab Apple internetga ulanmasdan nutqni aniqlash imkonini beruvchi to‘liq on-device rejimini qo‘shdi. Apple Speech Documentation, 2025 ma’lumotlariga ko‘ra, SFSpeechRecognizer App Store-da 200 000 dan ortiq ilovalarda qo‘llaniladi va ingliz tilida WER 7% bilan kuniga millionlab so‘rovlarni qayta ishlaydi.

Asosiy jihatlar

  • SFSpeechRecognizer — iOS uchun Apple-ning asosiy ASR API-si (iOS 10+)
  • On-device — iOS 17 dan internet holda aniqlash, rus tili uchun WER 12–14%
  • Streaming — real vaqtda qisman natijalar (partial results)
  • 60+ til — rus, ingliz, xitoy, arab va boshqalar
  • Swift Native — AVFoundation, Combine, Swift Concurrency bilan to‘liq integratsiya

SFSpeechRecognizer nima: imkoniyatlar sharhi

SFSpeechRecognizer — ma’lum bir til uchun nutqni aniqlovchini ifodalovchi Speech.framework sinfi. U Locale (ru_RU, en_US, zh_CN) bilan ishga tushiriladi. SFSpeechRecognizer aniqlash so‘rovini (SFSpeechRecognitionRequest) boshqaradi va transkripsiyalar va metama’lumotlar bilan natija (SFSpeechRecognitionResult) qaytaradi. Ikki turdagi so‘rovni qo‘llab-quvvatlaydi: SFSpeechAudioBufferRecognitionRequest (jonli audio oqimi) va SFSpeechURLRecognitionRequest (audio fayl). Ikkalasi ham SFTranscription — muqobil aniqlash variantlari massivini qaytaradi.

SFSpeechRecognitionResult o‘z ichiga oladi: bestTranscription (eng yaxshi variant, SFTranscription), transcriptions (barcha alternativalar), isFinal (yakuniy/oraliq). SFTranscription o‘z ichiga oladi: formattedString (matn), segments (vaqt belgilari, confidence, substringRange, alternativeSubstrings bilan SFTranscriptionSegment massivi). Har bir segment uchun Confidence (0..1) — ishonchsiz fragmentlarni filtrlash imkonini beradi. segments — Speech.framework-ning asosiy xususiyati: har bir so‘zni ishonch bilan annotatsiya qiladi.

SFSpeechRecognizer arxitekturasi: AVFoundation (audio olish) → Audio Buffer → SFSpeechAudioBufferRecognitionRequest → SFSpeechRecognizer (ASR dvigateli) → SFSpeechRecognitionResult → SFSpeechRecognitionTask (boshqaruv: cancel, finish, pause). Apple ASR dvigateli gibrid arxitekturani ishlatadi: on-device uchun Conformer (enkoder) + RNNT (dekoder), cloud uchun Transducer. Modellar Apple Neural Engine (ANE) uchun optimallashtirilgan. A17 Pro da on-device ASR RTF 0.3–0.6 bilan ishlaydi (real vaqtdan tezroq).

KomponentVazifaiOS Versiyasi
SFSpeechRecognizerAsosiy aniqlash sinfiiOS 10+
SFSpeechAudioBufferRecognitionRequestJonli audio oqimiiOS 10+
SFSpeechURLRecognitionRequestAudio fayl (.wav, .m4a)iOS 10+
SFSpeechRecognitionTaskSo‘rovni boshqarish (cancel, finish)iOS 10+
On-device recognitionOffline ASRiOS 17+
Combined RecognitionOn-device + cloud gibridiOS 17+

Audio talablar: SFSpeechRecognizer LPCM (16 kHz, 16 bit, mono) yoki Opus (iOS 17+) qabul qiladi. AVFoundation istalgan formatda bufer olishi mumkin, so‘rov avtomatik konvertatsiya qiladi. Minimal uzunlik: 0.5 soniya (sukutni aniqlash). Maksimal: 1 daqiqa (cloud) / 2 daqiqa (on-device) bitta so‘rov uchun. Uzun transkripsiya uchun audioni 30–60 soniyali bo‘laklarga 2–5 soniya qoplama bilan bo‘ling.

SFSpeechRecognizer sozlamalari va ruxsatlari

Foydalanuvchi ruxsatlari: SFSpeechRecognizer ikkita aniq ruxsatni talab qiladi. NSMicrophoneUsageDescription (Privacy — Microphone Usage Description) — mikrofonga kirish uchun. NSSpeechRecognitionUsageDescription (Privacy — Speech Recognition Usage Description) — nutqni aniqlashga kirish uchun. Ikkalasi ham foydalanuvchiga nima uchunligini tushuntiruvchi satrlardir. SFSpeechRecognizer.requestAuthorization — ruxsat dialogini chaqirish. Statuslar: notDetermined, denied, restricted, authorized. Authorized bo‘lmasa recognizer chaqiruvi 216 xatosini qaytaradi (Speech framework error).

Mavjudlikni tekshirish: SFSpeechRecognizer.isAvailable — ASR joriy til uchun mavjudligini tekshiradi. iOS 16- da internet holda isAvailable = false. iOS 17+ da on-device tillar uchun offline ham isAvailable = true. SFSpeechRecognizer.supportedLocales — qurilma tomonidan qo‘llab-quvvatlanadigan tillar ro‘yxatini olish uchun statik metod. Har bir ishga tushirishdan oldin isAvailable ni tekshirish tavsiya etiladi (foydalanuvchi sozlamalarda Siri/Diktantni o‘chirishi mumkin). Mavjudlik mintaqaga bog‘liq: xitoy tili — faqat Xitoyda, arab tili — BAAda.

swift
// SFSpeechRecognizer sozlamalari
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 mavjud emas. Sozlamalarda Siri va Diktantni yoqing")
    return
}

let request = SFSpeechAudioBufferRecognitionRequest()
request.requiresOnDeviceRecognition = true

Xatolarni boshqarish: SFSpeechRecognizer Error qaytarishi mumkin bo‘lgan completion handler bilan chaqiriladi. Asosiy xatolar: 203 — no internet (cloud, iOS 16-); 216 — not authorized (ruxsat yo‘q); 301 — audio error (mikrofon/format muammosi); 401 — service unavailable (xizmat haddan tashqari yuklangan); 601 — language unavailable (til qurilmada qo‘llab-quvvatlanmaydi). On-device iOS 17+ uchun asosiy xatolar: 301 (audio), 601 (language). Har doim completion handler ni boshqaring — xatolar yozuvning istalgan vaqtida yuz berishi mumkin.

Mikrofondan oqimli nutqni aniqlash

Live ASR pipeline: AVAudioEngine (mikrofondan olish) → installTap (audio bufer) → request.append(buffer) → SFSpeechRecognizer → recognitionTask → delegate/resultHandler. AVAudioEngine past kechikishni ta’minlaydi (mikrofondan buferga 5–10 ms). SFSpeechRecognitionDelegate: didHypothesizeTranscription (har 200–500 ms — qisman matn), didFinishRecognition (yakuniy natija). Task.isFinishing — aniqlash tugagach bekor qilinishi mumkin. Uzluksiz aniqlash (cheksiz diktant) uchun — isFinal dan keyin yangi task yarating.

SFSpeechRecognitionTaskDelegate: ixtiyoriy metodlar. speechRecognitionDidDetectSpeech (nutq boshlanishi) — UI ko‘rsatkichi uchun. didHypothesizeTranscription (oraliq matn) — gapirish vaqtida ko‘rsatish uchun. didFinishRecognition (yakuniy natija) — matnni qayd etish uchun. didFinishSuccessfully (muvaffaqiyat/xato) — tugatish uchun. didProcessAudio (audio bufer qayta ishlandi) — RMS o‘lchagich uchun. didHypothesizeTranscription ni amalga oshirish tavsiya etiladi — foydalanuvchi matnni darhol, kechikishsiz ko‘radi. Yakuniy transkripsiya — saqlash uchun.

swift
// Jonli nutqni aniqlash
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()

Uzluksiz aniqlash: “doim tingla” rejimi (ovozli kiritish, yordamchi) uchun isFinal dan keyin topshiriqni qayta ishga tushirish talab qilinadi. Sikl yarating: finishTask → request = SFSpeechAudioBufferRecognitionRequest() → recognitionTask = recognizer.recognitionTask(with: request). Pauzalarning oldini olish uchun bir topshiriqning oxirini keyingisining boshlanishi bilan qoplashtiring (oldingisi tugashidan 1–2 soniya oldin yangi so‘rovni boshlang). AVFoundation AVAudioSession — bir vaqtda tinglash va yozish uchun .playAndRecord konfiguratsiyasi. iOS 17+ da on-device bilan uzluksiz ASR soatiga 2–5% batareya sarflaydi (A15+).

Audio fayllar va yozuvlarni aniqlash

SFSpeechURLRecognitionRequest — URL orqali audio faylni aniqlash so‘rovi. Formatlarni qo‘llab-quvvatlaydi: .wav (16 kHz, 16 bit, mono), .m4a (AAC), .mp4, .mov. Maksimal uzunlik: ~1 daqiqa cloud uchun, ~2 daqiqa on-device uchun. Uzunroq fayllar uchun — bo‘laklarga ajrating (AVAssetExportSession + trim). SFSpeechURLRecognitionRequest oqimni qo‘llab-quvvatlamaydi (qisman natijalar yo‘q) — faqat yakuniy natija. Fayl bilan qisman natijalar uchun — Audio Buffer Request ga o‘tkazing.

Audio fayl transkripsiyasini olish: SFSpeechRecognizer.recognitionTask(with: request) resultHandler. bestTranscription.formattedString ni ajratib oling. So‘z darajasidagi vaqt belgilari uchun — bestTranscription.segments dan segments (segment.duration, segment.timestamp, segment.substring). Segment bo‘yicha Confidence — ASR ning har bir so‘zdagi ishonchi (filtrlash uchun foydalaning). Muqobil variantlar — past confidence li so‘zlar uchun transcriptionFormatter alternativlari. Bir nechta so‘zlovchili fayllar uchun — SFSpeechRecognitionRequest bir nechta so‘rovlarni qaytarishi mumkin (har bir so‘zlovchi uchun bitta, iOS 17+).

swift
// Audio fayl transkripsiyasi
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("Xato: \(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)
    }
}

Uzoq audio fayllarni bo‘lish: > 1 daqiqali fayllar uchun 30–60 soniyali bo‘laklarga 2–3 soniya qoplama bilan kesing (birlashtirish). AVAssetExportSession + CMTimeRange — bo‘laklarni eksport qilish. Muqobil: UISelectionView (foydalanuvchi segmentni tanlaydi). Transkripsiyalarni birlashtirish: matnlarni konkatenatsiya qilish, qoplama orqali birlashtirish (oldingi bo‘lakning oxirgi 2–3 so‘zi keyingisining birinchi 2–3 so‘zi bilan taqqoslanadi — dublikatlarni olib tashlash). Vosk va Whisper uzun audiolarni tabiiy ravishda qo‘llab-quvvatlaydi, SFSpeechRecognizer — yo‘q. Uzoq transkripsiya uchun Whisper (Core ML) ni tavsiya qilaman — uzunlik cheklovi yo‘q.

On-device va Cloud: rejimlarni taqqoslash

On-device rejimi (iOS 17+): request.requiresOnDeviceRecognition = true. ASR Apple Neural Engine (ANE) da mahalliy bajariladi. Afzalliklari: internetsiz, maxfiylik (audio qurilmadan chiqmaydi), nol xarajat (bepul), past kechikish (RTF 0.3–0.6). Kamchiliklari: past aniqlik (WER 12–14% vs 7–12%), so‘rov uchun 2 daqiqa cheklovi, cheklangan tillar to‘plami (barcha 60 til on-device mavjud emas). On-device modeli qurilmada ~50–100 MB egallaydi, birinchi so‘rovda yuklanadi.

Cloud (iOS 16-): request.requiresOnDeviceRecognition = false (yoki parametr yo‘q). Apple serverlarida ASR — aniqroq (WER 7% EN, 12% RU), ko‘proq tillar, so‘rov uchun 1 daqiqagacha. Internet talab qiladi (WiFi yoki mobil). Apple cloud ASR uchun dasturchidan pul olmaydi (bepul). Cheklovlar: ilova bo‘yicha daqiqada 1 so‘rov (aniqlanmagan), lekin ishlab chiqarish miqyosi uchun Apple cheklashi mumkin. cloud ASR — best-effort sifati, SLAsiz. Korporativ ilovalar uchun Google Cloud ASR yoki Whisper (Core ML) dan foydalaning.

ParametrOn-device (iOS 17+)Cloud (iOS 10+)
Internet talab qiladiYo‘qHa
WER (EN)10–12%7%
WER (RU)12–14%12%
Kechikish (RTF)0.3–0.60.3–0.8 (tarmoq)
Maks. uzunlik2 daqiqa1 daqiqa
MaxfiylikTo‘liqAudio serverga ketadi
BepulHaHa

Combined Recognition (iOS 17+): internet bilan request.requiresOnDeviceRecognition = false (cloud), offline da = true (fallback). Apple avtomatik rejim tanlaydi. Aniqlikka sezgir ilovalar uchun: NetworkMonitor (NWPathMonitor) tekshiring — internet bilan cloud, holda on-device. Maxfiylikka sezgir ilovalar uchun: har doim on-device. Transkripsiya uchun: cloud (aniqroq). Ovozli kiritish uchun: on-device (tezroq). Tavsiya etilgan Combined: 80% cloud, 20% on-device fallback.

iOS ilovalarida SFSpeechRecognizer qo‘llanilishi

Maxsus klaviaturada ovozli kiritish — SFSpeechRecognizer klaviatura kengaytmalariga o‘rnatilgan (iOS 10+). Foydalanuvchi mikrofon tugmasini bosadi — ASR nutqni matnga aylantiradi va matn maydoniga kiritadi. Talablar: qisman natijalar (matnni real vaqtda ko‘rish), on-device (klaviatura internetsiz ishlashi kerak). SFSpeechRecognizer + AVSpeechSynthesizer — ovozli kiritish + ovozli chiqish. iOS 17+ uchun maxsus klaviatura uchun on-device dan foydalaning. Klaviatura kengaytmasining cheklovlari: AVAudioEngine mavjud, lekin vaqt cheklovlari bilan (background execution limited).

Uchrashuv va ma’ruza transkripsiyasi — audio yozib olish va transkripsiya ilovalari (Otter.ai, Rev, Apple Voice Memos). SFSpeechURLRecognitionRequest .m4a faylini qayta ishlaydi. Uzoq yozuvlar uchun (30–60 daqiqa) — Whisper Core ML (uzunlik cheklovi yo‘q). SFSpeechRecognizer segmentlari vaqt belgilari bilan — matnni audio bilan sinxronlash (tinglash vaqtida matnni ajratib ko‘rsatish). Segment bo‘yicha Confidence — ishonchsiz fragmentlarni ko‘rsatish uchun (sariq rangda ajratish). So‘zlovchi diarizatsiyasi (kim gapirdi) uchun — Apple API bermaydi, serverda pyannote-audio + Whisper dan foydalaning.

iOS ilovalarida ovozli buyruqlar — SFSpeechRecognizer + VGS framework (Voice Grammar Services) buyruqlarni bajarish uchun: “sozlamalarni och”, “xabar yubor”, “chiroqni yoq”. Grammatikaga asoslangan aniqlash: SFSpeechRecognitionRequest contextualStrings = buyruqlar massivi. Bu buyruqlarni aniqlash aniqligini 95% gacha oshiradi (85% free-form ga nisbatan). SFSpeechRecognitionTask.cancel — buyruq bajarilgandan keyin to‘xtatish uchun. VGS + SFSpeechRecognizer + Shortcuts — interfeys yozmasdan maxsus ovozli buyruqlar. Foydalanish imkoniyati uchun: Voice Control (o‘rnatilgan) + SFSpeechRecognizer (maxsus buyruqlar).

swift
// Kontekst satrlari bilan ovozli buyruqlar
let request = SFSpeechAudioBufferRecognitionRequest()
request.requiresOnDeviceRecognition = true
request.shouldReportPartialResults = true
request.contextualStrings = ["open contacts", "send message",
                             "show notifications", "chiroqni yoq"]

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

Tibbiy va huquqiy ilovalarda diktant — SFSpeechRecognizer ovoz bilan tuzilgan hujjatlarni yaratish uchun. Domain Adaptation: tibbiy/huquqiy terminlar bilan contextualStrings (500+ ibora). SFSpeechRecognitionRequest.customLmProbability — contextualStrings ta’siri (0.1–1.0). Tibbiy diktant uchun on-device dan foydalaning (bemor ma’lumotlarining maxfiyligi). Tibbiy ma’lumotlar bo‘yicha Whisper fine-tuned — asosiy SFSpeechRecognizer 12% WER o‘rniga 5% WER bilan alternativ. HIPAA muvofiqligi: on-device rejimi (ma’lumotlar qurilmadan chiqmaydi). Qabul transkripsiyasi uchun — SFSpeechURLRecognitionRequest + so‘zlovchi vaqt belgilari bilan segments.

Tez-tez beriladigan savollar

SFSpeechRecognizer iOS ning qaysi versiyasidan qo‘llab-quvvatlanadi?

SFSpeechRecognizer iOS 10, macOS 10.15, watchOS 6 va tvOS 17 dan mavjud. On-device rejimi — iOS 17 dan (requiresOnDeviceRecognition). iOS 10–16 da SFSpeechRecognizer faqat Apple bulut serverlari orqali ishlaydi (internet talab qiladi). Barcha versiyalarda foydalanuvchining aniq ruxsati talab qilinadi (NSMicrophoneUsageDescription + NSSpeechRecognitionUsageDescription). SFSpeechRecognizer.supportedLocales — dinamik ro‘yxat, mintaqa va qurilma modeliga bog‘liq.

SFSpeechRecognizer uzluksiz aniqlash uchun ishlatilishi mumkinmi?

Ha, isFinal dan keyin yangi recognitionTask yaratish orqali. Uzluksiz aniqlash uchun avvalgi topshiriq yakunlangandan keyin qayta ishga tushiring. iOS 17 da on-device uzluksiz ASR soatiga 2–5% batareya sarflaydi (A15+). iOS 16- da uzluksiz ASR internet talab qiladi (daqiqada ~1 MB trafik). Haqiqatan uzluksiz aniqlash (doim tinglaydi) uchun Vosk (offline) yoki Whisper Core ML dan foydalaning. SFSpeechRecognizer iOS 16- da doim yoqilgan rejimni qo‘llab-quvvatlamaydi.

SFSpeechRecognizer da har bir so‘zning confidence ini qanday olish mumkin?

result.bestTranscription.segments dan foydalaning — har bir SFTranscriptionSegment so‘z uchun confidence (Float 0..1) o‘z ichiga oladi. segments[i].substring — so‘z matni. segments[i].confidence — ASR ning bu so‘zdagi ishonchi. Confidence < 0.5 bo‘lgan so‘zlar — ishonchsiz, ularni interfeysda ajratib ko‘rsating. segments[i].timestamp — boshlanish vaqti (TimeInterval). segments[i].duration — davomiyligi. segments[i].alternativeSubstrings — so‘zni aniqlashning muqobil variantlari. Uzoq fayllar uchun segments bo‘ylab o‘tish qo‘lda parsingsiz per-word confidence beradi.

Nega SFSpeechRecognizer 203 xatosini qaytaradi?

203 — SFSpeechError.ErrorCode.opportunistic (cloud ASR uchun internet yo‘q). iOS 16- da yoki internet holda request.requiresOnDeviceRecognition = false bo‘lganda sodir bo‘ladi. Yechim: offline ishlash uchun requiresOnDeviceRecognition = true (iOS 17+) o‘rnating. iOS 16- da NWPathMonitor dan foydalaning — internet bo‘lmaganda “nutqni aniqlash uchun internet talab qilinadi” xabarini ko‘rsating. Muqobil: tarmoq bo‘lmaganda fallback sifatida Vosk (offline, iOS 12+).

SFSpeechRecognizer Whisper Core ML dan qanday farq qiladi?

SFSpeechRecognizer — o‘rnatilgan Apple API, bepul, integratsiyasi sodda, lekin uzunlik cheklovi (1–2 daqiqa), WER 7–14% aniqligi va faqat iOS ekotizimi uchun. Whisper Core ML — ochiq manba (MIT), 99 tilni qo‘llab-quvvatlaydi, WER 6–10%, uzunlik cheklovi yo‘q, lekin qo‘lda integratsiya talab qiladi, Core ML modellari (39M–769M parametr), RTF 0.5–6 (SFSpeechRecognizer dan sekinroq). SFSpeechRecognizer — standart ovozli kiritish uchun. Whisper — yuqori aniqlikdagi uzoq audio transkripsiyasi uchun.

Xulosa

  • SFSpeechRecognizer — o‘rnatilgan Apple ASR API, iOS 10+, 60+ til
  • On-device rejimi — iOS 17+, internetsiz, rus tili uchun WER 12–14%
  • Jonli mikrofon — AVAudioEngine + request.append(buffer) + qisman natijalar
  • Audio fayllar — SFSpeechURLRecognitionRequest, .m4a/.wav, 1–2 daqiqagacha
  • Segments — per-word vaqt belgilari + har bir so‘z uchun confidence (0..1)
  • Bepul — cheklovlarsiz, Apple to‘lovisiz, uchinchi tomon SDKsiz
  • Qo‘llanish — ovozli kiritish, transkripsiya, buyruqlar, foydalanish imkoniyati, diktant

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing