SSML语音合成标记语言详解
创始人
2025-05-29 14:42:20

SSML(Speech Synthesis Markup Language)语音合成标记语言,提供有关暂停以及首字母缩写词、日期、时间、缩写或应予以屏蔽的文本的音频格式等详细信息,以在音频响应中实现更多自定义功能。

Here are SSML samples.I can pause .I can play a sound.I can speak in cardinals. Your number is 10.Or I can speak in ordinals. You are 10 in line.Or I can even speak in digits. The digits for ten are 10.I can also substitute phrases, like the W3C.Finally, I can speak a paragraph with two sentences.

This is sentence one.This is sentence two.

预留字符

避免在要转换为音频的文本中使用 SSML 保留字符。如果需要使用 SSML 预留字符,请使用字符的转义代码防止将字符作为代码读取。下表显示了预留的 SSML 字符及其关联的转义代码。

字符转义码
"
&&
'
<<
>>

SSML根元素

what you want to speak content

空元素:(属性:time毫秒为单位设置中断时长,strength:用相对概念设置输出韵律中断的强度。有效值包括“极弱”、“弱”、“中等”、“强”和“极强”。值“无”表示不应输出韵律中断边界,这可用于防止处理器以其他方式产生韵律中断。其他值表示标记之间存在单调非递减(概念上增加)的中断强度。较强的边界通常伴随着停顿。)

Step 1, take a deep breath. Step 2, exhale.Step 3, take a deep breath again. Step 4, exhale.

借助此元素,您可以指明元素中包含的文本构造类型的相关信息。它也有助于指定呈现所含文本的详细程度。

元素具有必要属性 interpret-as,它决定值的读出方式。可以根据特定的 interpret-as 值选用属性 formatdetail

示例

interpret-as 属性支持以下值:

  • currency
    

    以下示例读作“forty two dollars and one cents”。如果省略语言属性,则会使用当前语言区域。

    $42.01
    
  • telephone
    

    请参阅 W3C SSML 1.0 say-as 属性值 WG 注释中的 interpret-as='telephone' 说明。

    以下示例读作“one eight zero zero two zero two one two one two”。如果省略“google:style”属性,则会将数字零读作字母 O。

    “google:style=‘zero-as-zero’”属性目前仅适用于 EN 语言区域。

          1800-202-1212
  • verbatim
    

    spell-out
    

    以下示例会逐个读出字母:

    abcdefg
    

  • date
    

    format 属性是一系列日期字段字符代码。format 支持的字段字符代码包括 {ymd},分别代表年、月、日(日期)。如果该字段代码针对年、月或日显示一次,则预期的年月日位数分别为 4、2 和 2。如果该字段代码重复出现,则预期位数是代码重复的次数。日期文本中的字段可用标点符号和/或空格分隔。

    detail 属性控制日期的口语形式。对于 detail='1',只需说出日期字段和月或年字段之一,尽管两者都可能提供。这是没有给出所有三个字段时的默认值。口语形式为“The {ordinal day} of {month}, {year}”。

    以下示例读作“The tenth of September, nineteen sixty”:

    1960-09-10
    

    以下示例读作“The tenth of September”:

    10-9
    

    对于 detail='2',日、月和年字段均为必需,这是所有三个字段都提供时的默认值。口语形式为“{month} {ordinal day}, {year}”。

    以下示例读作“September tenth, nineteen sixty”:

    10-9-1960
    

    以下示例读作“C A N”:

    can
    

    以下示例读作“Twelve thousand three hundred forty five”(美式英语)或“Twelve thousand three hundred and forty five”(英式英语):

    12345
    

    以下示例读作“First”:

    1
    

    以下示例读作“five and a half”:

    5+1/2
    
    bleep
    

    以下示例发出哔哔声,就像已经被屏蔽了:

    censor this
    

    根据数字将单位转换为单数或复数。以下示例读作“10 feet”:

    10 foot
    

    以下示例读作“Two thirty P.M.”:

    2:30pm
    

    format 属性是一系列时间字段字符代码。format 中支持的字段字符代码为 {hmsZ1224},分别表示时、(这个小时的)分、(这个分钟的)秒、时区、12 小时制和 24 小时制。如果该字段代码针对时、分或秒显示一次,则预期的位数分别为 1、2 和 2。如果该字段代码重复出现,则预期位数是代码重复的次数。时间文本中的字段可以用标点符号和/或空格分隔。如果未在格式中指定时、分或秒,或者没有匹配的位数,则该字段将被视为零值。默认 format 为“hms12”。

    detail 属性控制时间的口语形式是 12 小时制还是 24 小时制。如果 detail='1' 或者 detail 省略,则口语形式为 24 小时制,时间格式为 24 小时制。如果 detail='2' 或者 detail 省略,则口语形式为 12 小时制,时间格式为 12 小时制。

