请教各位大佬一个问题,我现在的场景是:对着蓝牙音响的麦克风说话,音箱给我传输音频数据,然后我在传给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"
因为第一次接触跟硬件、蓝牙对接,还望各位大佬指导下,抱拳
阿乐呀 (作者)
使用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