项目场景:
近期在做项目过程中,需要一个点击每条信息上面的按钮,进行语音播报的效果,因每条信息上的文本都不一致,需要对文本进行转义,通过小程序的plugin.textToSpeech()将文本转换为音频,然后正常按照音频的相关方法进行播放即可。
问题描述:
电脑真机运行以及IOS上运行都没问题,但是安卓企业微信上会有将近30s的延迟
原因分析:
刚碰到这个问题查了许多方案,后来干脆想等企业微信升级,但最后还是觉得可以搞一波,可以i从头分析一下,通过小程序的plugin.textToSpeech()转换出来的结果中res.filename为我们 需要的音频地址。
plugin.textToSpeech({
lang: "zh_CN",
tts: true,
content: e,
success: function(res) {
//that.conChangeIf = res.origin; //转换后的音频内容
innerAudioContext.src = res.filename; //设置音频地址
},
fail: function(res) {
console.log("fail:", res)
}
})
1、开始以为文字转音频太慢,打印了一下日志,然后发现哎哟~~,文字转语音的这个步骤人家还是蛮快的呀
2、难道按住转出来的音频有问题?再打印一波,然后拿安卓上打印出来的音频在浏览器上播放,哎哟哟~~贼溜,不过嘛,这一打印还是有发现的:
res.filename返回的结果为一个mp3音频格式路径(但这个出来后是直接被下载的数据流,安卓企业微信对数据流的直接播放有一个过程时间)
网上查了许多方案,有说是 讯飞语音合成MP3文件格式问题,让后台改一下音频格式,
参考:微信小程序wx.createInnerAudioContext()在安卓手机不能播放语音文件问题解决 | 微信开放社区
嗯。。。。但是!!当前这个项目后台访问外网很费劲,几乎是不允许的,所以呢!以上方案对我不可行!悲伤辣么大!!!(安卓上打印出来的音频地址在谷歌浏览器这边将文件先下载下来后,上传到服务器上,然后发现。。。嗯,人家合成的mp3音频并不卡嘛,所以问题定位了:就是企业微信对数据流的操作有问题)
解决方案:
既然企业微信直接播放数据流太慢,那我可以把这个数据流下载完成后当作一个普通的mp3的音频文件去播放
textToVoice(e) {
var that = this
plugin.textToSpeech({
lang: "zh_CN",
tts: true,
content: e,
success: function(res) {
wx.downloadFile({
url:res.filename,
success (res) {
innerAudioContext.src = res.tempFilePath; //设置音频地址
that.end();
that.yuyinPlay();
}
})
},
fail: function(res) {
console.log("fail:", res)
}
})
},
//播放语音
yuyinPlay(e) {
let that=this;
if (that.srcvoice == '') {
return;
}
innerAudioContext.seek(0);
innerAudioContext.play();
wx.setStorage({
key:"playCon",
data:that.conChangeIf
})
},
end(){
innerAudioContext.stop();
}
Tips:记得在合适的位置移除掉你下载的文件哦!!!