支持在合成语音输出中插入录制的音频文件和其他音频格式。

属性

属性必需默认
src指向音频媒体源的 URI。支持的协议为 https
clipBegin0一个时间指定值,这是从音频源开始到播放开始点的偏移量。如果此值大于或等于音频源的实际持续时间,则不插入音频。
clipEnd无限一个时间指定值,这是音频源开始到播放结束点的偏移量。如果音频源的实际持续时间小于此值,则播放在音频源持续时间结束时结束。如果 clipBegin 的值大于或等于 clipEnd,则不插入音频。
speed100%输出播放率相对于正常输入率的比率,以百分比表示。格式为正实数,后跟百分号。目前支持的范围为 [50%(慢速 - 半倍速),200%(快速 - 双倍速)]。超出该范围的值不一定能调整到该范围内。
repeatCount1,如果设置了 repeatDur 则为 10一个实数,指定插入音频(如果是剪辑后,按 clipBegin 和/或 clipEnd 确定)的次数。零不是有效值,因此视为未指定,并且在该情况下具有默认值。
repeatDur无限一个时间指定值,指定在源视频针对 clipBeginclipEndrepeatCountspeed 属性进行处理之后插入的音频持续时间(而不是正常播放时长)的限制。如果处理后的音频持续时间小于此值,则播放在该时间结束。
soundLevel+0dB将音频的音量调整 soundLevel 分贝。最大范围为 +/- 40dB,但实际有效范围可能更小,并且输出质量可能无法在整个范围内产生良好的结果。

以下是当前支持的音频设置:

  • 格式:MP3 (MPEG v2)
    • 每秒 24K 样本
    • 每秒 24K ~ 96K 位,固定速率
  • 格式:Ogg 中的 Opus
    • 每秒 24K 样本(超宽带)
    • 每秒 24K - 96K 位,固定速率
  • 格式(已弃用):WAV (RIFF)
    • PCM 16 位签名,小端
    • 每秒 24K 样本
  • 适用于所有格式:
    • 首选单声道,但立体声也可接受。
    • 最长持续时间 240 秒。如果您想播放持续时间更长的音频,请考虑执行媒体响应。
    • 5 兆字节文件大小限制。
    • 来源网址必须使用 HTTPS 协议。
    • 提取音频时,我们的 UserAgent 是“Google-Speech-Actions”。

src 网址也必须是 https 网址(Google Cloud Storage 可以在 https 网址上托管您的音频文件)。

如需详细了解媒体响应,请参阅响应指南中的媒体响应部分。

如需详细了解 audio 元素,请参阅 W3 规范。

示例



,

句子和段落元素。

如需详细了解 ps 元素,请参阅 W3 规范。

示例

This is sentence one.This is sentence two.

指示在发音时用别名属性值中的文本替换所包含的文本。

您还可以使用 sub 元素来提供难读单词的简化发音。下面的最后一个示例演示了这个用例在日语中的应用。

如需详细了解 sub 元素,请参阅 W3 规范。

示例

W3C

将标记置于文本或标记序列中的空元素。它可用于引用序列中的特定位置,或将标记插入输出流以进行异步通知。


Go from  here, to  there!

用于自定义元素中所包含文本的音高、语速和音量。目前支持 ratepitchvolume 属性。

您可以根据 W3 规范设置 ratevolume 属性。以下三个选项可用于设置 pitch 属性的值:

注意 标记只能用于完整句子。将字词包含在句子中可能会导致语音中不希望出现的停顿。

属性说明
name每个标记的字符串 ID。
选项说明
相关请指定一个相对值(例如“低”、“中”、“高”等),其中“中”是默认音高。
半音分别使用“+Nst”或“-Nst”来按“N”半音来增加或降低音高。请注意,“+/-”和“st”为必需。
百分比分别使用“+N%”或“-N%”来按“N”增加或降低音高。请注意,“%”为必需,但“+/-”为可选。

如需详细了解 prosody 元素,请参阅 W3 规范。

示例

以下示例使用 元素以低于正常值 2 个半音的音高缓慢说话:

Can you hear me now?

