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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 06:11:00