SFSpeechRecognizer — nedir, API ve iOS entegrasyonu

Yazar: IT Sectr Yayınlanma: 2026-07-19 Okuma süresi: 10 dk

SFSpeechRecognizer, iOS ekosistemindeki Apple'ın birincil konuşma tanıma API'sidir. Framework, Speech.framework aracılığıyla cihazın ASR motoruna erişim sağlar, gerçek zamanlı akışlı transkripsiyon ve tek seferlik ses dosyası tanımayı destekler. SFSpeechRecognizer, iOS 10+, macOS 10.15+, watchOS 6+ ve tvOS 17+ üzerinde kullanılabilir. iOS 17 ile Apple, internet bağlantısı olmadan konuşma tanımaya olanak tanıyan tam bir cihaz içi mod ekledi. Apple Speech Documentation, 2025'e göre, SFSpeechRecognizer 200.000'den fazla App Store uygulamasında kullanılır ve İngilizce'de %7 WER ile günde milyonlarca isteği işler.

Önemli Noktalar

  • SFSpeechRecognizer — iOS için Apple'ın birincil ASR API'si (iOS 10+)
  • Cihaz içi — iOS 17'den itibaren internetsiz tanıma, Rusça'da WER %12–14
  • Akış — gerçek zamanlı kısmi sonuçlar
  • 60+ dil — Rusça, İngilizce, Çince, Arapça ve daha fazlası
  • Swift Yerel — AVFoundation, Combine, Swift Concurrency ile tam entegrasyon

SFSpeechRecognizer Nedir: Özelliklere Genel Bakış

SFSpeechRecognizer, belirli bir dil için konuşma tanıyıcıyı temsil eden Speech.framework sınıfıdır. Bir Locale (ru_RU, en_US, zh_CN) ile başlatılır. SFSpeechRecognizer, bir tanıma isteğini (SFSpeechRecognitionRequest) yönetir ve transkripsiyonlar ve meta verilerle birlikte bir sonuç (SFSpeechRecognitionResult) döndürür. İki tür isteği destekler: SFSpeechAudioBufferRecognitionRequest (canlı ses akışı) ve SFSpeechURLRecognitionRequest (ses dosyası). Her ikisi de SFTranscription döndürür — alternatif tanıma hipotezlerinden oluşan bir dizi.

SFSpeechRecognitionResult şunları içerir: bestTranscription (en iyi hipotez, SFTranscription), transcriptions (tüm alternatifler), isFinal (son/ara). SFTranscription şunları içerir: formattedString (metin), segments (zaman damgaları, güven, substringRange, alternativeSubstrings içeren SFTranscriptionSegment dizisi). Her segment için güven (0..1) — güvenilmez parçaları filtrelemeye olanak tanır. Segmentler, Speech.framework'in önemli bir özelliğidir: güven puanlarıyla kelime bazında işaretleme sağlarlar.

SFSpeechRecognizer Mimarisi: AVFoundation (ses yakalama) → Audio Buffer → SFSpeechAudioBufferRecognitionRequest → SFSpeechRecognizer (ASR motoru) → SFSpeechRecognitionResult → SFSpeechRecognitionTask (kontrol: cancel, finish, pause). Apple'ın ASR motoru hibrit bir mimari kullanır: cihaz içi için Conformer (kodlayıcı) + RNNT (kod çözücü), bulut için Transducer. Modeller Apple Neural Engine (ANE) için optimize edilmiştir. A17 Pro'da, cihaz içi ASR, RTF 0.3–0.6 (gerçek zamandan daha hızlı) ile çalışır.

BileşenAmaçiOS Sürümü
SFSpeechRecognizerAna tanıma sınıfıiOS 10+
SFSpeechAudioBufferRecognitionRequestCanlı ses akışıiOS 10+
SFSpeechURLRecognitionRequestSes dosyası (.wav, .m4a)iOS 10+
SFSpeechRecognitionTaskİstek yönetimi (cancel, finish)iOS 10+
Cihaz içi tanımaÇevrimdışı ASRiOS 17+
Birleşik TanımaHibrit cihaz içi + bulutiOS 17+

