SFSpeechRecognizer — ang pangunahing API ng Apple para sa pagkilala ng pagsasalita sa iOS ecosystem. Ang framework ay nagbibigay ng access sa ASR engine ng device sa pamamagitan ng Speech.framework, sumusuporta sa real-time streaming transcription at isang beses na pagkilala ng mga audio file. Ang SFSpeechRecognizer ay available sa iOS 10+, macOS 10.15+, watchOS 6+ at tvOS 17+. Sa iOS 17 ay nagdagdag ang Apple ng kumpletong on-device mode na nagpapahintulot sa pagkilala ng pagsasalita nang walang koneksyon sa internet. Ayon sa Apple Speech Documentation, 2025, ang SFSpeechRecognizer ay ginagamit sa higit sa 200,000 App Store apps at nagpoproseso ng milyun-milyong kahilingan bawat araw na may WER 7% para sa Ingles.
Mga pangunahing punto
SFSpeechRecognizer — isang klase mula sa Speech.framework na kumakatawan sa isang speech recognizer para sa isang partikular na wika. Ito ay sinisimulan gamit ang Locale (ru_RU, en_US, zh_CN). Ang SFSpeechRecognizer ay namamahala ng kahilingan sa pagkilala (SFSpeechRecognitionRequest) at nagbabalik ng resulta (SFSpeechRecognitionResult) na may mga transcription at metadata. Sumusuporta sa dalawang uri ng kahilingan: SFSpeechAudioBufferRecognitionRequest (live audio stream) at SFSpeechURLRecognitionRequest (audio file). Pareho silang nagbabalik ng SFTranscription — isang array ng mga alternatibong variant ng pagkilala.
SFSpeechRecognitionResult ay naglalaman ng: bestTranscription (pinakamahusay na variant, SFTranscription), transcriptions (lahat ng alternatibo), isFinal (pangwakas/pansamantala). SFTranscription ay naglalaman ng: formattedString (teksto), segments (array ng SFTranscriptionSegment na may time stamps, confidence, substringRange, alternativeSubstrings). Confidence para sa bawat segment (0..1) — nagpapahintulot sa pag-filter ng hindi mapagkakatiwalaang fragments. segments — pangunahing feature ng Speech.framework: nagbibigay ng annotation ng bawat salita na may kumpiyansa.
Arkitektura ng SFSpeechRecognizer: AVFoundation (pag-capture ng audio) → Audio Buffer → SFSpeechAudioBufferRecognitionRequest → SFSpeechRecognizer (ASR engine) → SFSpeechRecognitionResult → SFSpeechRecognitionTask (kontrol: cancel, finish, pause). Ang ASR engine ng Apple ay gumagamit ng hybrid architecture: Conformer (encoder) + RNNT (decoder) para sa on-device, Transducer para sa cloud. Ang mga modelo ay na-optimize para sa Apple Neural Engine (ANE). Sa A17 Pro ang on-device ASR ay gumagana sa RTF 0.3–0.6 (mas mabilis kaysa real-time).
| Component | Layunin | iOS Bersyon |
|---|---|---|
| SFSpeechRecognizer | Pangunahing klase ng pagkilala | iOS 10+ |
| SFSpeechAudioBufferRecognitionRequest | Live audio stream | iOS 10+ |
| SFSpeechURLRecognitionRequest | Audio file (.wav, .m4a) | iOS 10+ |
| SFSpeechRecognitionTask | Pamamahala ng kahilingan (cancel, finish) | iOS 10+ |
| On-device recognition | Offline ASR | iOS 17+ |
| Combined Recognition | Hybrid on-device + cloud | iOS 17+ |
Mga kinakailangan sa audio: Ang SFSpeechRecognizer ay tumatanggap ng LPCM (16 kHz, 16 bit, mono) o Opus (iOS 17+). Ang AVFoundation ay maaaring mag-capture ng buffer sa anumang format, awtomatikong nagko-convert ang kahilingan. Minimum na haba: 0.5 segundo (deteksyon ng katahimikan). Maximum: 1 minuto (cloud) / 2 minuto (on-device) bawat kahilingan. Para sa mahabang transcription, hatiin ang audio sa mga piraso ng 30–60 segundo na may overlap na 2–5 segundo.
Mga pahintulot ng user: Ang SFSpeechRecognizer ay nangangailangan ng dalawang tahasang pahintulot. NSMicrophoneUsageDescription (Privacy — Microphone Usage Description) — para sa access sa mikropono. NSSpeechRecognitionUsageDescription (Privacy — Speech Recognition Usage Description) — para sa access sa pagkilala ng pagsasalita. Pareho ay mga string na nagpapaliwanag sa user kung bakit. SFSpeechRecognizer.requestAuthorization — tawag sa dialog ng pahintulot. Mga status: notDetermined, denied, restricted, authorized. Kung walang authorized, ang recognizer call ay nagbabalik ng error 216 (Speech framework error).
Pagsusuri ng availability: SFSpeechRecognizer.isAvailable — sinusuri kung ang ASR ay available para sa kasalukuyang wika. Sa iOS 16- isAvailable = false nang walang internet. Sa iOS 17+ isAvailable = true para sa mga on-device na wika kahit offline. SFSpeechRecognizer.supportedLocales — static na pamamaraan para makuha ang listahan ng mga sinusuportahang wika ng device. Inirerekomenda na suriin ang isAvailable bago ang bawat pagsisimula (maaaring i-off ng user ang Siri/Dictation sa mga setting). Ang availability ay depende sa rehiyon: Chinese — sa China lamang, Arabic — sa UAE.
// Setup ng 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("Hindi available ang ASR. I-enable ang Siri & Dictation sa Settings")
return
}
let request = SFSpeechAudioBufferRecognitionRequest()
request.requiresOnDeviceRecognition = true
Panghawak ng error: Ang SFSpeechRecognizer ay tinatawag na may completion handler na maaaring magbalik ng Error. Mga pangunahing error: 203 — no internet (cloud, iOS 16-); 216 — not authorized (walang pahintulot); 301 — audio error (problema sa mikropono/format); 401 — service unavailable (serbisyo overburdened); 601 — language unavailable (wika hindi suportado sa device). Para sa on-device iOS 17+ pangunahing error: 301 (audio), 601 (language). Palaging pangasiwaan ang completion handler — ang mga error ay maaaring mangyari anumang oras sa pagre-record.
Live ASR pipeline: AVAudioEngine (pag-capture mula sa mikropono) → installTap (audio buffer) → request.append(buffer) → SFSpeechRecognizer → recognitionTask → delegate/resultHandler. Ang AVAudioEngine ay nagtitiyak ng mababang latency (5–10 ms mula sa mikropono hanggang buffer). SFSpeechRecognitionDelegate: didHypothesizeTranscription (bawat 200–500 ms — bahagyang teksto), didFinishRecognition (huling resulta). Task.isFinishing — maaaring kanselahin kapag natapos na ang pagkilala. Para sa tuluy-tuloy na pagkilala (walang katapusang dikta) — gumawa ng bagong task pagkatapos ng isFinal.
SFSpeechRecognitionTaskDelegate: mga opsyonal na pamamaraan. speechRecognitionDidDetectSpeech (simula ng pagsasalita) — para sa UI indicator. didHypothesizeTranscription (pansamantalang teksto) — para ipakita habang nagsasalita. didFinishRecognition (huling resulta) — para sa pag-aayos ng teksto. didFinishSuccessfully (tagumpay/error) — para sa pagkumpleto. didProcessAudio (audio buffer naproseso) — para sa RMS meter. Inirerekomenda na ipatupad ang didHypothesizeTranscription — nakikita agad ng user ang teksto, nang walang pagkaantala. Panghuling transcription — para sa pag-save.
// Live speech recognition
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()
Tuluy-tuloy na pagkilala: para sa mode na “pakinggan palagi” (voice input, assistant) kinakailangan ang pag-restart ng task pagkatapos ng isFinal. Gumawa ng loop: finishTask → request = SFSpeechAudioBufferRecognitionRequest() → recognitionTask = recognizer.recognitionTask(with: request). Upang maiwasan ang mga pause, i-overlap ang dulo ng isang task sa simula ng susunod (magsimula ng bagong kahilingan 1–2 segundo bago matapos ang nauna). AVFoundation AVAudioSession — configuration .playAndRecord para sa sabay na pag-playback at pag-record. Sa iOS 17+ ang tuluy-tuloy na ASR na may on-device ay kumokonsumo ng 2–5% na baterya bawat oras (A15+).
SFSpeechURLRecognitionRequest — kahilingan para sa pagkilala ng audio file sa pamamagitan ng URL. Sumusuporta sa mga format: .wav (16 kHz, 16 bit, mono), .m4a (AAC), .mp4, .mov. Maximum na haba: ~1 minuto para sa cloud, ~2 minuto para sa on-device. Para sa mas mahabang file — hatiin sa mga piraso (AVAssetExportSession + trim). Ang SFSpeechURLRecognitionRequest ay hindi sumusuporta sa streaming (walang bahagyang resulta) — tanging huling resulta. Para sa bahagyang resulta gamit ang file — i-convert sa Audio Buffer Request.
Pagkuha ng transcription ng audio file: SFSpeechRecognizer.recognitionTask(with: request) resultHandler. I-extract ang bestTranscription.formattedString. Para sa time stamps sa antas ng salita — segments mula sa bestTranscription.segments (segment.duration, segment.timestamp, segment.substring). Confidence bawat segment — kumpiyansa ng ASR sa bawat salita (gamitin para sa pag-filter). Mga alternatibong variant — mga alternatibo ng transcriptionFormatter para sa mga salitang may mababang confidence. Para sa mga file na may maraming nagsasalita — ang SFSpeechRecognitionRequest ay maaaring magbalik ng maraming kahilingan (isa bawat nagsasalita, iOS 17+).
// Transcription ng audio file
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: \(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)
}
}
Pagputol ng mahabang audio file: para sa mga file > 1 minuto, gupitin sa mga piraso ng 30–60 segundo na may overlap na 2–3 segundo (pagsasama). AVAssetExportSession + CMTimeRange — pag-export ng mga piraso. Alternatibo: UISelectionView (pumili ang user ng segment). Pagsasama ng mga transcription: pagsasama-sama ng mga teksto, pagsasama sa pamamagitan ng overlap (huling 2–3 salita ng nakaraang piraso ay ikinukumpara sa unang 2–3 salita ng susunod — alisin ang mga duplicate). Ang Vosk at Whisper ay sumusuporta sa mahabang audio nang native, ang SFSpeechRecognizer — hindi. Para sa mahabang transcription inirerekomenda ko ang Whisper (Core ML) — walang limitasyon sa haba.
On-device mode (iOS 17+): request.requiresOnDeviceRecognition = true. Ang ASR ay isinasagawa nang lokal sa Apple Neural Engine (ANE). Mga kalamangan: walang internet, privacy (audio hindi umaalis sa device), zero cost (libre), mababang latency (RTF 0.3–0.6). Mga kahinaan: mas mababang accuracy (WER 12–14% vs 7–12%), limitasyon 2 minuto bawat kahilingan, limitadong set ng wika (hindi lahat ng 60 wika ay available on-device). Ang on-device na modelo ay kumokonsumo ng ~50–100 MB sa device, nilo-load sa unang kahilingan.
Cloud (iOS 16-): request.requiresOnDeviceRecognition = false (o walang parameter). ASR sa mga server ng Apple — mas tumpak (WER 7% EN, 12% RU), mas maraming wika, hanggang 1 minuto bawat kahilingan. Nangangailangan ng internet (WiFi o cellular). Hindi naniningil ang Apple sa developer para sa cloud ASR (libre). Mga limitasyon: 1 kahilingan bawat minuto bawat app (hindi tinukoy), ngunit para sa production scale ay maaaring limitahan ng Apple. cloud ASR — best-effort na kalidad, walang SLA. Para sa corporate apps gamitin ang Google Cloud ASR o Whisper (Core ML).
| Parameter | On-device (iOS 17+) | Cloud (iOS 10+) |
|---|---|---|
| Nangangailangan ng internet | Hindi | Oo |
| WER (EN) | 10–12% | 7% |
| WER (RU) | 12–14% | 12% |
| Latency (RTF) | 0.3–0.6 | 0.3–0.8 (+network) |
| Max. haba | 2 minuto | 1 minuto |
| Privacy | Ganap | Audio napupunta sa server |
| Libre | Oo | Oo |
Combined Recognition (iOS 17+): request.requiresOnDeviceRecognition = false na may internet (cloud), = true kapag offline (fallback). Awtomatikong pumili ng mode ang Apple. Para sa mga app na kritikal sa accuracy: suriin ang NetworkMonitor (NWPathMonitor) — may internet cloud, wala nito on-device. Para sa mga app na kritikal sa privacy: palaging on-device. Para sa transcription: cloud (mas tumpak). Para sa voice input: on-device (mas mabilis). Inirerekomendang Combined: 80% cloud, 20% on-device fallback.
Voice input sa custom na keyboard — ang SFSpeechRecognizer ay naka-embed sa mga extension ng keyboard (iOS 10+). Pinipindot ng user ang microfono button — tina-transcribe ng ASR ang pagsasalita sa teksto at ipinasok ito sa text field. Mga kinakailangan: bahagyang resulta (makita ang teksto sa real-time), on-device (ang keyboard ay dapat gumana nang walang internet). SFSpeechRecognizer + AVSpeechSynthesizer — voice input + voice output. Para sa custom na keyboard sa iOS 17+ gamitin ang on-device. Mga limitasyon ng keyboard extension: available ang AVAudioEngine, ngunit may mga limitasyon sa oras (background execution limited).
Transcription ng mga pagpupulong at lektura — mga app para sa pag-record at pag-transcribe ng audio (Otter.ai, Rev, Apple Voice Memos). Pinoproseso ng SFSpeechURLRecognitionRequest ang .m4a file. Para sa mahabang recording (30–60 minuto) — Whisper Core ML (walang limitasyon sa haba). Mga segment ng SFSpeechRecognizer na may time stamps — para sa pag-synchronize ng teksto sa audio (pag-highlight ng teksto habang nagpe-play). Confidence bawat segment — para sa pagpapakita ng hindi mapagkakatiwalaang fragments (dilaw na highlight). Para sa speaker diarization (sino ang nagsalita) — hindi nagbibigay ang Apple ng API, gamitin ang pyannote-audio + Whisper sa server.
Mga voice command sa iOS apps — SFSpeechRecognizer + VGS framework (Voice Grammar Services) para sa pagpapatupad ng mga command: “buksan ang mga setting”, “magpadala ng mensahe”, “buksan ang ilaw”. Pagkilala batay sa gramatika: SFSpeechRecognitionRequest contextualStrings = array ng mga command. Pinapataas nito ang accuracy ng pagkilala ng command hanggang 95% (vs 85% free-form). SFSpeechRecognitionTask.cancel — para sa pagputol pagkatapos isagawa ang command. VGS + SFSpeechRecognizer + Shortcuts — custom na voice command nang walang pagsusulat ng interface. Para sa accessibility: Voice Control (built-in) + SFSpeechRecognizer (custom na command).
// Mga voice command na may contextual strings
let request = SFSpeechAudioBufferRecognitionRequest()
request.requiresOnDeviceRecognition = true
request.shouldReportPartialResults = true
request.contextualStrings = ["open contacts", "send message",
"show notifications", "buksan ang flashlight"]
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()
}
}
Pagdidikta sa medikal at legal na apps — SFSpeechRecognizer para sa paglikha ng mga structured na dokumento gamit ang boses. Domain Adaptation: contextualStrings na may medikal/legal na termino (500+ parirala). SFSpeechRecognitionRequest.customLmProbability — impluwensya ng contextualStrings (0.1–1.0). Para sa medikal na pagdidikta gamitin ang on-device (privacy ng data ng pasyente). Whisper fine-tuned sa medikal na data — alternatibo na may WER 5% sa halip na 12% ng base SFSpeechRecognizer. Pagsunod sa HIPAA: on-device mode (data hindi umaalis sa device). Para sa transcription ng konsultasyon — SFSpeechURLRecognitionRequest + segments na may time stamps ng nagsasalita.
Mga madalas itanong
SFSpeechRecognizer ay available mula iOS 10, macOS 10.15, watchOS 6 at tvOS 17. On-device mode — mula iOS 17 (requiresOnDeviceRecognition). Sa iOS 10–16 ang SFSpeechRecognizer ay gumagana lamang sa pamamagitan ng Apple cloud servers (nangangailangan ng internet). Sa lahat ng bersyon kinakailangan ang tahasang pahintulot ng user (NSMicrophoneUsageDescription + NSSpeechRecognitionUsageDescription). SFSpeechRecognizer.supportedLocales — dinamikong listahan, depende sa rehiyon at modelo ng device.
Oo, sa pamamagitan ng paglikha ng bagong recognitionTask pagkatapos ng isFinal. I-restart ang task pagkatapos ng finalization ng nauna para sa tuluy-tuloy na pagkilala. Sa iOS 17 ang tuluy-tuloy na on-device ASR ay kumokonsumo ng 2–5% na baterya bawat oras (A15+). Sa iOS 16- ang tuluy-tuloy na ASR ay nangangailangan ng internet (pagkonsumo ng data ~1 MB/minuto). Para sa talagang tuluy-tuloy na pagkilala (laging nakikinig) gamitin ang Vosk (offline) o Whisper Core ML. Ang SFSpeechRecognizer ay hindi sumusuporta sa laging naka-on na mode sa iOS 16-.
Gamitin ang result.bestTranscription.segments — bawat SFTranscriptionSegment ay naglalaman ng confidence (Float 0..1) para sa salita. segments[i].substring — teksto ng salita. segments[i].confidence — kumpiyansa ng ASR sa salitang ito. Mga salitang may confidence < 0.5 — hindi mapagkakatiwalaan, i-highlight ang mga ito sa UI. segments[i].timestamp — oras ng pagsisimula (TimeInterval). segments[i].duration — tagal. segments[i].alternativeSubstrings — alternatibong variant ng pagkilala ng salita. Para sa mahabang file, ang pag-ikot sa segments ay nagbibigay ng per-word confidence nang walang manu-manong pag-parse.
203 — ay SFSpeechError.ErrorCode.opportunistic (walang internet para sa cloud ASR). Nangyayari sa iOS 16- o may request.requiresOnDeviceRecognition = false nang walang internet. Solusyon: itakda ang requiresOnDeviceRecognition = true (iOS 17+) para sa offline na trabaho. Sa iOS 16- gamitin ang NWPathMonitor — kapag walang internet ipakita ang mensahe “kailangan ng internet para sa pagkilala ng pagsasalita”. Alternatibo: Vosk (offline, iOS 12+) bilang fallback kapag walang network.
SFSpeechRecognizer — built-in na Apple API, libre, madaling i-integrate, ngunit may limitasyon sa haba (1–2 minuto), accuracy WER 7–14% at para lamang sa iOS ecosystem. Whisper Core ML — open-source (MIT), sumusuporta sa 99 na wika, WER 6–10%, walang limitasyon sa haba, ngunit nangangailangan ng manu-manong integrasyon, Core ML models (39M–769M parameters), RTF 0.5–6 (mas mabagal kaysa SFSpeechRecognizer). SFSpeechRecognizer — para sa standard voice input. Whisper — para sa high-accuracy na transcription ng mahabang audio.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din