iOS应用调用麦克风崩溃:IsFormatSampleRateAndChannelCountValid(format)断言失败
解决方案
崩溃的核心原因是:当Teams后台占用麦克风时,inputNode.outputFormat(forBus: 0)返回的音频格式(采样率或声道数)不符合SFSpeechRecognizer的要求,导致格式验证失败触发崩溃。
直接依赖输入节点的输出格式会受当前活跃音频会话的影响,而其他应用占用麦克风时的格式往往和语音识别要求不兼容。解决办法是显式指定符合SFSpeechRecognizer标准的音频格式,而非直接复用输入节点的格式。
步骤1:修改格式指定与Tap安装代码
替换原来的格式获取和Tap安装代码为:
// 显式指定语音识别最优格式:16kHz单声道 let preferredFormat = AVAudioFormat(standardFormatWithSampleRate: 16000, channels: 1)! inputNode.installTap(onBus: 0, bufferSize: 1024, format: preferredFormat) { (buffer, when) in self.recognitionRequest?.append(buffer) }
步骤2:优化音频会话设置
在激活音频会话时,显式指定采样率并处理激活失败的情况,避免后续代码执行:
do { try audioSession.setCategory(.record, mode: .measurement, options: .defaultToSpeaker) try audioSession.setPreferredSampleRate(16000) // 强制设置采样率 try audioSession.setActive(true, options: .notifyOthersOnDeactivation) } catch { print("音频会话设置失败:\(error.localizedDescription)") // 给用户提示麦克风被占用 let alert = UIAlertController(title: "麦克风被占用", message: "请关闭其他正在使用麦克风的应用后重试", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "确定", style: .default)) present(alert, animated: true) return // 终止后续代码,避免崩溃 }
修复逻辑说明
- SFSpeechRecognizer官方推荐使用16kHz单声道格式,这是语音识别的最优且兼容性最强的格式。
- 显式指定格式后,系统会自动将麦克风输入转换为该格式,不受其他应用占用时的格式影响。
- 提前处理音频会话激活失败的情况,可以在麦克风被占用时直接提示用户,而非走到录音环节触发崩溃。
内容的提问来源于stack exchange,提问作者Nursultan Yelemessov
相关产品推荐
相关产品推荐

