讯飞文字转语音base64音频上传后端丢失

在小程序uniapp环境下,使用讯飞接口,返回base64语音。
1、直接将base64 提交到php后端,接收后转成临时文件,但是总是少一截,语音时长是正常得,但是只能播一两秒。然后我将base64加成2倍,让base64+base64,后端转临时文件能基本完成播放成功内容。
2、我前端得base64和后端接收得base64长度都打印看过是一样得,不知道为什么了T_T。
3、还有,我试图小程序前端播放看看是否正常,但是试了好多方法都不行,base64转buffer一直有问题,不过这是另说了,主要还是后端接收问题,因为需要上传语音存储。

img

根据你的描述,在uniapp小程序中使用讯飞语音转base64,提交给PHP后端转存临时文件播放时,总是少一截,播放时间短。这通常是base64编码导致的数据损失或解析错误。
可能的原因有:

  1. base64编码后的字符串过长,超出PHP后端所能处理的长度,导致数据丢失,播放时间短。
  2. 小程序与PHP后端的编码方式不同,导致base64解析结果不正确,音频数据错误,播放时间短。
  3. base64编码 double传输,第一次发送的数据没有完全接收,再次发送导致重复数据,音频内容错误。
  4. PHP后端写入临时文件的方式导致数据丢失,文件内容与base64不符,播放时间短。

解决方法:

  1. 限制base64编码后的字符串长度,在小程序/后端分段进行base64编码与解码,防止数据丢失。
  2. 确认小程序与后端的编码设置相同,建议小程序请求header中设置:Content-Type: "text/plain;charset=utf-8",并确认PHP后端接收的编码方式为UTF-8,从而防止base64解析错误。
  3. 取消base64 double传输方式,改为在小程序播放base64确认无误后再发给后端处理,防止重复数据。
  4. PHP后端在写入临时文件之前,应使用base64_decode对base64字符串进行解码,得到文件实际二进制内容,再写入文件。直接用base64字符串内容写入,会导致数据丢失。
  5. 此外,为确保base64编码与解码无误,您可以:
  • 在小程序请求中不仅传输base64字符串,同时传输原二进制内容。后端接收时,对比二者是否一致,以校验base64编码结果。
  • 在小程序前端播放base64编码后的音频文件,确认可以正常播放全长内容,再由后端尝试解码,如仍然播放时间短,则可判断为后端解析问题。
  1. 检查后端错误日志,寻找更详尽的报错信息,以定位问题根源。您也可以提供具体代码给技术支持人员分析调试。