将语音识别整合到iOS应用中,可以改变用户的互动方式,提供无手控制,更快的数据输入,以及更好的访问. 苹果的语音框架提供强健,在线的语音对文本能力,尊重用户隐私,提供可靠的实时转录. 本文涵盖了从基础设置到高级执行模式的所有内容,包括性能优化,多语种支持,以及错误处理最佳做法.

理解语音框架结构

语音框架(引入iOS 10)通过三个核心部分运作:

  • SFSpeechRecognizer – 协调特定语言和语言的识别的主要接口,可以配置为使用基于device或服务器的识别.
  • SFSpeech Recognition Request – 代表音频输入. 两个主要子类: 用于预录音频文件,用于直播音频流.
  • SFSpeech识别任务 – 管理识别进程,提供进度更新和最终结果,它支持取消和拖放.

框架通过自动语音识别器(ASR)引擎处理音频. 默认情况下,iOS 15+对所有支持语言使用在线音频识别,这可以减少延迟,并确保数据永远不离开设备. 服务器基于识别仍然可以用于较老的设备或特定语言,但需要主动的互联网连接和用户同意.

关键特征和能力

  • Real-time streaming – 语音在用户说话时被转录,并定期获得部分结果.
  • 替代的抄录[] – 每种结果包括通过和 进行多段有自信分数的解释。
  • 文本短语[] – 开发者可以通过[]提供自定义短语,以提高特定域名词的准确性.
  • 支持的语言 – 60多种语言和区域口音. 使用 检索当前列表.

设置权限和工程配置

总是明确请求授权. 如果没有适当的授权,系统将拒绝识别请求。

Info.plist 要求

添加密钥 (Privacy – Speech District Usage Drife) ,并附有清晰的,方便用户的解释. 示例:

<key>NSSpeechRecognitionUsageDescription</key>
<string>This app uses speech recognition to transcribe your voice commands for hands-free navigation.</string>

如果您的应用还记录音频( 常见的现场识别) , 也添加 [[FLT: 8]] 。

请求授权

调用 应用程序生命周期的早期, 通常在视图控制器的 [[FLT: 10] ] 上。 回调返回四个状态中的一个 :

import Speech

SFSpeechRecognizer.requestAuthorization { authStatus in
 DispatchQueue.main.async {
 switch authStatus {
 case .authorized:
 // Enable microphone and recognition UI
 case .denied, .restricted:
 // Show error and disable features
 print("Speech recognition not available")
 case .notDetermined:
 // Handle if the user hasn't seen the dialog (rare)
 @unknown default:
 break
 }
 }
}

注:如果设备由父控件配置管理,或者通过屏幕时间禁用语音识别,则框架可以返回。

实施现场语音识别

对于实时语音捕获,您需要]将音频缓冲器流入识别请求中。以下代码显示一个制作准备的操作,并进行适当的清理。

步骤1:配置音频会话

let audioEngine = AVAudioEngine()
let request = SFSpeechAudioBufferRecognitionRequest()
var recognitionTask: SFSpeechRecognitionTask?

func configureAudioSession() {
 let audioSession = AVAudioSession.sharedInstance()
 do {
 try audioSession.setCategory(.record, mode: .measurement, options: .duckOthers)
 try audioSession.setActive(true, options: .notifyOthersOnDeactivation)
 } catch {
 print("Audio session config failed: \(error.localizedDescription)")
 }
}

选项会降低背景音乐的音量, 提高声音环境中的音效精度。 对于语音专用应用程序, 考虑[ [FLT: 16] 通过设备扬声器而不是耳机来传送音频 。

步骤2:创建识别器和请求

func startRecognition() {
 guard let recognizer = SFSpeechRecognizer(locale: Locale(identifier: "en-US")),
 recognizer.isAvailable else {
 handleError("Recognizer unavailable or not supported")
 return
 }

 configureAudioSession()
 request.shouldReportPartialResults = true

 let inputNode = audioEngine.inputNode
 let recordingFormat = inputNode.outputFormat(forBus: 0)

 recognitionTask = recognizer.recognitionTask(with: request) { result, error in
 if let result = result {
 let transcribedText = result.bestTranscription.formattedString
 // Update UI or process command
 print("Partial: \(transcribedText)")

 if result.isFinal {
 self.stopRecognition()
 // Handle final transcription
 }
 }

 if let error = error {
 self.stopRecognition()
 self.handleError(error.localizedDescription)
 }
 }

 inputNode.installTap(onBus: 0, bufferSize: 1024,
 format: recordingFormat) { buffer, _ in
 self.request.append(buffer)
 }

 audioEngine.prepare()
 do {
 try audioEngine.start()
 } catch {
 handleError("Audio engine start failed: \(error.localizedDescription)")
 }
}

步骤3: 慷慨地清理

func stopRecognition() {
 recognitionTask?.cancel()
 audioEngine.stop()
 audioEngine.inputNode.removeTap(onBus: 0)
 request.endAudio()
 // Optionally deactivate audio session
 try? AVAudioSession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation)
}

在停止音频引擎前总是取消识别任务。 忘记去掉输入节点上的窃听器, 会导致保留循环, 并阻止麦克风被释放 。

处理多种语言和自定义语言

Speak 框架支持动态本地语言检测。 您可以通过创建单独的 [[FLT: 19]] 实例, 允许用户在单个会话中切换语言甚至识别多种语言 。

let locales = ["en-US", "fr-FR", "zh-CN"]
let recognizers = locales.compactMap { SFSpeechRecognizer(locale: Locale(identifier: $0)) }

// Use recognizers[0] for English, etc.

对于On\device识别,每个识别器会按其语言模型的比例消耗内存. 支持多种语言时在旧设备上测试性能.

自定义词汇和域名术语

使用[]属性在]上提高工业特定术语的准确性:

request.contextualStrings = ["Directus", "CMS", "headless", "REST API"]

这提示了识别者倾向于这些短语,减少了对不寻常术语的误认.

处理错误和退缩策略

语音识别可能由于许多原因失败:网络问题(如果使用基于服务器的),音频中断,麦克风被禁用,或内存压力. 执行强力处理器:

enum RecognitionError: LocalizedError {
 case noPermission
 case unavailable
 case audioSessionFailure
 case internalError(Error)

 var errorDescription: String? {
 switch self {
 case .noPermission:
 return "Speech recognition permission denied"
 case .unavailable:
 return "Recognizer is busy or not available"
 case .audioSessionFailure:
 return "Could not start audio capture"
 case .internalError(let error):
 return error.localizedDescription
 }
 }
}

func handleError(_ message: String) {
 // Show alert, retry button, or fallback to text input
 DispatchQueue.main.async {
 // Show toast or log
 }
}

通过属性]监测识别任务状态变化,以检测取消或超时.

业绩优化和最佳做法

  • 优先使用 \ device 识别 – 由于iOS 15, iOS 识别是默认, 并且提供较低的空档。 避免强制使用服务器, 除非您需要尚未支持的离线语言 。 请检查 [[FLT: 27]]] 以验证可用性 。
  • 有限部分结果 – 设置]],只要你只需要最后的抄录,就可以减少间接费用.
  • 管理识别寿命 – 用户停止交谈时取消长运行任务。使用超时(例如2秒的沉默)来自动结束会话。
  • Battery and memory – Audio引擎和识别任务消耗大量资源. app到背景时暂停或停止识别.
  • 模拟数据测试 – 在开发过程中使用预录音频文件()以避免麦克风依赖.

处理中断

电话、警报或Siri可以中断活动识别会话。 订阅到 [[FLT: 30]] 暂停并优雅恢复:

NotificationCenter.default.addObserver(
 self,
 selector: #selector(handleInterruption),
 name: AVAudioSession.interruptionNotification,
 object: nil
)

@objc func handleInterruption(_ notification: Notification) {
 guard let userInfo = notification.userInfo,
 let type = userInfo[AVAudioSessionInterruptionTypeKey] as? UInt else { return }
 if type == AVAudioSession.InterruptionType.began.rawValue {
 stopRecognition()
 } else if type == AVAudioSession.InterruptionType.ended.rawValue {
 // Optionally restart recognition
 }
}

无障碍因素

语音识别可增强有运动或视力障碍的用户的无障碍性。

  • 监听开始/停止时提供清晰的音频反馈.
  • 通过在识别按钮上使用无障碍标签支持VoiceOver.
  • 在识别失败时提供基于文本的替代输入方法 。
  • 尊重用户隐私,不未经明确同意而存储音频数据.

测试和调试

模拟器不包括麦克风; 物理设备测试。 在 [[FLT: 32] ] 下使用 Xcode 的语音识别诊断日志 [ , 并加上 的值, 以便进行动词记录。 在 QA 中模拟不同的噪音环境和重音 。

真实的世界使用案例

  • CMS app 中的语音命令 — — 允许编辑者任意支配内容或浏览手动菜单。例如,“创建新文章”触发了特定的工作流程。
  • 说明记事程序 – 实时抄录,并带有标注识别.
  • 可访问性 聚焦导航 –用户可以不触摸屏幕而说"回去"或"打开的设置".
  • 医学或法律的抄写[ – 使用域名特定术语的背景字符串,并与关于隐私的device识别结合.

结论

苹果的语音框架为在iOS应用中添加语音识别提供了坚实的基础。 通过理解架构、正确处理权限、管理音频会话和优化性能,您可以创建一种尊重用户隐私的无缝语音控制体验。 总是在真实设备上测试,考虑倒置机制,并牢记用户的背景,以提供真正增强可用性的功能。

进一步阅读时,参考苹果公司的 Speech框架文档, AVAudioSession指南,以及 SFSpeechcognizer类参考. 访问的更多最佳做法可见于 Apple Accessable网站.