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

Seeed Studio XIAO nRF52840(Sense)PDM音频转PCM用于语音转录仅输出白噪声的问题求助

Seeed Studio XIAO nRF52840(Sense)PDM音频转PCM用于语音转录仅输出白噪声的问题求助

我目前正在开发一款iOS应用,通过蓝牙从搭载PDM麦克风的Seeed Studio XIAO nRF52840 (Sense)开发板流式传输音频数据。该开发板运行的是OMI Friend固件,原本应该支持蓝牙音频流传输。我现在需要把PDM音频数据转换成PCM格式,再发送给Deepgram做语音转录,但遇到了棘手的问题:转换后的音频全是各种白噪声,Deepgram根本无法完成转录。

项目当前背景

  • iOS端采用Swift开发,用CoreBluetooth实现与开发板的连接,Starscream库用来和Deepgram的WebSocket API交互
  • PDM音频数据从XIAO BLE Sense板发送到iOS设备后,我会先积累数据,再尝试用Swift中的FIR滤波器完成PDM到PCM的转换
  • 转换完成后将PCM数据发送给Deepgram API进行语音转录

已尝试的解决方法

我已经试过几种方式,但结果还是只有白噪声:

  1. 使用带汉明窗系数的FIR滤波器进行PDM到PCM的转换
  2. 在保存PCM数据或发送给Deepgram之前,将其转换为小端格式
  3. 调整PDM增益和FIR滤波器的大小,试图提升音频质量

当前遇到的具体问题

  • 用Audacity打开导出的audio_dump.pcm文件时,只能看到噪声。我导入时的参数设置是:有符号16位PCM、小端字节序、16000Hz采样率、单声道
  • Deepgram API没有返回任何转录结果,只会给出空响应
  • 音频数据完全没有可识别的语音特征,我怀疑核心问题出在PDM到PCM的转换环节

PDM转PCM的Swift代码片段

private func convertPDMToPCM(pdmData: Data) -> Data? {
    let firLength = 64
    guard pdmData.count >= firLength else {
        print("Erreur: la taille des données PDM est insuffisante pour la conversion.")
        return nil
    }
    
    var firCoefficients = [Float](repeating: 0, count: firLength)
    vDSP_hamm_window(&firCoefficients, vDSP_Length(firLength), 0)
    
    let pdmValues = pdmData.flatMap { byte -> [Float] in
        return (0..<8).map { bitIndex in
            ((byte >> (7 - bitIndex)) & 0x01) == 1 ? 1.0 : -1.0
        }
    }
    
    guard pdmValues.count >= firLength else {
        print("Erreur: la taille des valeurs PDM est insuffisante pour la conversion FIR.")
        return nil
    }
    
    let outputLength = pdmValues.count - firLength + 1
    var pcmValues = [Float](repeating: 0.0, count: outputLength)
    vDSP_conv(pdmValues, 1, firCoefficients, 1, &pcmValues, 1, vDSP_Length(outputLength), vDSP_Length(firLength))
    
    let pcmSamples = pcmValues.map { value -> Int16 in
        return Int16(clamping: Int(min(max(value, -1.0), 1.0) * 32767.0))
    }
    
    return convertToLittleEndian(data: Data(buffer: UnsafeBufferPointer(start: pcmSamples, count: pcmSamples.count)))
}

我的疑问点

我现在不确定问题到底出在哪里:

  • 是不是PDM转PCM的逻辑有缺陷,需要用更复杂的滤波器?
  • 数据处理步骤(比如端转换)有没有问题?
  • 从XIAO板接收的PDM数据,是不是在固件端的配置就出错了?

有没有朋友在使用PDM麦克风并将数据转换为PCM用于语音识别时遇到过类似的问题?任何关于提升PCM输出质量、得到有效转录结果的建议都非常感谢!

提前谢谢大家的帮助和指点!

备注:内容来源于stack exchange,提问作者guillaume olivieri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 08:59:30