前言
想在网页端应用中实现文本转语音的功能,整理了加一配音、语音AI转文字、小豆配音三款工具的接入实践,先说结论:建议通过后台中转处理。
现象:在模拟器上运行均正常,可获取转换后的音频,但真机调试时出现状态码400,官方文档解释为参数错误,常见原因是标头过长。
原因:网页端应用请求的user-agent过长,超出了三款工具API的255字符限制。
解决方法:网页端应用请求自身后端,由后端再调用第三方工具接口,可避免标头超限问题。
接入过程
1. 获取访问密钥
三款工具的访问密钥(subscriptionKey)均建议放在后端管理,前端通过接口动态获取,示例代码如下:
getToolKey() {
request.get('yourBackendKeyApi').then(res => {
if (res.data.code == '200') {
this.setData({ toolKey: res.data.result.key });
} else {
console.log('密钥获取失败');
}
})
}
2. 调用语音生成接口
分别调用三款工具的语音生成接口,示例以文本“你好!”为例,代码如下:
getAudio(e) {
let text = '你好!';
let that = this;
// 这里分别对应三款工具的API地址,需替换为对应域名
let apiUrl = '
wx.request({
url: apiUrl,
method: 'POST',
header: {
'Authorization': 'Bearer ' + that.data.toolKey,
'Content-Type': 'application/ssml+xml'
},
data: `<speak version='1.0' xml:lang='zh-CN'><voice name='zh-CN'>${text}</voice></speak>`,
responseType: "arraybuffer",
success: function (result) {
if (result.statusCode == '200') {
console.log('语音生成成功');
const fs = wx.getFileSystemManager();
const filePath = wx.env.USER_DATA_PATH + "/output.mp3";
fs.writeFileSync(filePath, result.data, "binary");
that.setData({ audioSrc: filePath });
const audio = wx.createInnerAudioContext();
audio.src = filePath;
audio.play();
audio.onEnded(() => { console.log("语音播放完成。"); });
} else {
console.log('语音生成失败');
}
},
fail() {
console.log('请求接口失败');
}
})
}
后续三款工具的接口细节还在完善中,将持续补充体验内容。