Ses Gereksinimleri: SFSpeechRecognizer, LPCM (16 kHz, 16 bit, mono) veya Opus'u (iOS 17+) kabul eder. AVFoundation herhangi bir formattaki arabellekleri yakalayabilir, istek otomatik olarak dönüştürür. Minimum uzunluk: 0.5 saniye (sessizlik algılama). Maksimum: istek başına 1 dakika (bulut) / 2 dakika (cihaz içi). Uzun transkripsiyon için, sesi 2–5 saniye bindirmeli 30–60 saniyelik parçalara bölün.

SFSpeechRecognizer Kurulumu ve İzinler

Kullanıcı İzinleri: SFSpeechRecognizer iki açık izin gerektirir. NSMicrophoneUsageDescription (Privacy — Microphone Usage Description) — mikrofon erişimi için. NSSpeechRecognitionUsageDescription (Privacy — Speech Recognition Usage Description) — konuşma tanıma erişimi için. Her ikisi de kullanıcıya nedeni açıklayan dizelerdir. SFSpeechRecognizer.requestAuthorization — izin diyaloğunu gösterir. Durumlar: notDetermined, denied, restricted, authorized. authorized durumu olmadan, recognizer'ı çağırmak 216 hatasını (Speech framework error) döndürür.

Kullanılabilirlik Kontrolü: SFSpeechRecognizer.isAvailable — geçerli dil için ASR'nin kullanılabilir olup olmadığını kontrol eder. iOS 16-'da, isAvailable = false (internet yok). iOS 17+'da, cihaz içi diller için çevrimdışıyken bile isAvailable = true. SFSpeechRecognizer.supportedLocales — cihaz tarafından desteklenen dillerin listesini almak için statik bir yöntem. Her başlatmadan önce isAvailable'ın kontrol edilmesi önerilir (kullanıcı ayarlardan Siri/Dikteyi devre dışı bırakabilir). Kullanılabilirlik bölgeye bağlıdır: Çince — yalnızca Çin'de, Arapça — BAE'de.

swift
// SFSpeechRecognizer Kurulumu
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 kullanılamıyor. Ayarlardan Siri ve Dikte'yi etkinleştirin")
    return
}

let request = SFSpeechAudioBufferRecognitionRequest()
request.requiresOnDeviceRecognition = true

Hata Yönetimi: SFSpeechRecognizer, bir Hata döndürebilen bir tamamlama işleyicisi ile çağrılır. Ana hatalar: 203 — internet yok (bulut, iOS 16-); 216 — yetkili değil (izin yok); 301 — ses hatası (mikrofon/biçim sorunu); 401 — hizmet kullanılamıyor (hizmet aşırı yüklü); 601 — dil kullanılamıyor (dil cihazda desteklenmiyor). Cihaz içi iOS 17+ için ana hatalar: 301 (ses), 601 (dil). Tamamlama işleyicisini her zaman işleyin — kayıt sırasında herhangi bir zamanda hatalar oluşabilir.

Mikrofondan Canlı Konuşma Tanıma

