SFSpeechRecognizer là API nhận dạng giọng nói chính của Apple trong hệ sinh thái iOS. Framework cung cấp quyền truy cập vào công cụ ASR của thiết bị thông qua Speech.framework, hỗ trợ phiên âm trực tuyến theo thời gian thực và nhận dạng tệp âm thanh một lần. SFSpeechRecognizer có sẵn trên iOS 10+, macOS 10.15+, watchOS 6+ và tvOS 17+. Với iOS 17, Apple đã thêm chế độ trên thiết bị hoàn chỉnh cho phép nhận dạng giọng nói mà không cần kết nối Internet. Theo Apple Speech Documentation, 2025, SFSpeechRecognizer được sử dụng trong hơn 200.000 ứng dụng App Store và xử lý hàng triệu yêu cầu mỗi ngày với WER 7% bằng tiếng Anh.
Những điểm chính
SFSpeechRecognizer là một lớp từ Speech.framework đại diện cho bộ nhận dạng giọng nói cho một ngôn ngữ cụ thể. Nó được khởi tạo với Locale (ru_RU, en_US, zh_CN). SFSpeechRecognizer quản lý yêu cầu nhận dạng (SFSpeechRecognitionRequest) và trả về kết quả (SFSpeechRecognitionResult) với bản phiên âm và siêu dữ liệu. Nó hỗ trợ hai loại yêu cầu: SFSpeechAudioBufferRecognitionRequest (luồng âm thanh trực tiếp) và SFSpeechURLRecognitionRequest (tệp âm thanh). Cả hai đều trả về SFTranscription — một mảng các giả thuyết nhận dạng thay thế.
SFSpeechRecognitionResult chứa: bestTranscription (giả thuyết tốt nhất, SFTranscription), transcriptions (tất cả các lựa chọn thay thế), isFinal (cuối cùng/trung gian). SFTranscription chứa: formattedString (văn bản), segments (mảng SFTranscriptionSegment với dấu thời gian, độ tin cậy, substringRange, alternativeSubstrings). Độ tin cậy cho mỗi đoạn (0..1) — cho phép lọc các đoạn không đáng tin cậy. Segments là một tính năng chính của Speech.framework: chúng cung cấp đánh dấu từng từ với điểm tin cậy.
Kiến trúc SFSpeechRecognizer: AVFoundation (thu âm thanh) → Audio Buffer → SFSpeechAudioBufferRecognitionRequest → SFSpeechRecognizer (công cụ ASR) → SFSpeechRecognitionResult → SFSpeechRecognitionTask (điều khiển: cancel, finish, pause). Công cụ ASR của Apple sử dụng kiến trúc lai: Conformer (bộ mã hóa) + RNNT (bộ giải mã) cho trên thiết bị, Transducer cho đám mây. Các mô hình được tối ưu hóa cho Apple Neural Engine (ANE). Trên A17 Pro, ASR trên thiết bị chạy với RTF 0.3–0.6 (nhanh hơn thời gian thực).
| Thành phần | Mục đích | Phiên bản iOS |
|---|---|---|
| SFSpeechRecognizer | Lớp nhận dạng chính | iOS 10+ |
| SFSpeechAudioBufferRecognitionRequest | Luồng âm thanh trực tiếp | iOS 10+ |
| SFSpeechURLRecognitionRequest | Tệp âm thanh (.wav, .m4a) | iOS 10+ |
| SFSpeechRecognitionTask | Quản lý yêu cầu (cancel, finish) | iOS 10+ |
| Nhận dạng trên thiết bị | ASR ngoại tuyến | iOS 17+ |
| Nhận dạng kết hợp | Kết hợp trên thiết bị + đám mây | iOS 17+ |
Yêu cầu âm thanh: SFSpeechRecognizer chấp nhận LPCM (16 kHz, 16 bit, mono) hoặc Opus (iOS 17+). AVFoundation có thể thu thập bộ đệm ở bất kỳ định dạng nào, yêu cầu tự động chuyển đổi. Độ dài tối thiểu: 0.5 giây (phát hiện im lặng). Tối đa: 1 phút (đám mây) / 2 phút (trên thiết bị) cho mỗi yêu cầu. Để phiên âm dài, hãy chia âm thanh thành các đoạn 30–60 giây với độ chồng lấp 2–5 giây.
Quyền người dùng: SFSpeechRecognizer yêu cầu hai quyền rõ ràng. NSMicrophoneUsageDescription (Privacy — Microphone Usage Description) — để truy cập micrô. NSSpeechRecognitionUsageDescription (Privacy — Speech Recognition Usage Description) — để truy cập nhận dạng giọng nói. Cả hai đều là chuỗi giải thích lý do cho người dùng. SFSpeechRecognizer.requestAuthorization — hiển thị hộp thoại quyền. Trạng thái: notDetermined, denied, restricted, authorized. Nếu không có trạng thái authorized, gọi recognizer sẽ trả về lỗi 216 (Speech framework error).
Kiểm tra khả dụng: SFSpeechRecognizer.isAvailable — kiểm tra xem ASR có khả dụng cho ngôn ngữ hiện tại không. Trên iOS 16-, isAvailable = false nếu không có Internet. Trên iOS 17+, isAvailable = true cho các ngôn ngữ trên thiết bị ngay cả khi ngoại tuyến. SFSpeechRecognizer.supportedLocales — phương thức tĩnh để lấy danh sách ngôn ngữ được thiết bị hỗ trợ. Nên kiểm tra isAvailable trước mỗi lần khởi chạy (người dùng có thể tắt Siri/Đọc chính tả trong cài đặt). Khả dụng phụ thuộc vào khu vực: tiếng Trung — chỉ ở Trung Quốc, tiếng Ả Rập — ở UAE.
// Thiết lập 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 không khả dụng. Bật Siri và Đọc chính tả trong Cài đặt")
return
}
let request = SFSpeechAudioBufferRecognitionRequest()
request.requiresOnDeviceRecognition = true
Xử lý lỗi: SFSpeechRecognizer được gọi với một trình xử lý hoàn thành có thể trả về Lỗi. Các lỗi chính: 203 — không có Internet (đám mây, iOS 16-); 216 — không được ủy quyền (không có quyền); 301 — lỗi âm thanh (vấn đề micrô/định dạng); 401 — dịch vụ không khả dụng (dịch vụ quá tải); 601 — ngôn ngữ không khả dụng (ngôn ngữ không được hỗ trợ trên thiết bị). Đối với trên thiết bị iOS 17+, các lỗi chính: 301 (âm thanh), 601 (ngôn ngữ). Luôn xử lý trình xử lý hoàn thành — lỗi có thể xảy ra bất kỳ lúc nào trong quá trình ghi âm.
Đường ống ASR trực tiếp: AVAudioEngine (thu âm từ micrô) → installTap (bộ đệm âm thanh) → request.append(buffer) → SFSpeechRecognizer → recognitionTask → delegate/resultHandler. AVAudioEngine cung cấp độ trễ thấp (5–10 ms từ micrô đến bộ đệm). SFSpeechRecognitionDelegate: didHypothesizeTranscription (cứ sau 200–500 ms — văn bản một phần), didFinishRecognition (kết quả cuối cùng). Task.isFinishing — có thể hủy khi nhận dạng hoàn tất. Để nhận dạng liên tục (đọc chính tả vô hạn), hãy tạo tác vụ mới sau isFinal.
SFSpeechRecognitionTaskDelegate: các phương thức tùy chọn. speechRecognitionDidDetectSpeech (bắt đầu nói) — để chỉ báo trên giao diện người dùng. didHypothesizeTranscription (văn bản trung gian) — để hiển thị trong khi nói. didFinishRecognition (kết quả cuối cùng) — để hoàn thiện văn bản. didFinishSuccessfully (thành công/lỗi) — để kết thúc. didProcessAudio (bộ đệm âm thanh đã xử lý) — cho đồng hồ RMS. Nên triển khai didHypothesizeTranscription — người dùng nhìn thấy văn bản ngay lập tức mà không bị chậm trễ. Bản phiên âm cuối cùng để lưu.
// Nhận dạng giọng nói trực tiếp
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()
Nhận dạng liên tục: cho chế độ “luôn lắng nghe” (đầu vào giọng nói, trợ lý), cần khởi động lại tác vụ sau isFinal. Tạo một vòng lặp: finishTask → request = SFSpeechAudioBufferRecognitionRequest() → recognitionTask = recognizer.recognitionTask(with: request). Để tránh khoảng trống, hãy chồng lấp cuối của một tác vụ với đầu của tác vụ tiếp theo (bắt đầu yêu cầu mới 1–2 giây trước khi tác vụ trước kết thúc). AVFoundation AVAudioSession — cấu hình .playAndRecord để phát lại và ghi âm đồng thời. Trên iOS 17+, ASR liên tục với trên thiết bị tiêu thụ 2–5% pin mỗi giờ (A15+).
SFSpeechURLRecognitionRequest — một yêu cầu nhận dạng tệp âm thanh theo URL. Hỗ trợ các định dạng: .wav (16 kHz, 16 bit, mono), .m4a (AAC), .mp4, .mov. Độ dài tối đa: ~1 phút cho đám mây, ~2 phút cho trên thiết bị. Đối với tệp dài hơn, hãy chia thành các đoạn (AVAssetExportSession + trim). SFSpeechURLRecognitionRequest không hỗ trợ truyền trực tuyến (không có kết quả một phần) — chỉ kết quả cuối cùng. Để có kết quả một phần với tệp, hãy chuyển đổi thành Yêu cầu Bộ đệm Âm thanh.
Nhận bản phiên âm tệp âm thanh: SFSpeechRecognizer.recognitionTask(with: request) resultHandler. Trích xuất bestTranscription.formattedString. Để có dấu thời gian cấp từ — segments từ bestTranscription.segments (segment.duration, segment.timestamp, segment.substring). Độ tin cậy mỗi đoạn — độ tin cậy ASR cho mỗi từ (sử dụng để lọc). Các giả thuyết thay thế — các lựa chọn thay thế transcriptionFormatter cho các từ có độ tin cậy thấp. Đối với tệp có nhiều người nói, SFSpeechRecognitionRequest có thể trả về nhiều yêu cầu (một yêu cầu cho mỗi người nói, iOS 17+).
// Phiên âm tệp âm thanh
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("Lỗi: \(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)
}
}
Chia tệp âm thanh dài: đối với tệp > 1 phút, chia thành các đoạn 30–60 giây với độ chồng lấp 2–3 giây (ghép nối). AVAssetExportSession + CMTimeRange — xuất các đoạn. Thay thế: UISelectionView (người dùng chọn một đoạn). Ghép nối phiên âm: nối văn bản, ghép nối bằng độ chồng lấp (so sánh 2–3 từ cuối của đoạn trước với 2–3 từ đầu của đoạn tiếp theo — loại bỏ trùng lặp). Vosk và Whisper hỗ trợ âm thanh dài một cách tự nhiên, SFSpeechRecognizer thì không. Đối với phiên âm dài, tôi khuyên dùng Whisper (Core ML) — không có giới hạn độ dài.
Chế độ trên thiết bị (iOS 17+): request.requiresOnDeviceRecognition = true. ASR chạy cục bộ trên Apple Neural Engine (ANE). Ưu điểm: không cần Internet, quyền riêng tư (âm thanh không rời khỏi thiết bị), chi phí bằng không (miễn phí), độ trễ thấp (RTF 0.3–0.6). Nhược điểm: độ chính xác thấp hơn (WER 12–14% so với 7–12%), giới hạn 2 phút cho mỗi yêu cầu, tập ngôn ngữ hạn chế (không phải tất cả 60 ngôn ngữ đều khả dụng trên thiết bị). Mô hình trên thiết bị chiếm ~50–100 MB trên thiết bị và được tải xuống ở yêu cầu đầu tiên.
Đám mây (iOS 16-): request.requiresOnDeviceRecognition = false (hoặc tham số vắng mặt). ASR trên máy chủ Apple — chính xác hơn (WER 7% EN, 12% RU), nhiều ngôn ngữ hơn, tối đa 1 phút cho mỗi yêu cầu. Yêu cầu Internet (WiFi hoặc di động). Apple không thu phí nhà phát triển cho ASR đám mây (miễn phí). Giới hạn: 1 yêu cầu mỗi phút cho mỗi ứng dụng (không xác định), nhưng Apple có thể giới hạn ở quy mô sản xuất. ASR đám mây cung cấp chất lượng nỗ lực tốt nhất mà không có SLA. Đối với ứng dụng doanh nghiệp, hãy sử dụng Google Cloud ASR hoặc Whisper (Core ML).
| Tham số | Trên thiết bị (iOS 17+) | Đám mây (iOS 10+) |
|---|---|---|
| Cần Internet | Không | Có |
| WER (EN) | 10–12% | 7% |
| WER (RU) | 12–14% | 12% |
| Độ trễ (RTF) | 0.3–0.6 | 0.3–0.8 (+mạng) |
| Độ dài tối đa | 2 phút | 1 phút |
| Quyền riêng tư | Hoàn toàn | Âm thanh rời khỏi thiết bị |
| Miễn phí | Có | Có |
Nhận dạng kết hợp (iOS 17+): request.requiresOnDeviceRecognition = false với Internet (đám mây), = true khi ngoại tuyến (dự phòng). Apple tự động chọn chế độ. Đối với ứng dụng quan trọng về độ chính xác: kiểm tra NetworkMonitor (NWPathMonitor) — sử dụng đám mây với Internet, trên thiết bị khi không có. Đối với ứng dụng quan trọng về quyền riêng tư: luôn trên thiết bị. Đối với phiên âm: đám mây (chính xác hơn). Đối với đầu vào giọng nói: trên thiết bị (nhanh hơn). Khuyến nghị Kết hợp: 80% đám mây, 20% dự phòng trên thiết bị.
Đầu vào giọng nói trong bàn phím tùy chỉnh — SFSpeechRecognizer được tích hợp vào tiện ích mở rộng bàn phím (iOS 10+). Người dùng nhấn nút micrô, ASR phiên âm giọng nói thành văn bản và chèn vào trường văn bản. Yêu cầu: kết quả một phần (xem văn bản theo thời gian thực), trên thiết bị (bàn phím phải hoạt động không cần Internet). SFSpeechRecognizer + AVSpeechSynthesizer — đầu vào giọng nói + đầu ra giọng nói. Đối với bàn phím tùy chỉnh trên iOS 17+, hãy sử dụng trên thiết bị. Hạn chế của tiện ích mở rộng bàn phím: AVAudioEngine khả dụng nhưng có giới hạn về thời gian (thực thi nền bị hạn chế).
Phiên âm cuộc họp và bài giảng — ứng dụng ghi âm và phiên âm (Otter.ai, Rev, Apple Voice Memos). SFSpeechURLRecognitionRequest xử lý tệp .m4a. Đối với bản ghi dài (30–60 phút) — Whisper Core ML (không giới hạn độ dài). Segments của SFSpeechRecognizer với dấu thời gian — để đồng bộ văn bản với âm thanh (làm nổi bật văn bản trong khi phát lại). Độ tin cậy mỗi đoạn — để hiển thị các đoạn không đáng tin cậy (làm nổi bật màu vàng). Để phân tách người nói (ai đã nói) — Apple không cung cấp API, hãy sử dụng pyannote-audio + Whisper trên máy chủ.
Lệnh thoại trong ứng dụng iOS — SFSpeechRecognizer + framework VGS (Voice Grammar Services) để thực thi lệnh: “mở cài đặt”, “gửi tin nhắn”, “bật đèn”. Nhận dạng dựa trên ngữ pháp: SFSpeechRecognitionRequest contextualStrings = mảng lệnh. Điều này cải thiện độ chính xác nhận dạng lệnh lên 95% (so với 85% dạng tự do). SFSpeechRecognitionTask.cancel — để ngắt sau khi thực thi lệnh. VGS + SFSpeechRecognizer + Shortcuts — lệnh thoại tùy chỉnh mà không cần viết giao diện người dùng. Để hỗ trợ tiếp cận: Voice Control (tích hợp sẵn) + SFSpeechRecognizer (lệnh tùy chỉnh).
// Lệnh thoại với chuỗi ngữ cảnh
let request = SFSpeechAudioBufferRecognitionRequest()
request.requiresOnDeviceRecognition = true
request.shouldReportPartialResults = true
request.contextualStrings = ["open contacts", "send message",
"show notifications", "bật đèn pin"]
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()
}
}
Đọc chính tả trong ứng dụng y tế và pháp lý — SFSpeechRecognizer để tạo tài liệu có cấu trúc bằng giọng nói. Thích ứng miền: contextualStrings với thuật ngữ y tế/pháp lý (500+ cụm từ). SFSpeechRecognitionRequest.customLmProbability — ảnh hưởng của contextualStrings (0.1–1.0). Để đọc chính tả y tế, hãy sử dụng trên thiết bị (quyền riêng tư dữ liệu bệnh nhân). Whisper được tinh chỉnh trên dữ liệu y tế — giải pháp thay thế với WER 5% thay vì 12% của SFSpeechRecognizer cơ bản. Tuân thủ HIPAA: chế độ trên thiết bị (dữ liệu không rời khỏi thiết bị). Để phiên âm cuộc hẹn — SFSpeechURLRecognitionRequest + segments với dấu thời gian người nói.
Các câu hỏi thường gặp
SFSpeechRecognizer khả dụng từ iOS 10, macOS 10.15, watchOS 6 và tvOS 17. Chế độ trên thiết bị từ iOS 17 (requiresOnDeviceRecognition). Trên iOS 10–16, SFSpeechRecognizer chỉ hoạt động thông qua máy chủ đám mây của Apple (cần Internet). Tất cả các phiên bản đều yêu cầu quyền rõ ràng của người dùng (NSMicrophoneUsageDescription + NSSpeechRecognitionUsageDescription). SFSpeechRecognizer.supportedLocales — danh sách động, phụ thuộc vào khu vực và kiểu thiết bị.
Có, bằng cách tạo recognitionTask mới sau isFinal. Khởi động lại tác vụ sau khi tác vụ trước hoàn thành để nhận dạng liên tục. Trên iOS 17, ASR liên tục trên thiết bị tiêu thụ 2–5% pin mỗi giờ (A15+). Trên iOS 16-, ASR liên tục yêu cầu Internet (lưu lượng ~1 MB/phút). Để nhận dạng thực sự liên tục (luôn lắng nghe), hãy sử dụng Vosk (ngoại tuyến) hoặc Whisper Core ML. SFSpeechRecognizer không hỗ trợ chế độ luôn bật trên iOS 16-.
Sử dụng result.bestTranscription.segments — mỗi SFTranscriptionSegment chứa confidence (Float 0..1) cho từ. segments[i].substring — văn bản của từ. segments[i].confidence — độ tin cậy ASR cho từ đó. Các từ có confidence < 0.5 không đáng tin cậy — hãy làm nổi bật chúng trong giao diện người dùng. segments[i].timestamp — thời gian bắt đầu (TimeInterval). segments[i].duration — thời lượng. segments[i].alternativeSubstrings — các giả thuyết nhận dạng thay thế cho từ. Đối với tệp dài, việc lặp qua segments cung cấp độ tin cậy cho từng từ mà không cần phân tích thủ công.
203 là SFSpeechError.ErrorCode.opportunistic (không có Internet cho ASR đám mây). Xảy ra trên iOS 16- hoặc khi request.requiresOnDeviceRecognition = false không có Internet. Giải pháp: đặt requiresOnDeviceRecognition = true (iOS 17+) để hoạt động ngoại tuyến. Trên iOS 16-, sử dụng NWPathMonitor — khi không có Internet, hiển thị thông báo “nhận dạng giọng nói yêu cầu kết nối Internet”. Thay thế: Vosk (ngoại tuyến, iOS 12+) làm dự phòng khi không có mạng khả dụng.
SFSpeechRecognizer — API tích hợp của Apple, miễn phí, dễ tích hợp, nhưng có giới hạn độ dài (1–2 phút), độ chính xác WER 7–14% và chỉ dành cho hệ sinh thái iOS. Whisper Core ML — mã nguồn mở (MIT), hỗ trợ 99 ngôn ngữ, WER 6–10%, không giới hạn độ dài, nhưng yêu cầu tích hợp thủ công, mô hình Core ML (39M–769M tham số), RTF 0.5–6 (chậm hơn SFSpeechRecognizer). SFSpeechRecognizer — cho đầu vào giọng nói tiêu chuẩn. Whisper — cho phiên âm âm thanh dài độ chính xác cao.
Tóm tắt
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm