同一个公司的api调用方式大差不差,只要跟着官方api文档一步步进行操作即可。(官方api文档地址:语音合成(流式版)WebAPI 文档 | 讯飞开放平台文档中心 (xfyun.cn))前面已经研究过讯飞的api主要调用流程,这里主要记录一下调用语音合成过程中遇到的问题和解决方法。
-
传输的文本内容要进行base64编码
这个可以使用之前下载的包CryptoJS,其中有可以用来将string内容进行base64编码的函数,由于其中包含汉字,base64编码钱需要将其先转化为utf8编码。代码:
var text_origin = "及你抬眉"//要读的文字,根据api文档上传文字需要进行base64编码后上传
var text_utf8 = CryptoJS.enc.Utf8.parse(text_origin)//这里使用的是汉字,需要把字符串转化为utf8编码
var text = CryptoJS.enc.Base64.stringify(text_utf8)//进行base64编码
//-----------------------------------------------------------------------------
编码完成后直接将其填入要发送的数据包中即可:
data:{
'text':text,
'status':2,
}
-
关于传回的音频
·简介
传回的音频格式为base64编码,如下图2-1,音频内容存储在data.data.audio中。
图2-1
如果语音信息过长,服务器回将传回的语音分多次传回,若是多次传回,则可以根据data.data.status值来判断,1为未传完,2为传完。
图2-2
·数据问题
出于某种问题,像下列代码直接访问audio不可取。
let sound = res.data.data.audio
单独输出res.data,结果如图2-3.
图2-3
可见这里读取到res.data以后,其内容转化为了字符串形式而不是json,这可能是编译器的bug也可能是因为连续两级名称为data不可取,总之需要处理一下使之变换回json的形式,然后再读取audio和其他部分的内容。
let sound1 = JSON.parse(res.data)//parse:将字符串转化为json
let sound = sound1.data.audio
·音频的播放
这里获取到的音频不可直接播放,需要将其解码后存入本地文件,需要用到微信自带的api文件管理器。首先获取管理器,并创建文件:
fs = wx.getFileSystemManager(), // 文件管理器API
xunfei_ttsPath : `${wx.env.USER_DATA_PATH}/sound${new Date().getTime()}.mp3`,//这里音频的文件名以最新的时间来命名防止和其他音频混合导致错误
this.data.fs.writeFile({//写文件,在没有文件时创建一个文件
filePath: that.data.xunfei_ttsPath ,
data: "",
success: (res) => {
console.log("创建mp3文件成功")
},
fail:(res)=>{
console.log(res)
}
})
获取传回的音频:
that.data.fs.appendFile({//在文件结尾添加(这里因为传回的数据可能是分片的)
filePath: that.data.xunfei_ttsPath ,
data: sound,
encoding: 'base64'
})
然后就可以根据文件的地址进行播放了。这里再提一嘴默认存储路径的查看(图2-4)
图2-4
进入后我们的音频就在usr中(图2-5)
图2-5
图2-6
文章性质为本人学习后做的笔记,如有侵权请联系本人删除。