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 — 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).
| Komponent | Vazifa | iOS Versiyasi |
|---|---|---|
| SFSpeechRecognizer | Asosiy aniqlash sinfi | iOS 10+ |
| SFSpeechAudioBufferRecognitionRequest | Jonli audio oqimi | iOS 10+ |
| SFSpeechURLRecognitionRequest | Audio fayl (.wav, .m4a) | iOS 10+ |
| SFSpeechRecognitionTask | So‘rovni boshqarish (cancel, finish) | iOS 10+ |
| On-device recognition | Offline ASR | iOS 17+ |
| Combined Recognition | On-device + cloud gibrid | iOS 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.
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.
// 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.
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.
// 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+).
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+).
// 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 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.
| Parametr | On-device (iOS 17+) | Cloud (iOS 10+) |
|---|---|---|
| Internet talab qiladi | Yo‘q | Ha |
| WER (EN) | 10–12% | 7% |
| WER (RU) | 12–14% | 12% |
| Kechikish (RTF) | 0.3–0.6 | 0.3–0.8 (tarmoq) |
| Maks. uzunlik | 2 daqiqa | 1 daqiqa |
| Maxfiylik | To‘liq | Audio serverga ketadi |
| Bepul | Ha | Ha |
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.
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).
// 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 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.
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.
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.
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 — 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
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.