阿乐呀
阿乐呀
  • 发布:2025-07-28 10:25
  • 更新:2025-07-29 11:09
  • 阅读:165

蓝牙传输音频数据

分类:uni-app

请教各位大佬一个问题,我现在的场景是:对着蓝牙音响的麦克风说话,音箱给我传输音频数据,然后我在传给ai

 async listenValueChange() {  
    // return new Promise((resolve, reject) => {  
    try {  
      uni.onBLECharacteristicValueChange(res => {  
        let resHex = this.ab2hex(res.value)  
        // res.value音箱给我的数据  
        this.handerReceivedDeviceAudio(resHex, res.value)  
      })  
      return true  
    } catch (e) {  
      return false  
    }  
  }
  handerReceivedDeviceAudio(res, raw = new Int8Array()) {  
    let intArray = new Int8Array(raw)   
例:-22,42,64,0,-72,31,76,-33,-3,-54,-67,-1,38,-82,95,-68,-123,56,101,103,41,18,-68,5,-102,-87,12,78,92,113,97,90,3,77,-60,120,-31,29,75,124,83,66,-47,38,101,-86  
    console.log('---intArray1---', intArray)   
例:{"0":-22,"1":42,"2":64,"3":0,"4":-72,"5":31,"6":76,"7":-33,"8":-3,"9":-54,"10":-67,"11":-1,"12":38,"13":-82,"14":95,"15":-68,"16":-123,"17":56,"18":101,"19":103,"20":41,"21":18,"22":-68,"23":5,"24":-102,"25":-87,"26":12,"27":78,"28":92,"29":113,"30":97,"31":90,"32":3,"33":77,"34":-60,"35":120,"36":-31,"37":29,"38":75,"39":124,"40":83,"41":66,"42":-47,"43":38,"44":101,"45":-86}  
    console.log('---intArray2---', JSON.stringify(intArray))  
    if (intArray.byteLength > 40) {  
      const extractedBuffer = raw.slice(4, 44)  
      this.inputAudioBuffer = extractedBuffer  

    }  
  }

蓝牙音频格式
data0 :编码格式):16kbps,opus固定编码,长度20ms,40字节
其他:保留
data1~datan:音频数据

发送给ai需要的格式
encoding string 是 音频编码(取值:raw,opus,其他个编码格式可联系讯飞技术人员确认) raw
sample_rate int 是 采样率(取值 :8000、16000) 16000
channels int 是 通道数(取值 :1、2) 1
bit_depth int 是 位数(取值 :8、16) 16
status int 是 数据状态:首帧 0、中间帧 1、尾帧2 0
audio string 是 音频数据:需经base64编码

我现在需要怎么转换才能使用,我转换了好久ai总是返回
"code": 10043,
"message": "audioCoding decode fail",
"sid": "xgo000dc920@dx1984ed793240001822",
"status": 2,
"stmid": "audio-1"

因为第一次接触跟硬件、蓝牙对接,还望各位大佬指导下,抱拳

2025-07-28 10:25 负责人:无 分享
已邀请:
DCloud_UNI_OttoJi

DCloud_UNI_OttoJi - 日常回复 uni-app/x 问题,如果艾特我没看到,请主动私信

明确问题,如果是 base64-arraybuffer-audio 文件,可参考这个评论。https://ask.dcloud.net.cn/question/211966

  • 阿乐呀 (作者)

    使用uni.onBLECharacteristicValueChange,接受蓝牙音响的数据,然后 let intArray = new Int8Array(raw) 、const extractedBuffer = raw.slice(4, 44),截取其中的音频数据 ,保存到pcm文件,extractedBuffer 打印是一个[object ArrayBuffer],我使用plus.io.requestFileSystem,直接写入extractedBuffer ,写不进去,既不成功也不报错,文件大小是0

    2025-07-29 14:13

  • 阿乐呀 (作者)

    硬件说格式是opus的

    2025-07-29 18:17

  • DCloud_UNI_OttoJi

    回复 阿乐呀: ,按照我帖子里的说明,先单独存储你的蓝牙数据,把音频成功播放了,你这个环节太长了。先缩小问题范围

    2025-07-30 11:30

  • 阿乐呀 (作者)

    回复 DCloud_UNI_OttoJi: 现在目的就是想把蓝牙给我的数据存储到一个opus文件里,蓝牙给我的是opus格式的,不考虑播放,使用 Int8Array 的 slice方法截取音频数据,我看文档会返回一个typed array,然后我用 plus.io.requestFileSystem存储这个typed array 不成功也不报错

    2025-07-30 11:52

  • 阿乐呀 (作者)

    回复 DCloud_UNI_OttoJi:不管什么文件,反正能存到一个音频格式的文件就行

    2025-07-30 11:53

  • DCloud_UNI_OttoJi

    回复 阿乐呀: 你没有理解我说的流程太长了的意思,蓝牙给的数据是否完整、你截取处理的是否正确、plus 操作是否正确都可能有问题,先保证单独存储蓝牙给的数据,参考我的帖子先把音频播放了,能播放说明后面的存储有问题,不能播放说明你的蓝牙数据、截取的数据有问题。

    2025-07-30 12:05

  • 阿乐呀 (作者)

    回复 DCloud_UNI_OttoJi: 要先截取才能获取蓝牙给的音频数据,不截取他还包含了别的东西

    2025-07-30 13:39

  • 阿乐呀 (作者)

    回复 DCloud_UNI_OttoJi: 我把音频数据保存后,用你帖子里的方法转换、播放全是噪音,我再跟我们经理沟通下

    2025-07-30 16:07

  • 阿乐呀 (作者)

    回复 DCloud_UNI_OttoJi:谢,大哥,抱拳

    2025-07-30 16:07

要回复问题请先登录注册