阿乐呀
阿乐呀
  • 发布:2025-07-24 10:08
  • 更新:2025-07-25 16:54
  • 阅读:407

请教uniapp的app端如何保存base64音频数据为本地音频文件

分类:uni-app

咨询大佬们一个问题,我现在接的讯飞的ai接口,每次回答,会流式返回给我问题的语音数据,我现在想把这个Base64保存为本地的音频文件,我用了plus.io.requestFileSystem,现在有个bug,我直接保存这个Base64,保存后,我去播放这个音频文件,会显示格式不支持或已损坏,我如果把这个Base64转为ArrayBuffer,这时候就写不进去,文件大小是0,writer.onwritestart 这些方法都不会触发

{  
    "payload": {  
        "tts": {  
            "audio": "Base64 tts audio data",  
            "bit_depth": 16,  
            "channels": 1,  
            "encoding": "raw",  
            "frame_size": 0,  
            "sample_rate": 24000,  
            "seq": 1,  
            "status": 0  
        }  
    }  
}
saveAudioToFile(binaryData) {  
      const that = this  
      plus.io.requestFileSystem(  
        plus.io.PRIVATE_DOC,  
        function (fs) {  
          fs.root.getFile(  
            'panal.wav',  
            { create: true },  
            function (fileEntry) {  
              // 写文件-s  
              fileEntry.createWriter(  
                function (writer) {  
                  writer.seek(writer.length)  
                  writer.onwritestart = function (e) {  
                    console.log('写入数据开始!')  
                  }  
                  writer.onwrite = function (e) {  
                    console.log('写入数据成功!')  
                  }  
                  writer.onwriteend = function (e) {  
                    console.log('写入数据完成!')  
                  }  
                  writer.onerror = function (e) {  
                    console.log('写入数据失败!')  
                  }  
                  // const buffer = that.base64ToArrayBuffer(binaryData)  
                  // console.log('---binaryData---', binaryData)  
                  writer.write(binaryData)  
                },  
                function (e) {  
                  console.error('创建文件写入对象失败: ' + e.message)  
                }  
              )  
              // 写文件-e  
            },  
            function (e) {  
              console.error('创建文件失败: ' + e.message)  
            }  
          )  
        },  
        function (e) {  
          alert('Request file system failed: ' + e.message)  
        }  
      )  
    },  
    base64ToArrayBuffer(base64) {  
      const binaryString = atob(base64)  
      const len = binaryString.length  
      const bytes = new Uint8Array(len)  
      for (let i = 0; i < len; i++) {  
        bytes[i] = binaryString.charCodeAt(i)  
      }  
      return bytes.buffer  
    },
2025-07-24 10:08 负责人:无 分享
已邀请:

最佳回复

DCloud_UNI_OttoJi

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

使用下面提供的方案,可以播放音频,也可以进一步封装。点击按钮之后会播放音频。

  • 阿乐呀 (作者)

    这个适用app吗,我用plus.io可以吗

    2025-07-25 17:08

  • DCloud_UNI_OttoJi

    回复 阿乐呀: 兼容的微信小程序,逻辑是一样的,你改改把,微信上播放音频成功了。你的这个这个格式叫 pcm ,主要参考我如何处理的 pcm 到 wav

    2025-07-25 17:38

  • 阿乐呀 (作者)

    回复 DCloud_UNI_OttoJi: 谢,大哥,抱拳

    2025-07-25 17:52

DCloud_UNI_OttoJi

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

提供 HBuilderX 版本、vue 版本、运行的具体平台,比提供一个 base64 编码的文本内容

  • DCloud_UNI_OttoJi

    回复 阿乐呀: base64 不完整,提供具体的前缀格式

    2025-07-25 11:56

  • DCloud_UNI_OttoJi

    你的 HBuilderX 版本太老了,使用最新的 alpha 试一下

    2025-07-25 11:56

  • 阿乐呀 (作者)

    回复 DCloud_UNI_OttoJi: 这是tts返回的一段

    2025-07-25 15:05

  • DCloud_UNI_OttoJi

    回复 阿乐呀: 得明确格式呀,mp3/aac/wav 具体是什么格式?

    2025-07-25 15:53

  • DCloud_UNI_OttoJi

    回复 阿乐呀: 回复 阿乐呀: 你沟通下,确认返回的格式

    2025-07-25 16:01

  • 阿乐呀 (作者)

    回复 DCloud_UNI_OttoJi: raw、24000、16

    2025-07-25 16:03

  • DCloud_UNI_OttoJi

    回复 阿乐呀: 后缀确定是 raw 吗,或者你把文档发给我

    2025-07-25 16:30

  • 阿乐呀 (作者)

    回复 DCloud_UNI_OttoJi: 没有后缀,https://aiui-doc.xf-yun.com/project-1/doc-584/

    2025-07-25 16:35

  • 阿乐呀 (作者)

    回复 DCloud_UNI_OttoJi: 我在传参的时候,有传入格式:tts 合成参数设置


    参数 类型 必须 说明 示例

    vcn string 否 合成发音人 x2_xiaojuan

    tts_res_type string 否 合成下发url链接 固定取值:url

    tts.bit_depth int 是 合成音频位数 16

    tts.channels int 是 合成音频通道数 1

    tts.encoding string 是 合成音频格式:raw、lame raw

    tts.sample_rate int 是 合成音频采样率 16000

    2025-07-25 16:36

要回复问题请先登录注册