macOS下SFSpeechRecognizer手动停止后仍出现30秒超时回调求助
解决SFSpeechRecognizer手动关闭后30秒出现超时回调的问题
你踩了SFSpeechRecognitionTask生命周期的一个小坑——虽然你调用了finish()和endAudio(),但这两个方法并没有立即终止识别任务,反而让它进入了"等待处理完缓冲音频+超时等待"的状态,最终触发了系统默认的30秒超时回调。
问题根源
recognitionTask?.finish()的作用是告诉任务:"不要再接收新音频了,但请把已经缓冲的音频处理完再结束"。但如果此时已经没有新音频输入,任务会一直等到系统设定的30秒超时阈值,才会触发最后一次result为nil的回调,这就是你看到的延迟回调的原因。而你注释掉的recognitionTask?.cancel()才是真正能立即终止任务的关键方法。
修复方案
调整你的stopRecording()方法,按照先停音频采集→再取消识别任务→最后清理资源的顺序来处理:
@objc func stopRecording() { print( "stopRecording()" ) // 第一步:停止音频引擎,彻底切断音频输入 audioEngine.stop() audioEngine.inputNode.removeTap( onBus: 0 ) // 第二步:立即取消识别任务,阻止超时回调 recognitionTask?.cancel() recognitionTask = nil // 置空避免后续意外引用 // 第三步:结束音频请求并清理对象 recognitionRequest?.endAudio() recognitionRequest = nil self.timer?.invalidate() print( "stopRecording() DONE" ) }
额外说明
cancel()会立即终止识别任务,不管缓冲的音频有没有处理完,也不会触发后续的超时回调,这正是你需要的行为。- 一定要把
recognitionTask置为nil,防止后续代码误操作已经取消的任务。 - 先停止音频引擎再取消任务,可以避免在取消过程中还有新的音频数据被送入识别队列。
内容的提问来源于stack exchange,提问作者P i
相关产品推荐
相关产品推荐

