什么是 SSML?
SSML 代表语音合成标记语言。它使你能够对AI合成语音(称为文本到语音或 TTS)进行微调和调整,以使它们听起来更自然或纠正常见的错误发音。可以把它想象成 网页中的CSS,但用于语音应用程序和语音系统。
你不仅可以使用 SSML 使语音合成系统以不同的方式发音,还可以添加诸如中断和暂停之类的内容,以及加快、减慢或调整语音的音高等,以改变节奏和使讲话听起来更自然。
为什么需要 SSML?
当你通过 TTS 系统收听书面对话时,听起来并不总是你想象的或你想要的。有时听起来可能不够人性化或不够自然。有时听起来很刺耳。SSML 是帮助你解决此问题的重要工具。
例如:
- TTS系统可能会误读你的品牌名称
- 它可能说得不够清楚
- 也许它有点太快了,让所说的一时难以消化
- 你可能想要强调句子的特定部分。
这就是 SSML 有用的地方。
如何使用 SSML?
要在对话系统中使用 SSML,只需像使用任何其他代码一样标记对话
例如,在网页设计中,要创建一段文本,你可以使用如下所示的“p”标签来标记你的代码:
<p>这是一段文字。</p>
Code language: HTML, XML (xml)
对于对话系统,同样的原则也适用。
从文本到语音系统中读取的所有口语对话都必须包含 <speak>
标签,如下所示:
<speak>嗨,我叫 VUX。</speak>
Code language: HTML, XML (xml)
<speak>
标签告诉 TTS 系统,其中包含的单词是要说出来的。
将对话包装在语音标签中后,你可以在 <speech>
标签中使用许多其他标签来创建你想要的效果。
SSML 标签示例
可用于操作 TTS 系统的常见 SSML 标签有:
- audio:将音频文件嵌入到对话中。非常适合添加耳塞之类的东西
- break : 插入一个指定秒数或毫秒数的暂停
- emphasis: 把标记的词说得更大更慢
- lang:指定语音应该说的预期语言
- p:段落标记,在标记文本之后添加暂停以表示段落的结尾
- phoneme :允许你通过将语音字母表中的单个音素组合在一起来构造单词的特定发音
- prosody:让你调整文本的音量、速率(速度)和音高
- s:在句末添加停顿。类似于 p 标签,只是停顿更短
- say-as:让你更改某些单词、短语或数字的发音方式。例如,如果你希望将数字 1234 读取为“一、二、三、四”或“一千二百三十四”,以及许多其他选项。
- speak:根元素。所有口语文本都包含在此标签中。
- sub : 用一个词替换另一个词。例如,将书面单词“eg”发音为“for example”
- voice:指定 TTS 语音(通常在 Alexa 技能中用于调用 Amazon Polly 语音而不是内置的 Alexa 语音)
- w:用于将单词的发音从现在变为过去的原则,例如“read”和“read” ie “I’m going to read something” vs “I read a book tomorrow”,以及许多其他选项
一些语音助手和语音合成系统具有其平台独有的特定标签。不过,从广义上讲,大多数系统都允许使用标准标签,但你应该始终与你的供应商核实,以确保这一点。
如何在语音合成系统中使用 SSML 标签
在对话中插入特定的 SSML 标签很简单。
假设你希望合成语音在句子结尾暂停片刻。只需输入句号.
将自行完成此操作,无需任何特定标记。一个 .
将插入 500 毫秒到 1 秒之间的暂停,具体取决于系统。
但是,假设你想进行调整以增加停顿的长度以创造戏剧效果。在这里,你将在对话中你希望系统暂停的位置插入一个 标记:
<speak>嗨,我叫 VUX,这是今天的新闻。< break time= "2s" />
天气预备...</speak>
Code language: HTML, XML (xml)
或者你可能想放慢对话的速度。你可以试试:
<speak>< prosody rate = "x-slow" >嗨,我叫 VUX。</prosody>
Code language: HTML, XML (xml)
嵌套 SSML 标签
就像使用 HTML 一样,你可以将 SSML 标签相互嵌套,以将许多对话操作拼接在一起。
这有点像在 Web 开发中在
标记中插入 标记:
<p>世界震撼人心。<a href="https://guancha.cn">在这里查看。</a></p>
Code language: HTML, XML (xml)
假设你想提高单个单词的音高,并让该单词以法国口音发音,你可以使用以下内容:
<speak> < prosody pitch = "high" > < lang xml:lang = "fr-FR" > Bonjour!</lang></prosody> </speak>
Code language: HTML, XML (xml)
这些操作适用于标准 TTS 语音,但不适用于神经网络语音。
测试和预览 SSML 编辑
创建这些SSML代码后,需要验证更改是否达到要求,有许多工具可执行此操作,包括:
- Amazon Polly
- Google Cloud
- TopVoiceApps
在哪里可以找到完整的 SSML 参考指南?
有关所有标签类型的代码示例的完整 SSML 参考指南,请尝试:
(亚马逊)[https://developer.amazon.com/en-US/docs/alexa/custom-skills/speech-synthesis-markup-language-ssml-reference.html]
(谷歌)[https://cloud.google.com/text-to-speech/docs/ssml]
(微软)[https://docs.microsoft.com/en-us/azure/cognitive-services/speech-service/speech-synthesis-markup?tabs=csharp]
请注意,这些都是基于各自的系统下编写的。这意味着你可能会发现某些标签在你选择的 TTS 系统中不起作用
SSML 的局限性
尽管 SSML 很棒,但它并不完美:调整音素以完美地发音品牌名称。以适当的停顿水平来微调节奏,使声音听起来更自然。这一切都需要工作。
使用 SSML 操作通用 TTS 并不总是有好的结果
通用语音使 TTS 系统难以针对某些用例进行更改。例如,假设你正在设计一个语音应用程序,并且你希望你的声音听起来超级生动和快乐,这有点像试图将吉他变成钢琴,因为 通用 TTS 声音是为通用目的而构建的。
为什么 SSML 不能随心所欲地改变声音的声音
使用 SSML 时,你实际上所做的是向 TTS 系统提供有关它应该如何操作其产生的音频的说明。你不是在“调整声音”。
例如,如果你使用 <prosody>
标签来减慢语速;从技术上讲,为了减慢声音,TTS 系统所做的只是延长它产生的音频的时间,以使每个样本更长。
为什么音频比特率很重要
CD(光盘,还记得吗?)可以以每秒 44,100 位的速度播放音频文件。即 44,100 个单独的数据位在一秒钟内连续击中你的耳朵。
自然,对于人耳,你无法区分每个单独的位,因此听起来像是稳定的音频流。
它的工作方式与视频相同。每秒 24 帧的视频只是连续 24 张静止图像。你的眼睛无法处理足够快的图像变化,所以它看起来像一个视频。音频也是如此。
TTS 系统的比特率是多少?
TTS 系统的“比特率”可以低至每秒 200 比特,或高达 1,200。低比特率很有帮助,因为它有助于将音频快速返回到语音应用程序,并且尽可能少地使用互联网带宽。
这样做的一个原因是确保系统在互联网连接下降时仍然可以说话,另一个原因是它可以足够快地提供音频以模拟与用户的真实对话。人类往往会在 200 毫秒内做出回应。如果语音应用程序的响应时间比响应时间长得多,那么用户体验就会受到影响,就好像系统没有听到你的声音,无法回答你或者不够聪明,无法快速思考。
由于 TTS 系统通常会生成低比特率(低“质量”)音频文件以在语音用户界面中为用户提供服务,因此应用 SSML 标记(音频操作)最终会导致质量更低的音频。
这就是为什么你的 SSML 听起来并不总是很好的原因。
在使用 SSML 标签来减慢语音的速率(速度)的示例中;当你放慢音频速度时,你会将低比特率音频文件的时间拉伸到断点。它听起来很扭曲,因为它被 扭曲了。它极大地拉伸了音频,以至于在这些“位”之间产生了很小的沉默间隙。然后,它将音频向下移动几个键,因此听起来“更深”(如果不降低音高,你无法减慢一段音频)。
这只是 SSML 的一部分。那是一个标签。许多 SSML 标签或多或少都存在这种限制,这就是为什么 SSML 不能用于大型语音操作的原因。
你应该使用 SSML 做什么
SSML 适于对语音进行微调,如果试图过多地操纵声音,很可能你始终无法让它听起来正常
《SSML(语音合成标记语言)初学者指南》有1条评论