You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:33:19