使用阿里云TTS进行精细情感语音合成

0.为什么用阿里云TTS

原来计划使用的产品:腾讯智影,缺点有:

  1. 价格昂贵
  2. 可用的声音数量偏少
  3. 使用的音色情感变化少,支持多情感的音色只有一个

阿里云的优点:

  1. 多情感音色
  2. 价格便宜
  3. 操作更可控
以下内容针对阿里云网页免费版额度使用完了的情况,在阿里云的设计下,音频合成只能通过他的网络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>

这只是一个思路演示,在实际的使用中,可以灵活使用代码,得到我们实际想要的效果。

最后修改:2025 年 07 月 19 日
如果觉得我的文章对你有用,请随意赞赏