SSML 是一种基于 XML 的语音合成标记语言。使用 SSML 可以更加准确、具体的定义合成音频的效果。
语音合成标记语言 (SSML) 是一种基于 XML 的标记语言,可以指定如何使用文本转语音将输入文本转换为合成语音。 与纯文本相比,SSML 可让开发人员微调音节、发音、语速、音量以及文本转语音输出的其他属性。 SSML 可自动处理正常的停顿(例如,在句号后面暂停片刻),或者在以问号结尾的句子中使用正确的音调。
本文以微软AI语音合成为例,介绍SSML的语法使用说明。
支持文字转语音工具的链接:https://github.com/LokerL/tts-vue/releases/tag/1.8.5大家可以根据SSML语法介绍,替换不同的元素,尝试制作出属于自己个性的语音风格。
每个 SSML 文档是使用 SSML 元素(或标记)创建的。 这些元素用于调整音节、韵律、音量等。 以下部分详细说明了每个元素的用法,以及该元素是必需的还是可选的。
不要忘记将属性值括在双引号中。 适当格式的有效 XML 的标准要求将属性值括在双引号中。 例如,<prosody volume="90">
是适当格式的有效元素,而 <prosody volume=90>
则不是。 SSML 可能无法识别未括在双引号中的属性值。
speak
元素是根元素。 对于所有 SSML 文档都是必需的。 speak
元素包含重要信息,例如版本、语言和标记词汇定义。
语法
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="string"></speak>
属性
version
,指示用于解释文档标记的 SSML 规范的版本。 当前版本为 1.0。是必填项;xml:lang
,指定根文档的语言。 可以包含两个小写字母的语言代码,例如 en。 或者值也可以包含语言代码和大写的国家/地区,例如 en-US。是必填项;
3.xmlns
,指定文档的 URI,用于定义 SSML 文档的标记词汇(元素类型和属性名称)。 当前 URI 为 http://www.w3.org/2001/10/synthesis 。是必填项;
voice
元素是必需的。 它用于指定文本转语音所用的语音
语法
<voice name="string">
这是我们需要转换语音的文本.
</voice>
属性
name
,标识用于文本转语音输出的语音。微软AI语音库支持,跨 129 种语言和变体的 330 多种神经网络声音。详情参考语言。
示例
本示例使用
zh-CN-YunjianNeural
语音。
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
<voice name="zh-CN-YunjianNeural">
这是需要转换语音的文本。
</voice>
</speak>
在speak
元素中,可为文本转语音输出指定多种语音。 这些语音可以采用不同的语言。 对于每种语音,必须将文本包装在voice
元素中。
属性name
,标识用于文本转语音输出的语音。
示例
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
<voice name="zh-CN-XiaoxiaoNeural">
女生的声音
</voice>
<voice name="zh-CN-YunjianNeural">
男生的声音
</voice>
</speak>
默认情况下,文本转语音使用中性讲话风格来合成文本。 可在句子层面调整讲话风格、风格强度和角色。
可使用mstts:express-as
元素来表达情感(例如愉悦、同情和冷静)。 也可以针对不同场景(例如客户服务、新闻广播和语音助理)优化语音。
语法
<mstts:express-as style="string"></mstts:express-as>
示例
此 SSML 代码片段演示如何使用 <mstts:express-as>
元素将讲话风格更改为 cheerful。
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis"
xmlns:mstts="https://www.w3.org/2001/mstts" xml:lang="en-US">
<voice name="zh-CN-YunjianNeural">
<mstts:express-as style="cheerful">
今天的CBA篮球比赛看着真精彩!
</mstts:express-as>
</voice>
</speak>
不同Style
的说明:
style="advertisement-upbeat"
用兴奋和精力充沛的语气推广产品或服务。
style="affectionate"
以较高的音调和音量表达温暖而亲切的语气。 说话者处于吸引听众注意力的状态。 说话者的个性往往是讨喜的。
style="angry"
表达生气和厌恶的语气。
style="assistant"
以热情而轻松的语气对数字助理讲话。
style="calm"
以沉着冷静的态度说话。 语气、音调和韵律与其他语音类型相比要统一得多。
tyle="chat"
表达轻松随意的语气。
style="cheerful"
表达积极愉快的语气。
style="customerservice
“ 以友好热情的语气为客户提供支持。
style="depressed"
调低音调和音量来表达忧郁、沮丧的语气。
style="disgruntled"
表达轻蔑和抱怨的语气。 这种情绪的语音表现出不悦和蔑视。
style="embarrassed"
在说话者感到不舒适时表达不确定、犹豫的语气。
style="empathetic"
表达关心和理解。
style="envious"
当你渴望别人拥有的东西时,表达一种钦佩的语气。
style="excited"
表达乐观和充满希望的语气。 似乎发生了一些美好的事情,说话人对此非常满意。
style="fearful"
以较高的音调、较高的音量和较快的语速来表达恐惧、紧张的语气。 说话人处于紧张和不安的状态。
style="friendly"
表达一种愉快、怡人且温暖的语气。 听起来很真诚且满怀关切。
style="gentle"
以较低的音调和音量表达温和、礼貌和愉快的语气。
style="hopeful"
表达一种温暖且渴望的语气。 听起来像是会有好事发生在说话人身上。
style="lyrical"
以优美又带感伤的方式表达情感。
style="narration-professional"
以专业、客观的语气朗读内容。
style="narration-relaxed"
为内容阅读表达一种舒缓而悦耳的语气。
style="newscast"
以正式专业的语气叙述新闻。
style="newscast-casual"
以通用、随意的语气发布一般新闻。
style="newscast-formal"
以正式、自信和权威的语气发布新闻。
style="poetry-reading"
在读诗时表达出带情感和节奏的语气。
style="sad"
表达悲伤语气。
style="serious"
表达严肃和命令的语气。 说话者的声音通常比较僵硬,节奏也不那么轻松。
style="shouting"
就像从遥远的地方说话或在外面说话,但能让自己清楚地听到。
style="sports-commentary"
用轻松有趣的语气播报体育赛事。
style="sports-commentary-excited"
用快速且充满活力的语气播报体育赛事精彩瞬间。
style="whispering"
说话非常柔和,发出的声音小且温柔。
style="terrified"
表达一种非常害怕的语气,语速快且声音颤抖。 听起来说话人处于不稳定的疯狂状态。
style="unfriendly"
表达一种冷淡无情的语气。
可调整讲话风格的强度,更好地适应你的使用场景。 可以使用styledegree
属性指定更强或更柔和的风格,使语音更具表现力或更柔和。
语法
<mstts:express-as style="string" styledegree="value"></mstts:express-as>
此 SSML 片段说明了如何使用 styledegree
属性更改 zh-CN-XiaomoNeural
讲话风格的强度。
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis"
xmlns:mstts="https://www.w3.org/2001/mstts" xml:lang="zh-CN">
<voice name="zh-CN-XiaoxiaoNeural">
<mstts:express-as style="sad" styledegree="2">
快走吧,路上一定要注意安全,早去早回。
</mstts:express-as>
</voice>
</speak>
除了调整说话风格和风格程度,还可调整 role 参数,使语音模拟不同的年龄和性别。 例如,男性语音可以提高音调和改变语调来模拟女性语音,但语音名称不会更改。这些中文(普通话,简体)神经语音支持角色调整:
- zh-CN-XiaomoNeural
- zh-CN-XiaoxuanNeural
- zh-CN-YunxiNeural
- zh-CN-YunyeNeural
语法
<mstts:express-as role="string" style="string"></mstts:express-as>
示例
此 SSML 片段说明了如何使用 role 属性来更改 zh-CN-XiaomoNeural 的角色扮演。
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis"
xmlns:mstts="https://www.w3.org/2001/mstts" xml:lang="zh-CN">
<voice name="zh-CN-XiaomoNeural">
女儿看见父亲走了进来,问道:
<mstts:express-as role="YoungAdultFemale" style="calm">
“您来的挺快的,怎么过来的?”
</mstts:express-as>
父亲放下手提包,说:
<mstts:express-as role="OlderAdultMale" style="calm">
“刚打车过来的,路上还挺顺畅。”
</mstts:express-as>
</voice>
</speak>
支持的角色
role="Girl"
该语音模拟女孩。
role="Boy"
该语音模拟男孩。
role="YoungAdultFemale"
该语音模拟年轻成年女性。
role="YoungAdultMale"
该语音模拟年轻成年男性。
role="OlderAdultFemale"
该语音模拟年长的成年女性。
role="OlderAdultMale"
该语音模拟年长的成年男性。
role="SeniorFemale"
该语音模拟老年女性。
role="SeniorMale"
该语音模拟老年男性。
使用 break 元素可在单词之间插入停顿或中断。 还可使用它来防止文本转语音自动添加的暂停。
如果某个字词或短语的合成语音听起来不自然,可以使用此元素来重写该字词或短语的默认文本转语音行为。 将
strength
设置为none
可防止文本转语音自动插入的韵律停顿。
语法
<break strength="string" />
<break time="string" />
属性
strength
,指定暂停的相对持续时间。包含的值有:
- None,0 毫秒
- x-weak, 250 毫秒
- weak,500 毫秒
- medium,750 毫秒(默认值)
- strong,1,000 毫秒
- x-strong,1,250 毫秒
time
,指定暂停的绝对持续时间,以秒或毫秒 (ms) 为单位。 应将此值设置为小于 5000 毫秒。 例如,2s 和 500ms 是有效值。
示例
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
<voice name="zh-CN-XiaoxiaoNeural">
感谢你能在下雨天 <break time="500ms" /> 送我回家.
</voice>
</speak>
使用mstts:silence
元素在文本前后,或者在两个相邻句子之间添加暂停。
mstts:silence
和break
之间的区别在于,break
可添加到文本中的任何位置。 静音仅适用于输入文本的开头或结尾,或者两个相邻句子的分界处。
语法
<mstts:silence type="string" value="string"/>
属性type
指定添加静音的位置,包括:
- Leading – 在文本的开头
- Tailing – 在文本的结尾
- Sentenceboundary – 在相邻句子之间
Value
指定暂停的绝对持续时间,以秒或毫秒为单位。 应将此值设置为小于 5000 毫秒。 例如,2s 和 500ms 是有效值。
示例
在本例中,mtts:silence 用于在两个句子之间添加 200 毫秒的静音。
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xmlns:mstts="http://www.w3.org/2001/mstts" xml:lang="en-US">
<voice name="zh-CN-YunjianNeural">
<mstts:silence type="Sentenceboundary" value="200ms"/>
莫听穿林打叶声,何妨吟啸且徐行。竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。
料峭春风吹酒醒,微冷,山头斜照却相迎。回首向来萧瑟处,归去,也无风雨也无晴。
</voice>
</speak>
p
和s
元素分别用于表示段落和句子。 如果不指定这些元素,则文本转语音会自动确定 SSML 文档的结构。
p
元素可包含文本和以下元素:audio
、break
、phoneme
、prosody
、say-as
、sub
、mstts:express-as
和 s
。
s
元素可包含文本和以下元素:audio
、break
、phoneme
、prosody
、say-as
、sub
、mstts:express-as
。
语法
<p></p>
<s></s>
示例
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
<voice name="en-US-JennyNeural">
<p>
<s>Introducing the sentence element.</s>
<s>Used to mark individual sentences.</s>
</p>
<p>
Another simple paragraph.
Sentence structure in this paragraph is not explicitly marked.
</p>
</voice>
</speak>
prosody
元素用于指定文本转语音输出的音节、调型、范围、速率和音量的变化。prosody
元素可包含文本和以下元素::audio
、break
、phoneme
、prosody
、say-as
、sub
、p
和 s
。
由于韵律属性值可在较大范围内变化,因此,语音识别器会将分配的值解释为所选语音的建议实际韵律值。 文本转语音将限制或替代不支持的值。 例如,音节 1 MHz 或音量 120 就是不支持的值。
语法
<prosody pitch="value" contour="value" range="value" rate="value" volume="value"></prosody>
属性
1.pitch
指示文本的基线音节。 可将音调表述为:
- 以某个数字后接“Hz”(赫兹)表示的绝对值。 例如,<prosody pitch=”600Hz”>some text</prosody> 。
- 以前面带有“+”或“-”的数字,后接“Hz”或“st”(用于指定音节的变化量)表示的相对值。 例如 <prosody pitch=”+80Hz”>some text</prosody> 或 <prosody pitch=”-2st”>some text</prosody>。 “st”表示变化单位为半音,即,标准全音阶中的半调(半步)。
- 常量值:
x-low
low
中
high
x-high
默认值
2.contour Contour
现支持神经语音。 调型表示音节的变化。 这些变化以语音输出中指定时间处的目标数组形式表示。 每个目标由参数对的集定义。 例如:
<prosody contour="(0%,+20Hz) (10%,-2st) (40%,+10Hz)">
每参数集中的第一个值以文本持续时间百分比的形式指定音节变化的位置。 第二个值使用音节的相对值或枚举值指定音节的升高或降低量。
3.range
表示文本音节范围的值。 可使用用于描述pitch
的相同绝对值、相对值或枚举值表示range
。
4.rate
指示文本的讲出速率。 可将 rate 表述为:
以充当默认值倍数的数字表示的相对值。 例如,如果值为 1,则速率不会变化。 如果值为 0.5,则速率会减慢一半。 如果值为 3,则速率为三倍。
常量值:
x-slow
slow
中
fast
x-fast
默认值
4.volume
指示语音的音量级别。 可将音量表示为:
以从 0.0 到 100.0(从最安静到最大声)的数字表示的绝对值。 例如 75。 默认值为 100.0。
以前面带有“+”或“-”的数字表示的相对值,指定音量的变化量。 例如 +10 或 -5.5。
常量值:
silent
x-soft
soft
中
loud
x-loud
默认值
可在字词或句子层面应用语速。
示例
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
<voice name="zh-CN-XiaoxiaoNeural">
<prosody rate="+30.00%">
我的语速比正常人快。
</prosody>
</voice>
</speak>
可在句子层面应用音量的变化。
示例
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
<voice name="zh-CN-XiaoxiaoNeural">
<prosody volume="+20.00%">
我的音量比正常人高。
</prosody>
</voice>
</speak>
可在句子层面应用音节的变化。
示例
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
<voice name="zh-CN-XiaoxiaoNeural">
欢迎来 <prosody pitch="high">尝试更改音高。</prosody>
</voice>
</speak>
示例
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
<voice name="zh-CN-YunjianNeural">
<prosody contour="(60%,-60%) (100%,+80%)" >
你确定这样能更改音高升降曲线吗?
</prosody>
</voice>
</speak>
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
<voice name="zh-CN-YunjianNeural">
郊外的早晨雾气笼罩在一片。
</voice>
</speak>
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
<voice name="zh-CN-XiaoxiaoNeural">
在人们的欢乐海洋中。一支运货的骡队刚进入城门。
</voice>
<voice name="zh-CN-YunjianNeural">
姑娘便拦下第一排的小哥。
</voice>
</speak>
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis"
xmlns:mstts="https://www.w3.org/2001/mstts" xml:lang="en-US">
<voice name="zh-CN-YunjianNeural">
<mstts:express-as style="sports-commentary">
今天的足球比赛看着真精彩!
</mstts:express-as>
</voice>
</speak>
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis"
xmlns:mstts="https://www.w3.org/2001/mstts" xml:lang="zh-CN">
<voice name="zh-CN-XiaoxiaoNeural">
<mstts:express-as style="sad" styledegree="2">
他擦了擦汗,带着运货队伍,径直穿过闹巷,耳边充斥着各种叫卖声
</mstts:express-as>
</voice>
</speak>
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis"
xmlns:mstts="https://www.w3.org/2001/mstts" xml:lang="zh-CN">
<voice name="zh-CN-XiaomoNeural">
突然,一匹马不知怎么受了惊,在路上嘶鸣狂奔,一个孩子也吓坏了,跌跌撞撞地扑向大人怀里,大声喊道:
<mstts:express-as role="Girl " style="fearful ">
“妈妈,妈妈!”
</mstts:express-as>
妈妈放下手中的包包,说:
<mstts:express-as role="OlderAdultFemale " style="calm">
“不怕不怕,有妈妈在呢,乖呀。”
</mstts:express-as>
</voice>
</speak>
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
<voice name="zh-CN-XiaoxiaoNeural">
归去,也无风雨 <break time="500ms" /> 也无晴。
</voice>
</speak>
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xmlns:mstts="http://www.w3.org/2001/mstts" xml:lang="en-US">
<voice name="zh-CN-YunjianNeural">
<mstts:silence type="Sentenceboundary" value="200ms"/>
莫听穿林打叶声,何妨吟啸且徐行。竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。
料峭春风吹酒醒,微冷,山头斜照却相迎。回首向来萧瑟处,归去,也无风雨也无晴。
</voice>
</speak>
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
<voice name="zh-CN-XiaoxiaoNeural">
<prosody rate="+30.00%">
不啦不啦,赶着上货,再晚就供应链断裂了。
</prosody>
</voice>
</speak>
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
<voice name="zh-CN-XiaoxiaoNeural">
<prosody volume="+20.00%">
“亲,本店今日特惠,鞋履全场半价,走过路过不要错过!
</prosody>
</voice>
</speak>
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
<voice name="zh-CN-XiaoxiaoNeural">
爆款 <prosody pitch="high">纱帽头盔,7天无理由退货;</prosody>
</voice>
</speak>