Canlı ASR Hattı: AVAudioEngine (mikrofon yakalama) → installTap (ses arabelleği) → request.append(buffer) → SFSpeechRecognizer → recognitionTask → delegate/resultHandler. AVAudioEngine düşük gecikme süresi (mikrofondan arabelleğe 5–10 ms) sağlar. SFSpeechRecognitionDelegate: didHypothesizeTranscription (her 200–500 ms'de bir — kısmi metin), didFinishRecognition (son sonuç). Task.isFinishing — tanıma tamamlandığında iptal edebilir. Sürekli tanıma (sonsuz dikte) için, isFinal'dan sonra yeni bir görev oluşturun.

SFSpeechRecognitionTaskDelegate: isteğe bağlı yöntemler. speechRecognitionDidDetectSpeech (konuşma başlangıcı) — kullanıcı arayüzü göstergesi için. didHypothesizeTranscription (ara metin) — konuşurken görüntüleme için. didFinishRecognition (son sonuç) — metni sonlandırmak için. didFinishSuccessfully (başarı/hata) — tamamlama için. didProcessAudio (ses arabelleği işlendi) — RMS ölçer için. didHypothesizeTranscription'ın uygulanması önerilir — kullanıcı metni gecikmesiz hemen görür. Son transkripsiyon kaydetmek içindir.

swift
// Canlı konuşma tanıma
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()

Sürekli Tanıma: “her zaman dinle” modu (ses girişi, asistan) için, isFinal'dan sonra görevi yeniden başlatmak gerekir. Bir döngü oluşturun: finishTask → request = SFSpeechAudioBufferRecognitionRequest() → recognitionTask = recognizer.recognitionTask(with: request). Boşlukları önlemek için, bir görevin sonunu bir sonrakinin başlangıcıyla örtüştürün (önceki bitmeden 1–2 saniye önce yeni bir istek başlatın). AVFoundation AVAudioSession — eşzamanlı oynatma ve kayıt için .playAndRecord yapılandırın. iOS 17+'da, cihaz içi ile sürekli ASR, saatte %2–5 pil tüketir (A15+).

Ses Dosyası ve Kayıt Tanıma

SFSpeechURLRecognitionRequest — URL yoluyla bir ses dosyasını tanımak için bir istek. Desteklenen biçimler: .wav (16 kHz, 16 bit, mono), .m4a (AAC), .mp4, .mov. Maksimum uzunluk: bulut için ~1 dakika, cihaz içi için ~2 dakika. Daha uzun dosyalar için parçalara bölün (AVAssetExportSession + trim). SFSpeechURLRecognitionRequest akışı desteklemez (kısmi sonuç yok) — yalnızca nihai sonuç. Bir dosyayla kısmi sonuçlar için bir Ses Arabelleği İsteğine dönüştürün.

Ses Dosyası Transkripsiyonu Alma: SFSpeechRecognizer.recognitionTask(with: request) resultHandler. bestTranscription.formattedString'i çıkarın. Kelime düzeyinde zaman damgaları için — bestTranscription.segments'ten segments (segment.duration, segment.timestamp, segment.substring). Segment başına güven — her kelime için ASR güveni (filtreleme için kullanın). Alternatif hipotezler — düşük güvenli kelimeler için transcriptionFormatter alternatifleri. Birden çok konuşmacılı dosyalar için, SFSpeechRecognitionRequest birden çok istek döndürebilir (konuşmacı başına bir, iOS 17+).

swift
// Ses dosyası transkripsiyonu
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("Hata: \(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)
    }
}

Uzun Ses Dosyalarını Bölme: 1 dakikadan uzun dosyalar için, 2–3 saniye bindirmeli (birleştirme) 30–60 saniyelik parçalara bölün. AVAssetExportSession + CMTimeRange — parçaları dışa aktarın. Alternatif: UISelectionView (kullanıcı bir segment seçer). Transkripsiyon birleştirme: metinleri birleştirin, bindirme ile birleştirin (önceki parçanın son 2–3 kelimesi sonraki parçanın ilk 2–3 kelimesiyle karşılaştırılır — yinelenenleri kaldırın). Vosk ve Whisper uzun sesi yerel olarak destekler, SFSpeechRecognizer desteklemez. Uzun transkripsiyon için Whisper'ı (Core ML) öneririm — uzunluk sınırı yok.

Cihaz İçi ve Bulut: Mod Karşılaştırması

