SFSpeechRecognizer — API utama Apple untuk pengenalan suara di ekosistem iOS. Framework ini menyediakan akses ke mesin ASR perangkat melalui Speech.framework, mendukung transkripsi streaming real-time dan pengenalan file audio satu kali. SFSpeechRecognizer tersedia di iOS 10+, macOS 10.15+, watchOS 6+ dan tvOS 17+. Dengan iOS 17 Apple menambahkan mode on-device lengkap yang memungkinkan pengenalan suara tanpa koneksi internet. Menurut Apple Speech Documentation, 2025, SFSpeechRecognizer digunakan di lebih dari 200.000 aplikasi App Store dan memproses jutaan permintaan per hari dengan WER 7% untuk bahasa Inggris.
Poin utama
SFSpeechRecognizer — kelas dari Speech.framework yang mewakili pengenal suara untuk bahasa tertentu. Diinisialisasi dengan Locale (ru_RU, en_US, zh_CN). SFSpeechRecognizer mengelola permintaan pengenalan (SFSpeechRecognitionRequest) dan mengembalikan hasil (SFSpeechRecognitionResult) dengan transkripsi dan metadata. Mendukung dua jenis permintaan: SFSpeechAudioBufferRecognitionRequest (stream audio langsung) dan SFSpeechURLRecognitionRequest (file audio). Keduanya mengembalikan SFTranscription — array varian pengenalan alternatif.
SFSpeechRecognitionResult berisi: bestTranscription (varian terbaik, SFTranscription), transcriptions (semua alternatif), isFinal (akhir/sementara). SFTranscription berisi: formattedString (teks), segments (array SFTranscriptionSegment dengan stempel waktu, confidence, substringRange, alternativeSubstrings). Confidence untuk setiap segmen (0..1) — memungkinkan memfilter fragmen yang tidak dapat diandalkan. segments — fitur utama Speech.framework: memberikan anotasi setiap kata dengan keyakinan.
Arsitektur SFSpeechRecognizer: AVFoundation (menangkap audio) → Audio Buffer → SFSpeechAudioBufferRecognitionRequest → SFSpeechRecognizer (mesin ASR) → SFSpeechRecognitionResult → SFSpeechRecognitionTask (kontrol: cancel, finish, pause). Mesin ASR Apple menggunakan arsitektur hibrida: Conformer (encoder) + RNNT (decoder) untuk on-device, Transducer untuk cloud. Model dioptimalkan untuk Apple Neural Engine (ANE). Di A17 Pro on-device ASR berfungsi dengan RTF 0.3–0.6 (lebih cepat dari real-time).
| Komponen | Tujuan | Versi iOS |
|---|---|---|
| SFSpeechRecognizer | Kelas pengenalan utama | iOS 10+ |
| SFSpeechAudioBufferRecognitionRequest | Stream audio langsung | iOS 10+ |
| SFSpeechURLRecognitionRequest | File audio (.wav, .m4a) | iOS 10+ |
| SFSpeechRecognitionTask | Manajemen permintaan (cancel, finish) | iOS 10+ |
| On-device recognition | ASR offline | iOS 17+ |
| Combined Recognition | Hibrida on-device + cloud | iOS 17+ |
Persyaratan audio: SFSpeechRecognizer menerima LPCM (16 kHz, 16 bit, mono) atau Opus (iOS 17+). AVFoundation dapat menangkap buffer dalam format apa pun, permintaan mengonversi secara otomatis. Panjang minimum: 0,5 detik (deteksi hening). Maksimum: 1 menit (cloud) / 2 menit (on-device) per permintaan. Untuk transkripsi panjang, bagi audio menjadi potongan 30–60 detik dengan tumpang tindih 2–5 detik.
Izin pengguna: SFSpeechRecognizer memerlukan dua izin eksplisit. NSMicrophoneUsageDescription (Privacy — Microphone Usage Description) — untuk akses ke mikrofon. NSSpeechRecognitionUsageDescription (Privacy — Speech Recognition Usage Description) — untuk akses ke pengenalan suara. Keduanya adalah string yang menjelaskan kepada pengguna alasannya. SFSpeechRecognizer.requestAuthorization — memanggil dialog izin. Status: notDetermined, denied, restricted, authorized. Tanpa authorized panggilan recognizer mengembalikan kesalahan 216 (Speech framework error).
Memeriksa ketersediaan: SFSpeechRecognizer.isAvailable — memeriksa apakah ASR tersedia untuk bahasa saat ini. Di iOS 16- isAvailable = false tanpa internet. Di iOS 17+ isAvailable = true untuk bahasa on-device bahkan secara offline. SFSpeechRecognizer.supportedLocales — metode statis untuk mendapatkan daftar bahasa yang didukung perangkat. Disarankan untuk memeriksa isAvailable sebelum setiap mulai (pengguna dapat menonaktifkan Siri/Dikte di pengaturan). Ketersediaan tergantung pada wilayah: bahasa Mandarin — hanya di China, Arab — di UEA.
// Pengaturan 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 tidak tersedia. Aktifkan Siri & Dikte di Pengaturan")
return
}
let request = SFSpeechAudioBufferRecognitionRequest()
request.requiresOnDeviceRecognition = true
Penanganan kesalahan: SFSpeechRecognizer dipanggil dengan completion handler yang dapat mengembalikan Error. Kesalahan utama: 203 — no internet (cloud, iOS 16-); 216 — not authorized (tidak ada izin); 301 — audio error (masalah mikrofon/format); 401 — service unavailable (layanan kelebihan beban); 601 — language unavailable (bahasa tidak didukung di perangkat). Untuk on-device iOS 17+ kesalahan utama: 301 (audio), 601 (language). Selalu tangani completion handler — kesalahan dapat terjadi kapan saja selama perekaman.
Pipeline Live ASR: AVAudioEngine (menangkap dari mikrofon) → installTap (buffer audio) → request.append(buffer) → SFSpeechRecognizer → recognitionTask → delegate/resultHandler. AVAudioEngine memastikan latensi rendah (5–10 ms dari mikrofon ke buffer). SFSpeechRecognitionDelegate: didHypothesizeTranscription (setiap 200–500 ms — teks parsial), didFinishRecognition (hasil akhir). Task.isFinishing — dapat dibatalkan saat pengenalan selesai. Untuk pengenalan berkelanjutan (dikte tanpa batas) — buat task baru setelah isFinal.
SFSpeechRecognitionTaskDelegate: metode opsional. speechRecognitionDidDetectSpeech (mulai bicara) — untuk indikator UI. didHypothesizeTranscription (teks sementara) — untuk ditampilkan saat berbicara. didFinishRecognition (hasil akhir) — untuk menetapkan teks. didFinishSuccessfully (sukses/kesalahan) — untuk penyelesaian. didProcessAudio (buffer audio diproses) — untuk meter RMS. Disarankan untuk mengimplementasikan didHypothesizeTranscription — pengguna melihat teks segera, tanpa penundaan. Transkripsi akhir — untuk disimpan.
// Pengenalan suara langsung
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()
Pengenalan berkelanjutan: untuk mode “dengarkan selalu” (input suara, asisten) diperlukan restart task setelah isFinal. Buat loop: finishTask → request = SFSpeechAudioBufferRecognitionRequest() → recognitionTask = recognizer.recognitionTask(with: request). Untuk menghindari jeda, tumpang tindihkan akhir satu tugas dengan awal berikutnya (mulai permintaan baru 1–2 detik sebelum yang sebelumnya selesai). AVFoundation AVAudioSession — konfigurasi .playAndRecord untuk pemutaran dan perekaman simultan. Di iOS 17+ ASR berkelanjutan dengan on-device mengonsumsi 2–5% baterai per jam (A15+).
SFSpeechURLRecognitionRequest — permintaan untuk pengenalan file audio melalui URL. Mendukung format: .wav (16 kHz, 16 bit, mono), .m4a (AAC), .mp4, .mov. Panjang maksimum: ~1 menit untuk cloud, ~2 menit untuk on-device. Untuk file yang lebih panjang — bagi menjadi potongan (AVAssetExportSession + trim). SFSpeechURLRecognitionRequest tidak mendukung streaming (tanpa hasil parsial) — hanya hasil akhir. Untuk hasil parsial dengan file — konversi ke Audio Buffer Request.
Mendapatkan transkripsi file audio: SFSpeechRecognizer.recognitionTask(with: request) resultHandler. Ekstrak bestTranscription.formattedString. Untuk stempel waktu tingkat kata — segments dari bestTranscription.segments (segment.duration, segment.timestamp, segment.substring). Confidence per segmen — keyakinan ASR pada setiap kata (gunakan untuk pemfilteran). Varian alternatif — alternatif transcriptionFormatter untuk kata dengan confidence rendah. Untuk file dengan banyak pembicara — SFSpeechRecognitionRequest dapat mengembalikan beberapa permintaan (satu per pembicara, iOS 17+).
// Transkripsi file audio
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("Kesalahan: \(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)
}
}
Memotong file audio panjang: untuk file > 1 menit potong menjadi potongan 30–60 detik dengan tumpang tindih 2–3 detik (penggabungan). AVAssetExportSession + CMTimeRange — ekspor potongan. Alternatif: UISelectionView (pengguna memilih segmen). Penggabungan transkripsi: konkatenasi teks, penggabungan melalui tumpang tindih (2–3 kata terakhir dari potongan sebelumnya dibandingkan dengan 2–3 kata pertama berikutnya — hapus duplikat). Vosk dan Whisper mendukung audio panjang secara native, SFSpeechRecognizer — tidak. Untuk transkripsi panjang saya merekomendasikan Whisper (Core ML) — tanpa batasan panjang.
Mode On-device (iOS 17+): request.requiresOnDeviceRecognition = true. ASR dijalankan secara lokal di Apple Neural Engine (ANE). Kelebihan: tanpa internet, privasi (audio tidak meninggalkan perangkat), biaya nol (gratis), latensi rendah (RTF 0.3–0.6). Kekurangan: akurasi lebih rendah (WER 12–14% vs 7–12%), batasan 2 menit per permintaan, set bahasa terbatas (tidak semua 60 bahasa tersedia on-device). Model on-device memakan ~50–100 MB di perangkat, dimuat saat permintaan pertama.
Cloud (iOS 16-): request.requiresOnDeviceRecognition = false (atau tidak ada parameter). ASR di server Apple — lebih akurat (WER 7% EN, 12% RU), lebih banyak bahasa, hingga 1 menit per permintaan. Membutuhkan internet (WiFi atau seluler). Apple tidak membebankan biaya kepada pengembang untuk cloud ASR (gratis). Batasan: 1 permintaan per menit per aplikasi (tidak ditentukan), tetapi untuk skala produksi Apple dapat membatasi. cloud ASR — kualitas best-effort, tanpa SLA. Untuk aplikasi perusahaan gunakan Google Cloud ASR atau Whisper (Core ML).
| Parameter | On-device (iOS 17+) | Cloud (iOS 10+) |
|---|---|---|
| Membutuhkan internet | Tidak | Ya |
| WER (EN) | 10–12% | 7% |
| WER (RU) | 12–14% | 12% |
| Latensi (RTF) | 0.3–0.6 | 0.3–0.8 (+jaringan) |
| Panjang maks. | 2 menit | 1 menit |
| Privasi | Penuh | Audio masuk ke server |
| Gratis | Ya | Ya |
Combined Recognition (iOS 17+): request.requiresOnDeviceRecognition = false dengan internet (cloud), = true saat offline (fallback). Apple secara otomatis memilih mode. Untuk aplikasi yang kritis terhadap akurasi: periksa NetworkMonitor (NWPathMonitor) — dengan internet cloud, tanpa on-device. Untuk aplikasi yang kritis terhadap privasi: selalu on-device. Untuk transkripsi: cloud (lebih akurat). Untuk input suara: on-device (lebih cepat). Combined yang disarankan: 80% cloud, 20% on-device fallback.
Input suara di keyboard kustom — SFSpeechRecognizer tertanam dalam ekstensi keyboard (iOS 10+). Pengguna menekan tombol mikrofon — ASR mentranskripsi suara menjadi teks dan memasukkannya ke bidang teks. Persyaratan: hasil parsial (melihat teks secara real-time), on-device (keyboard harus berfungsi tanpa internet). SFSpeechRecognizer + AVSpeechSynthesizer — input suara + output suara. Untuk keyboard kustom di iOS 17+ gunakan on-device. Keterbatasan ekstensi keyboard: AVAudioEngine tersedia, tetapi dengan batasan waktu (background execution limited).
Transkripsi rapat dan kuliah — aplikasi untuk merekam dan mentranskripsi audio (Otter.ai, Rev, Apple Voice Memos). SFSpeechURLRecognitionRequest memproses file .m4a. Untuk rekaman panjang (30–60 menit) — Whisper Core ML (tanpa batasan panjang). Segmen SFSpeechRecognizer dengan stempel waktu — untuk sinkronisasi teks dengan audio (menyorot teks saat diputar). Confidence per segmen — untuk menampilkan fragmen yang tidak dapat diandalkan (sorotan kuning). Untuk diarisasi pembicara (siapa yang berbicara) — Apple tidak menyediakan API, gunakan pyannote-audio + Whisper di server.
Perintah suara di aplikasi iOS — SFSpeechRecognizer + VGS framework (Voice Grammar Services) untuk menjalankan perintah: “buka pengaturan”, “kirim pesan”, “nyalakan senter”. Pengenalan berbasis tata bahasa: SFSpeechRecognitionRequest contextualStrings = array perintah. Ini meningkatkan akurasi pengenalan perintah hingga 95% (vs 85% free-form). SFSpeechRecognitionTask.cancel — untuk menginterupsi setelah perintah dijalankan. VGS + SFSpeechRecognizer + Shortcuts — perintah suara kustom tanpa menulis antarmuka. Untuk aksesibilitas: Voice Control (tertanam) + SFSpeechRecognizer (perintah kustom).
// Perintah suara dengan string kontekstual
let request = SFSpeechAudioBufferRecognitionRequest()
request.requiresOnDeviceRecognition = true
request.shouldReportPartialResults = true
request.contextualStrings = ["open contacts", "send message",
"show notifications", "nyalakan senter"]
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()
}
}
Mendikte di aplikasi medis dan hukum — SFSpeechRecognizer untuk membuat dokumen terstruktur dengan suara. Domain Adaptation: contextualStrings dengan istilah medis/hukum (500+ frasa). SFSpeechRecognitionRequest.customLmProbability — pengaruh contextualStrings (0.1–1.0). Untuk mendikte medis gunakan on-device (privasi data pasien). Whisper fine-tuned pada data medis — alternatif dengan WER 5% sebagai pengganti 12% dari SFSpeechRecognizer dasar. Kepatuhan HIPAA: mode on-device (data tidak meninggalkan perangkat). Untuk transkripsi kunjungan — SFSpeechURLRecognitionRequest + segments dengan stempel waktu pembicara.
Pertanyaan yang sering diajukan
SFSpeechRecognizer tersedia sejak iOS 10, macOS 10.15, watchOS 6 dan tvOS 17. Mode on-device — sejak iOS 17 (requiresOnDeviceRecognition). Di iOS 10–16 SFSpeechRecognizer hanya bekerja melalui server cloud Apple (membutuhkan internet). Di semua versi diperlukan izin eksplisit pengguna (NSMicrophoneUsageDescription + NSSpeechRecognitionUsageDescription). SFSpeechRecognizer.supportedLocales — daftar dinamis, tergantung wilayah dan model perangkat.
Ya, dengan membuat recognitionTask baru setelah isFinal. Mulai ulang tugas setelah finalisasi sebelumnya untuk pengenalan berkelanjutan. Di iOS 17 ASR berkelanjutan on-device mengonsumsi 2–5% baterai per jam (A15+). Di iOS 16- ASR berkelanjutan membutuhkan internet (konsumsi data ~1 MB/menit). Untuk pengenalan benar-benar berkelanjutan (selalu mendengarkan) gunakan Vosk (offline) atau Whisper Core ML. SFSpeechRecognizer tidak mendukung mode selalu menyala di iOS 16-.
Gunakan result.bestTranscription.segments — setiap SFTranscriptionSegment berisi confidence (Float 0..1) untuk kata. segments[i].substring — teks kata. segments[i].confidence — keyakinan ASR pada kata ini. Kata dengan confidence < 0.5 — tidak dapat diandalkan, sorot di UI. segments[i].timestamp — waktu mulai (TimeInterval). segments[i].duration — durasi. segments[i].alternativeSubstrings — varian pengenalan alternatif kata. Untuk file panjang, iterasi melalui segments memberikan per-word confidence tanpa penguraian manual.
203 — adalah SFSpeechError.ErrorCode.opportunistic (tidak ada internet untuk cloud ASR). Terjadi di iOS 16- atau dengan request.requiresOnDeviceRecognition = false tanpa internet. Solusi: atur requiresOnDeviceRecognition = true (iOS 17+) untuk bekerja offline. Di iOS 16- gunakan NWPathMonitor — saat tidak ada internet tampilkan pesan “untuk pengenalan suara diperlukan internet”. Alternatif: Vosk (offline, iOS 12+) sebagai fallback saat tidak ada jaringan.
SFSpeechRecognizer — API bawaan Apple, gratis, mudah diintegrasikan, tetapi dengan batasan panjang (1–2 menit), akurasi WER 7–14% dan hanya untuk ekosistem iOS. Whisper Core ML — open-source (MIT), mendukung 99 bahasa, WER 6–10%, tanpa batasan panjang, tetapi memerlukan integrasi manual, model Core ML (39M–769M parameter), RTF 0.5–6 (lebih lambat dari SFSpeechRecognizer). SFSpeechRecognizer — untuk input suara standar. Whisper — untuk transkripsi audio panjang dengan akurasi tinggi.
Kesimpulan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga