如何配置SFSpeechRecognizer:在线用在线识别,离线fallback到设备端识别?
实现联网优先、断网自动 fallback 到离线语音识别
苹果原生的SFSpeechRecognizer和SFSpeechAudioBufferRecognitionRequest并没有提供开箱即用的“联网自动用在线识别、断网自动切离线”的配置,需要自己实现逻辑来完成这个需求,具体步骤如下:
- 监听网络状态:用
NWPathMonitor实时检测设备的联网状态,判断当前在线/离线状态。 - 动态设置识别请求参数:
- 联网状态下,创建
SFSpeechAudioBufferRecognitionRequest时,将requiresOnDeviceRecognition设为false,使用在线识别; - 离线状态下,将该属性设为
true,切换到设备端识别。
- 联网状态下,创建
- 处理识别中的网络切换:如果正在进行在线识别时突然断网,立即取消当前识别请求,重新创建开启离线识别的请求,继续音频流的识别。
- 提前准备离线资源:确保设备已下载对应语言的离线识别包——先通过
SFSpeechRecognizer.supportsOnDeviceRecognition确认设备支持离线识别,之后系统会自动触发对应语言包的下载(需用户同意),也可通过系统设置手动提前下载。
简单代码片段示例:
import Network // 初始化网络监视器 let monitor = NWPathMonitor() monitor.pathUpdateHandler = { path in DispatchQueue.main.async { let useOnDeviceRecognition = !path.status.isConnected // 后续创建识别请求时,根据这个变量设置requiresOnDeviceRecognition } } let queue = DispatchQueue(label: "NetworkMonitor") monitor.start(queue: queue)
注意:如果设备不支持离线识别(supportsOnDeviceRecognition为false),断网时无法进行识别,需要提前做兼容处理。
内容的提问来源于stack exchange,提问作者Ralf Ebert
相关产品推荐
相关产品推荐