Cihaz İçi Mod (iOS 17+): request.requiresOnDeviceRecognition = true. ASR, Apple Neural Engine (ANE) üzerinde yerel olarak çalışır. Avantajlar: internet gerektirmez, gizlilik (ses cihazdan asla ayrılmaz), sıfır maliyet (ücretsiz), düşük gecikme (RTF 0.3–0.6). Dezavantajlar: daha düşük doğruluk (WER %12–14'e karşı %7–12), istek başına 2 dakika sınırı, sınırlı dil seti (60 dilin tümü cihaz içi kullanılamaz). Cihaz içi model, cihazda ~50–100 MB yer kaplar ve ilk istekte indirilir.

Bulut (iOS 16-): request.requiresOnDeviceRecognition = false (veya parametre yok). Apple sunucularında ASR — daha doğru (WER %7 EN, %12 RU), daha fazla dil, istek başına 1 dakikaya kadar. İnternet (WiFi veya hücresel) gerektirir. Apple, bulut ASR için geliştiricilerden ücret almaz (ücretsiz). Sınırlar: uygulama başına dakikada 1 istek (belirtilmemiş), ancak Apple üretim ölçeğinde sınırlayabilir. Bulut ASR, SLA olmadan en iyi çaba kalitesi sağlar. Kurumsal uygulamalar için Google Cloud ASR veya Whisper (Core ML) kullanın.

ParametreCihaz İçi (iOS 17+)Bulut (iOS 10+)
İnternet gerektirirHayırEvet
WER (EN)%10–12%7
WER (RU)%12–14%12
Gecikme (RTF)0.3–0.60.3–0.8 (+ağ)
Maks. uzunluk2 dakika1 dakika
GizlilikTamSes cihazdan ayrılır
ÜcretsizEvetEvet

Birleşik Tanıma (iOS 17+): request.requiresOnDeviceRecognition = false internet varken (bulut), = true çevrimdışıyken (yedek). Apple otomatik olarak modu seçer. Doğruluk açısından kritik uygulamalar için: NetworkMonitor'u (NWPathMonitor) kontrol edin — internet varken bulut, yokken cihaz içi kullanın. Gizlilik açısından kritik uygulamalar için: her zaman cihaz içi. Transkripsiyon için: bulut (daha doğru). Ses girişi için: cihaz içi (daha hızlı). Birleşik önerilir: %80 bulut, %20 cihaz içi yedek.

iOS Uygulamalarında SFSpeechRecognizer Kullanımı

Özel Klavyede Ses Girişi — SFSpeechRecognizer, klavye uzantılarına (iOS 10+) entegre edilmiştir. Kullanıcı mikrofon düğmesine basar, ASR konuşmayı metne dönüştürür ve metin alanına ekler. Gereksinimler: kısmi sonuçlar (metni gerçek zamanlı görme), cihaz içi (klavye internetsiz çalışmalıdır). SFSpeechRecognizer + AVSpeechSynthesizer — ses girişi + ses çıkışı. iOS 17+'da özel klavyeler için cihaz içi kullanın. Klavye uzantısı sınırlamaları: AVAudioEngine kullanılabilir ancak zaman kısıtlamaları vardır (arka plan yürütme sınırlı).

Toplantı ve Ders Transkripsiyonu — ses kaydeden ve yazıya döken uygulamalar (Otter.ai, Rev, Apple Voice Memos). SFSpeechURLRecognitionRequest .m4a dosyalarını işler. Uzun kayıtlar (30–60 dakika) için — Whisper Core ML (uzunluk sınırı yok). Zaman damgalı SFSpeechRecognizer segmentleri — metni sesle senkronize etmek için (oynatma sırasında metin vurgulama). Segment başına güven — güvenilmez parçaları görüntülemek için (sarı vurgulama). Konuşmacı diyarizasyonu (kimin konuştuğu) için — Apple API sağlamaz, sunucuda pyannote-audio + Whisper kullanın.

iOS Uygulamalarında Ses Komutları — SFSpeechRecognizer + VGS framework (Voice Grammar Services) ile komutları yürütme: “ayarları aç”, “mesaj gönder”, “ışığı aç”. Dil bilgisi tabanlı tanıma: SFSpeechRecognitionRequest contextualStrings = komut dizisi. Bu, komut tanıma doğruluğunu %95'e yükseltir (serbest biçimde %85'e karşı). SFSpeechRecognitionTask.cancel — komut yürütüldükten sonra kesmek için. VGS + SFSpeechRecognizer + Shortcuts — kullanıcı arayüzü yazmadan özel ses komutları. Erişilebilirlik için: Voice Control (yerleşik) + SFSpeechRecognizer (özel komutlar).

swift
// Bağlamsal dizelerle ses komutları
let request = SFSpeechAudioBufferRecognitionRequest()
request.requiresOnDeviceRecognition = true
request.shouldReportPartialResults = true
request.contextualStrings = ["open contacts", "send message",
                             "show notifications", "el fenerini aç"]

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

Tıbbi ve Hukuki Uygulamalarda Dikte — SFSpeechRecognizer ile sesle yapılandırılmış belgeler oluşturma. Alan Uyarlaması: tıbbi/hukuki terimlerle contextualStrings (500+ ifade). SFSpeechRecognitionRequest.customLmProbability — contextualStrings etkisi (0.1–1.0). Tıbbi dikte için cihaz içi kullanın (hasta verisi gizliliği). Tıbbi verilerde ince ayarlanmış Whisper — temel SFSpeechRecognizer'ın %12'si yerine %5 WER ile alternatif. HIPAA uyumluluğu: cihaz içi mod (veri cihazdan asla ayrılmaz). Randevu transkripsiyonu için — SFSpeechURLRecognitionRequest + konuşmacı zaman damgalarıyla segments.

