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

iOS开发求助:AirPods蓝牙麦克风录音及语音识别崩溃问题

解决AirPods蓝牙麦克风录音时的采样率不匹配崩溃问题

这是蓝牙音频设备和音频引擎采样率不匹配导致的典型问题——内置麦克风的采样率和AirPods的采样率不一致,你代码里提前获取了inputNode的格式,之后切换蓝牙音频会话时,这个格式就和实际蓝牙设备的格式不兼容了,直接触发崩溃。

先看报错的核心原因:

*** Terminating app due to uncaught exception 'com.apple.coreaudio.avfaudio', reason: 'required condition is false: format.sampleRate == hwFormat.sampleRate'

这个错误直白告诉你:你传给录音Tap的格式(recordingFormat)和硬件实际的蓝牙麦克风格式,采样率完全不匹配。内置麦能正常工作,是因为你提前获取的格式刚好匹配内置麦的采样率,但切换到蓝牙后就失效了。

修复步骤和代码示例

核心思路是:先正确配置并激活蓝牙音频会话,再获取当前输入设备的实际格式,而不是提前获取inputNode的格式。

修改后的代码如下:

// 1. 先请求语音权限
askSpeechPermission()

// 2. 配置音频会话,处理蓝牙输入
do {
    let session = AVAudioSession.sharedInstance()
    // 设置录音类别,允许蓝牙输入
    try session.setCategory(.record, mode: .default, options: .allowBluetooth)
    // 必须激活会话,系统才会切换到蓝牙输入设备
    try session.activate()
    
    // 3. 激活会话后,再获取当前输入节点的实际格式
    let audioEngine = AVAudioEngine()
    let inputNode = audioEngine.inputNode
    // 这里获取的格式是当前激活的蓝牙设备的格式,采样率完全匹配
    let recordingFormat = inputNode.outputFormat(forBus: 0)
    
    // 4. 初始化语音识别请求
    let request = SFSpeechAudioBufferRecognitionRequest()
    
    // 5. 安装录音Tap,使用正确的格式
    inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { buffer, time in
        request.append(buffer)
    }
    
    // 启动音频引擎(你原代码可能遗漏了这一步)
    try audioEngine.start()
} catch {
    // 不要空catch,打印错误方便调试
    print("音频会话配置失败:\(error.localizedDescription)")
}

关键注意点

  • 激活会话的时机:必须在设置类别后激活会话,这样系统才会切换到蓝牙输入设备,此时获取的inputNode格式才是蓝牙设备的正确格式。
  • 不要忽略错误:空catch会掩盖配置过程中的问题,比如蓝牙设备未连接、权限不足等,一定要打印或处理错误信息。
  • 设备切换处理:如果用户在录音过程中切换设备(比如从AirPods切回内置麦),你需要重新配置音频会话和inputNode的Tap,否则会再次出现格式不匹配的问题。

内容的提问来源于stack exchange,提问作者Viper8

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:32:09