用于添加或移除元素所含文本中的重音。 元素修改语音的方式与 类似,但不需要设置单独的语音属性。

注意 标记只能用于完整句子。将字词包含在句子中可能会导致语音中不希望出现的停顿。

此元素支持可选的“等级”属性,其中包含以下有效值:

  • strong
  • moderate
  • none
  • reduced

如需详细了解 emphasis 元素,请参阅 W3 规范。

示例

以下示例使用 元素发布公告:

This is an important announcement

允许您一次播放多个媒体元素的并行媒体容器。唯一允许的内容是一个或多个 元素构成的序列。 元素的顺序并不重要。

除非子元素指定不同的开始时间,否则元素的隐式开始时间与 容器的隐式开始时间相同。如果子元素具有为其开始结束属性设置的偏移值,则元素的偏移量将是相对于 容器开始时间的值。对于根 元素,开始属性会被忽略,开始时间是 SSML 语音合成过程开始为根 元素生成输出的时间(即生效时间为“零”)。

Who invented the Internet?The Internet was invented by cats.

允许您一个接着一个播放媒体元素的依序媒体容器。唯一允许的内容是一个或多个 元素构成的序列。媒体元素的顺序是它们的呈现顺序。

子元素的开始结束属性可以设置为偏移值(请参阅下面的时间规范)。这些子元素的偏移值将是相对于序列中前一个元素结尾的值,序列中第一个元素则是相对于其 容器的开头。

Who invented the Internet?The Internet was invented by cats.

表示 元素中的媒体层。 元素的允许内容是 SSML 元素。下表说明了适用于 元素的有效属性。

属性

属性必需默认
xml:id没有值此元素的唯一 XML 标识符。不支持编码实体。允许的标识符值与正则表达式 `"([-_#]
begin0此媒体容器的开始时间。如果这是根媒体容器元素,则忽略(处理方式与默认值“0”相同)。如需详细了解有效的字符串值,请参阅下面的时间规范部分。
end没有值此媒体容器的结束时间规范。如需详细了解有效的字符串值,请参阅下面的时间规范部分。
repeatCount1一个实数,指定插入媒体的次数。重复计数不支持小数,因此该值将四舍五入为整数。零不是有效值,因此视为未指定,并且在该情况下具有默认值。
repeatDur没有值一个时间指定值,是对插入媒体持续时间的限制。如果媒体的持续时间小于该值,则播放在该时间结束。
soundLevel+0dB将音频的音量调整 soundLevel 分贝。最大范围为 +/- 40dB,但实际有效范围可能更小,并且输出质量可能无法在整个范围内产生良好的结果。
fadeInDur0 秒一个时间指定值,在此时间范围内,媒体将从静音渐强至可选的指定 soundLevel。如果媒体的持续时间小于此值,渐强将在播放结束时停止,并且音量不会达到指定的音量。
fadeOutDur0 秒一个时间指定值,在此时间范围内,媒体将从可选的指定 soundLevel 渐弱,直至静音。如果媒体的持续时间小于此值,则音量会设置为较低的值,以确保在播放结束时达到静音。

时间规范

用于 元素和媒体容器( 元素)的“开始”和“结束”属性值的时间规范,要么是偏移值(例如 +2.5s),要么是 syncbase 值(例如 foo_id.end-250ms)。

  • 偏移值

    - 时间偏移值是 SMIL Timecount-value,允许值匹配以下正则表达式:

    "\s\*(+|-)?\s\*(\d+)(\.\d+)?(h|min|s|ms)?\s\*"
    

    第一个数字字符串是十进制数的整数部分,第二个数字字符串是小数部分。默认符号(即“(+|-)?”)是“+”。单位值分别对应于时、分、秒和毫秒。单位的默认值为“s”(秒)。

  • Syncbase 值

    - Syncbase 值是 SMIL syncbase-value,允许值匹配以下正则表达式:

    "([-_#]|\p{L}|\p{D})+\.(begin|end)\s\*(+|-)\s\*(\d+)(\.\d+)?(h|min|s|ms)?\s\*"
    

    数字和单位的解释方式与偏移值相同。

您可使用 标记以内嵌方式生成单词的自定义发音。Text-to-Speech 接受 IPA 和 X-SAMPA 语音字母。请参阅 Phones 页面,查看受支持的语言和音素的列表。

每个 标记的每个应用都指向单个字词的发音:

  manitobamahogany

时长

Text-to-Speech 支持 以适当地读取时长。例如,以下示例会被读作“5 小时 30 分钟”:

5:30

格式字符串支持以下值:

缩写词
h小时
m分钟
s
ms毫秒

借助 标记,您可以在单个 SSML 请求中使用多个语音。在以下示例中,默认语音是英语男声。除“quest-ce t’améne ici”之外,所有单词都合成到此语音中,它将用法语女声而不是默认语言(英语)和性别(男性)读出来。

And then she asked, qu'est-ce qui
t'amène ici in her sweet and gentle voice.

或者,您可以使用 标记指定单个语音(支持的语音页面上的语音名称),而不用指定language 和/或 gender

The dog is friendlymais la chat est
mignon said a pet shop
owner

使用 标记时,Text-to-Speech 会接收 name(您要使用的语音名称)下列属性的组合。全部 3 个属性都是可选属性,如果您未提供 name,则必须提供至少一个属性。

  • gender:“男性”、“女性”或“中性”。
  • variant:如果根据您的配置确定使用哪种语音时有多种可能性,则用作裁定。
  • language:您所需的语言。一个给定的 标记中只能指定一种语言。以 BCP-47 格式指定您的语言。您可以在支持的语音和语言页面上的语言代码列中找到与您的语言对应的 BCP-47 代码。

您还可以使用两个附加标记 requiredordering 控制每个 gendervariantlanguage 特性的相对优先级。

  • required:如果属性被指定为 required 且配置不正确,则请求将失败。
  • orderingordering 标记后列出的任何属性都被视为首选属性,而非必需属性。Text-to-Speech API 会尽量按属性在 ordering 标记后面列出的顺序考虑首选属性。如果任何首选属性配置不正确,Text-to-Speech 仍可能返回有效的语音,但丢弃错误的配置。

使用 requiredordering 标记的配置示例:

And there it was a flying bird roaring in the skies for the
first time.
Today is supposed to be Sunday Funday.

您可以使用 在同一 SSML 请求中包括多种语言的文本。所有语言都将合成到同一语音中,除非您使用 标记明确更改语音。xml:lang 字符串必须包含 BCP-47 格式的目标语言(此值在支持的语音表中列为“语言代码”)。在下面的例子中,“chat”用法语读出来,而不是用默认语言(英语):

The french word for cat is chat

Text-to-Speech 会尽量支持 标记。如果在同一 SSML 请求中指定了所有语言组合,则并非所有语言组合都会产生相同的质量结果。在某些情况下,某个语言组合可能会产生可检测到但具有微妙或负面感知性的影响。已知问题:

  • 标记不支持带有汉字字符的日语。输入会被直译且读作中文字符。
  • 标记不支持闪米特语(如阿拉伯语、希伯来语和波斯语),这些语音导致不读出任何内容。如果要使用上述任一语言,我们建议您使用 标记切换到使用能读出您想使用的语言的语音(如果有)。

SSML 时间点

Text-to-Speech API 支持在您创建的音频数据中使用时间点。时间点是与脚本中指定点对应的时间戳(以秒为单位,从生成音频时开始计算)。您可以使用 标记在脚本中设置时间点。生成音频后,API 会返回音频开始时和时间点之间的时间偏移。

设置时间点需要执行两个步骤:

  1. SSML 标记添加到脚本中您希望其获取时间戳的位置。
  2. 将 TimepointType 设置为 SSML_MARK。如果未设置此字段,则默认情况下不返回时间点。

以下示例返回两个时间点:

  • timepoint_1:表示生成的音频中“Mark”一词出现的时间(以秒为单位)。
  • timepoint_2:表示生成的音频中“word”一词出现的时间(以秒为单位)。
Hello  Mark. Good to  see you.

相关内容

热门资讯

伊朗回应特朗普一再威胁:将摧毁... 伊朗媒体3日报道,伊朗军方发表声明说,若美国敢对伊朗基础设施动手,伊朗将摧毁美国和以色列在中东地区的...
六大行2025年公司金融:谁在... 全文共3024字,阅读全文约需7分钟在零售业务增速放缓之际,对公板块成为了六大行稳营收、扩规模、调结...
ST西发董事长失联,公司预重整... 在西藏发展预重整及核心资产并购的关键节点,作为核心操盘手的董事长竟失联了。4月2日晚间,上市公司西藏...
奢侈品正在抛弃你 奢侈品正在抛... 看完老铺黄金营收利润双双增长200%的年报,三大奢侈品集团应该是挺想报警的。经历2023年短暂反弹后...