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

iOS模拟器运行Deepgram实时转写项目时AVAudioEngine格式验证崩溃问题

iOS模拟器运行Deepgram实时转写项目时AVAudioEngine格式验证崩溃问题

我帮你分析下这个崩溃的原因,以及对应的解决办法:

崩溃根源解析

这个IsFormatSampleRateAndChannelCountValid(format)错误,本质是AVAudioEngine在处理音频节点连接时,发现采样率或声道数的格式不合法。大概率是因为你代码里的音频格式设置和iOS模拟器的默认音频输入格式不匹配,或者节点之间的连接格式没有对齐导致的。

具体修复步骤

1. 强制统一音频会话格式

首先要把音频会话的格式和你传给Deepgram的参数(采样率48000、单声道)统一起来,避免模拟器用了不兼容的默认格式。修改音频会话的设置代码:

do {
    let session = AVAudioSession.sharedInstance()
    try session.setCategory(.record, mode: .default, options: [])
    // 强制设置采样率和声道数,和Deepgram请求参数对齐
    try session.setPreferredSampleRate(48000)
    try session.setPreferredInputNumberOfChannels(1)
    try session.activate()
    
    try audioEngine.start()
} catch {
    print("音频引擎启动失败:\(error.localizedDescription)")
}

2. 修正音频节点的格式处理

你代码里的转换器节点converterNode的tap设置用了节点默认的输出格式,这可能和我们需要的linear16格式不匹配。要明确指定tap的格式为目标格式,同时简化多余的节点逻辑:

private func startAnalyzingAudio() {
    let inputNode = audioEngine.inputNode
    // 明确指定和Deepgram匹配的输出格式
    guard let outputFormat = AVAudioFormat(commonFormat: .pcmFormatInt16, sampleRate: 48000, channels: 1, interleaved: true) else {
        print("无法创建目标音频格式")
        return
    }
    
    let converterNode = AVAudioMixerNode()
    audioEngine.attach(converterNode)
    
    // 给转换器节点添加tap时,直接使用我们需要的输出格式
    converterNode.installTap(onBus: 0, bufferSize: 1024, format: outputFormat) { [weak self] buffer, time in
        guard let data = self?.toNSData(buffer: buffer) else { return }
        self?.socket.write(data: data)
    }
    
    // 连接输入节点到转换器节点,使用输入节点的原始格式做转换
    audioEngine.connect(inputNode, to: converterNode, format: inputNode.inputFormat(forBus: 0))
    
    do {
        let session = AVAudioSession.sharedInstance()
        try session.setCategory(.record, mode: .default, options: [])
        try session.setPreferredSampleRate(48000)
        try session.setPreferredInputNumberOfChannels(1)
        try session.activate()
        
        try audioEngine.prepare()
        try audioEngine.start()
    } catch {
        print("音频引擎启动失败:\(error.localizedDescription)")
    }
}

3. 确认麦克风权限配置

别忘了在项目的Info.plist里添加麦克风权限申请,否则音频会话无法激活:
添加NSMicrophoneUsageDescription键,值填类似“需要访问麦克风进行实时音频转写”的描述。

额外提示

iOS模拟器的音频输入模拟和真机有差异,默认采样率可能不是48000,所以强制设置会话参数是关键。修改代码后记得Clean Build Folder再重新运行,避免旧缓存影响结果。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

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