阿里云文字转语音实时接口对接经验,语音合成tts问题汇总
语音合成http接口:
接口文档:https://help.aliyun.com/zh/isi/developer-reference/restful-api-3
语音合成WebSocket协议接口:
接口文档:https://help.aliyun.com/zh/isi/developer-reference/streaming-text-tts-wss
从易用性来说,http的使用成本是最低的,比较大家都比较熟悉http接口的调用,url上拼上参数,就能得到mp3/wav/pcm的音频文件返回。
但是阿里云这http接口,竟然没有返回跨域头,无法在web网页上通过 js ajax 跨域调用。
后来想来想去,根本不用ajax跨域,换了个思路,实现了跨域调用接口,直接在浏览器的网页把接口调通了,把音频在浏览器里播放出来了。
没想通之前,我甚至想通过阿里云的FC函数计算,去把阿里云的接口套一层,加上跨域的header头:Access-Control-Allow-Origin: *
想通之后,就不用再做服务的中转、代理了,直连阿里云接口,速度更快。
这个http接口用起来是比较舒服了,几乎无需使用ws接口了。
如果说要 推荐国内的文字转换语音API接口,我能想到的就是阿里云的语音合成、七牛云的语音合成了 ,阿里云的我用起来感觉还不错,http接口很快,一般是350ms的延迟,能实时把文字朗读出来,语音语调的感情也还不错,多音字的处理也还不错。http的实时接口,比起使用ws协议的接口太方便了。
1、通过ws传数据给阿里,字数太少,后端不返回二进制数据。
2、有时候发音有噪音混杂
3、句子末尾不打标点符号,后端有时候不返回音频。
4、阿里云WebSocket接口给出的音频,需要MediaSource对象来播放,iOS仅iPad支持,iPhone不支持,但安卓chrome、Windows chrome都支持,如果不使用 MediaSource来播放,没什么开源方法,要手写很多代码才能解决问题,引起放弃此方案。
5、有时候语音会自动增加一些嗯嗯嗯的拖沓的语气词,一般是\n\n多个换行符号会引起这样的现象。(这个能解决)
6、本来是能持续的发送数据,但是经常遇到间隔一会儿就无法发送文字了,需要新建ws连接再发送
var url = 'wss://nls-gateway-cn-shanghai.aliyuncs.com/ws/v1'
var token = '00xx'
url = url + `?token=${token}&ts=${Date.now()}`
var ws = new WebSocket(url);
WebSocket建立连接的时候,token参数放在url上就行了,token获取方法:获取阿里云token的教程
我比较建议使用 http 接口,用起来简单,ws接口太麻烦了。
服务器给出来的二进制数据,要解决iOS iPhone的播放,还比较麻烦。
讯飞以前有http的实时语音合成接口,后来关闭这些接口了,真是遗憾,然后讯飞的ws接口也是恶心:ws接口无法持续发送数据到讯飞服务器,一次ws连接就是一次性的,ws的双向通信、持久连接的特性是被讯飞废了。
阿里云的ws实时文字转语音,至少还支持多次发送文本去转换。
七牛云的语音合成,我ajax测试了,也是不支持跨域,这些云厂商,真是不管web的对接吗?难道大家都是在app端、服务器端对接吗?
1、推荐使用阿里云的http接口,比ws接口简单、快捷
2、注意MediaSource的兼容性,iOS 13 14 15 16 17 18目前是不兼容的,手动实现 MediaSource 的代价太大,如果组装blob使用 队列控制 audio标签来播放,控制播放顺序也是比较麻烦的。
3、一般wav音频文件较大,实测不到20个字,语音合成后的文件是118kb,改为mp3格式,仅15kb的文件,传输就更省时间了
4、MP3格式,也是iOS、安卓、safari、chrome普遍兼容的音频编码。