Sıkça Sorulan Sorular

SFSpeechRecognizer hangi iOS sürümünden itibaren destekleniyor?

SFSpeechRecognizer, iOS 10, macOS 10.15, watchOS 6 ve tvOS 17'den beri kullanılabilir. Cihaz içi mod iOS 17'den itibaren (requiresOnDeviceRecognition). iOS 10–16'da SFSpeechRecognizer yalnızca Apple'ın bulut sunucuları üzerinden çalışır (internet gerekir). Tüm sürümler açık kullanıcı izni gerektirir (NSMicrophoneUsageDescription + NSSpeechRecognitionUsageDescription). SFSpeechRecognizer.supportedLocales — dinamik liste, bölgeye ve cihaz modeline bağlıdır.

SFSpeechRecognizer sürekli tanıma için kullanılabilir mi?

Evet, isFinal'dan sonra yeni recognitionTask oluşturarak. Sürekli tanıma için önceki görev tamamlandıktan sonra görevi yeniden başlatın. iOS 17'de cihaz içi sürekli ASR saatte %2–5 pil tüketir (A15+). iOS 16-'da sürekli ASR internet gerektirir (trafik ~1 MB/dakika). Gerçekten sürekli tanıma (her zaman dinleme) için Vosk (çevrimdışı) veya Whisper Core ML kullanın. SFSpeechRecognizer, iOS 16-'da her zaman açık modunu desteklemez.

SFSpeechRecognizer'da her kelimenin güveni nasıl alınır?

result.bestTranscription.segments kullanın — her SFTranscriptionSegment, kelime için confidence (Float 0..1) içerir. segments[i].substring — kelimenin metni. segments[i].confidence — o kelime için ASR güveni. confidence < 0.5 olan kelimeler güvenilmezdir — bunları kullanıcı arayüzünde vurgulayın. segments[i].timestamp — başlangıç zamanı (TimeInterval). segments[i].duration — süre. segments[i].alternativeSubstrings — kelime için alternatif tanıma hipotezleri. Uzun dosyalar için segments üzerinde yineleme, manuel ayrıştırma olmadan kelime başına güven sağlar.

SFSpeechRecognizer neden 203 hatasını döndürüyor?

203, SFSpeechError.ErrorCode.opportunistic'tir (bulut ASR için internet yok). iOS 16-'da veya request.requiresOnDeviceRecognition = false iken internetsiz oluşur. Çözüm: çevrimdışı çalışma için requiresOnDeviceRecognition = true (iOS 17+) olarak ayarlayın. iOS 16-'da NWPathMonitor kullanın — internet olmadığında “konuşma tanıma bir internet bağlantısı gerektirir” mesajını görüntüleyin. Alternatif: Ağ kullanılamadığında yedek olarak Vosk (çevrimdışı, iOS 12+) kullanın.

SFSpeechRecognizer, Whisper Core ML'den nasıl farklıdır?

SFSpeechRecognizer — Apple'ın yerleşik API'si, ücretsiz, entegrasyonu kolay, ancak uzunluk sınırlamaları (1–2 dakika), WER doğruluğu %7–14 ve yalnızca iOS ekosistemi için. Whisper Core ML — açık kaynak (MIT), 99 dili destekler, WER %6–10, uzunluk sınırı yok, ancak manuel entegrasyon, Core ML modelleri (39M–769M parametre), RTF 0.5–6 (SFSpeechRecognizer'dan daha yavaş) gerektirir. SFSpeechRecognizer — standart ses girişi için. Whisper — yüksek doğruluklu uzun ses transkripsiyonu için.

Özet

  • SFSpeechRecognizer — yerleşik Apple ASR API'si, iOS 10+, 60+ dil
  • Cihaz içi mod — iOS 17+, internet yok, Rusça'da WER %12–14
  • Canlı mikrofon — AVAudioEngine + request.append(buffer) + kısmi sonuçlar
  • Ses dosyaları — SFSpeechURLRecognitionRequest, .m4a/.wav, 1–2 dakikaya kadar
  • Segmentler — kelime başına zaman damgası + güven (0..1)
  • Ücretsiz — sınır yok, Apple ücreti yok, üçüncü taraf SDK yok
  • Kullanım — ses girişi, transkripsiyon, komutlar, erişilebilirlik, dikte

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun