使用阿里云TTS进行精细情感语音合成
0.为什么用阿里云TTS
原来计划使用的产品:腾讯智影,缺点有:
- 价格昂贵
- 可用的声音数量偏少
- 使用的音色情感变化少,支持多情感的音色只有一个
阿里云的优点:
- 多情感音色
- 价格便宜
- 操作更可控
以下内容针对阿里云网页免费版额度使用完了的情况,在阿里云的设计下,音频合成只能通过他的网络API获取,所以要绕一点弯路,但是能用
1.第一步:登陆阿里云后台、apifox后台
登陆阿里云后台
点击这里登陆阿里云后台:https://signin.aliyun.com/login.htm?callback=https%3A%2F%2Fwww.aliyun.com%2F#/main
在其他方式最右边,有一个RAM用户,切换到RAM用户登陆
访问 https://nls-portal.console.aliyun.com/overview
可以看到AccessToken这里,每过24小时这里会消失,届时旁边会有一个生成按钮,每次生成一个token,记下这个token
登陆apifox后台
在阿里云的设计下,音频合成只能通过他的网络API获取,APIFOX是一个能管理API的平台
登陆apifox主页:https://apifox.com/
进入tts项目,看到这个界面就算OK
2.生成语音步骤
第一步:更新token
如果没有过24小时,token不用更改。
如果距上一次获取token已过24小时,阿里云后台显示有新的token,那么就要重新生成,复制。
在apifox的接口这里,找到POST-语音生成
找到Params
里的token
,粘贴刚才复制的token 到参数值
中,==点右上角保存==。
第二步:修改参数(发音人)
如果要修改发音人,那么要修改voice
这个参数。这个参数的值对应具体发音人,对照表格为:https://help.aliyun.com/document_detail/84435.htm#section-uft-ohr-827
例如,我要使用知米_多情感
这个音色,那么我就在表格里找到对应的voice参数值为zhimi_emo
把他填入到apifox里去。填写完记得保存。
第三步:生成说话内容
来到阿里云的语音合成产品体验网页:https://ai.aliyun.com/nls/tts
编辑要生成的文字内容。
切换到源代码
,可以看到整个说话如何发音都是由脚本控制的:
注意第一行的这里
<speak ... voice="zhimiao_emo">
这里的voice的值要和apifox参数那里的voice的值一致(同一个音色)
<speak volume="50" pitch="0" rate="0" voice="zhimiao_emo">
<emotion category="sad" intensity="1">
<s>
作为普通人,
<break time="2s" />
最好不要认为自己会是那少数的幸运儿。
</s>
</emotion>
</speak>
复制整个代码,回到apifox,将内容覆盖 text
字段
此时内容就编辑好了,点击右上角发送
,如果一切顺利,下方可以看到一个返回值为200的成功提示
点击下载,并将文件重命名为xxx.wav
,即可得到想要的音频。
额外的精细控制
在官方的编辑器中,有一些缺陷,例如一些特殊参数只能使用预制、或者不能再进一步控制一部分说话的情绪。
以停顿为例,我想做到停顿1.5秒,但是编辑器只允许停顿2秒 和1秒,这样怎么办呢?
切换到源代码
,可以看到整个说话如何发音都是由脚本控制的:
<speak volume="50" pitch="0" rate="0" voice="zhimiao_emo">
<emotion category="sad" intensity="1">
<s>
作为普通人,
<break time="2s" />
最好不要认为自己会是那少数的幸运儿。
</s>
</emotion>
</speak>
其中可以看到,停顿的代码由这一行控制:
<break time="2s" />
这里很自然就可以想到,如果把2s改成其他的数据,就做到了修改成我们要的时长。
这时候你会发现,似乎不能直接在网页端直接修改代码,这就是阿里云司马的地方了,
对此我的建议是:你使用一个代码编辑器,例如notepad3 notepad++ 等支持高亮的编辑器
手动修改一下,当然用系统自带记事本也可以,就是无法显示代码高亮
同理,我们可以分辨出代码里也有控制情感的部分:
...
<emotion category="sad" intensity="1">
....
</emotion>
这里的category
的值就代表了用哪一种情绪,这个情绪对应的值在这里可以查到:
https://help.aliyun.com/document_detail/101645.html#sectiondiv-g6w-isw-rmw
如果我们对代码稍作修改,我们就做到了在同一段文本中使用不同的情感
<speak volume="50" pitch="0" rate="0" voice="zhimiao_emo">
<!--第一段使用悲伤的情感-->
<emotion category="sad" intensity="1">
<s>
作为普通人,最好不要认为自己会是那少数的幸运儿。
</s>
</emotion>
<!--第二段使用快乐的情感-->
<emotion category="happy" intensity="1">
<s>
作为普通人,最好不要认为自己会是那少数的幸运儿。
</s>
</emotion>
</speak>
这只是一个思路演示,在实际的使用中,可以灵活使用代码,得到我们实际想要的效果。