语音合成标记语言 (SSML) 参考(Beta 版)

除了 Text-to-Speech 标准 SSML 元素之外,Text-to-Speech 还支持许多 SSML Beta 版功能。如需详细了解如何使用 SSML 元素自定义合成语音结果,请查看 Text-to-Speech SSML 教程SSML 参考文档

受支持的 Beta 版 SSML 功能摘要:

  • <phoneme>:自定义特定字词的发音。
  • <say-as interpret-as="duration">:指定持续时间。
  • <voice>:在同一请求中切换语音。
  • <lang>:在同一请求中使用多种语言。
  • 时间点:使用 <mark> 标记返回转录中指定点的时间点。

<phoneme>

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

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

  <phoneme alphabet="ipa" ph="ˌmænɪˈtoʊbə">manitoba</phoneme>
  <phoneme alphabet="x-sampa" ph='m@"hA:g@%ni:'>mahogany</phoneme>

重音标记

一个转录最多可存在 3 个级别的重音:

  1. 主重音:在 IPA 中用 /ˈ/ 表示,在 X-SAMPA 中用 /"/ 表示。
  2. 次重音:在 IPA 中用 /ˌ/ 表示,在 X-SAMPA 中用 /%/ 表示。
  3. 无重音:(在任一注释中)未标记有符号。

某些语言可能不到 3 个级别,或者跟踪不标识重音位置。请参阅音素页面,查看适用于您所用语言的重音级别。重音标记放置在每个重音音节的开头。例如,以美式英语为例:

示例字词 IPA X-SAMPA
water ˈwɑːtɚ "wA:t@`
underwater ˌʌndɚˈwɑːtɚ %Vnd@"wA:t@

宽式音标与严式音标

一般来说,您的转录必然是更加宽式、音素更强。例如,在美式英语中,转录两个元音间的 /t/(而不是使用点):

示例字词 IPA X-SAMPA
butter ˈbʌtɚ instead of ˈbʌɾɚ "bVt@` instead of "bV4@`

某些情况下,使用音素表示法会使 TTS 结果听起来不太自然(例如,如果音素序列在结构上很难发音)。

例如在英语中,/s/ 有发音同化的现象。此时,转录中应反映出这种同化:

示例字词 IPA X-SAMPA
cats ˈkæts "k{ts
dogs ˈdɑːgz 而非 ˈdɑːgs "dA:gz 而非 "dA:gs

弱读

每个音节必须包含一个(且只包含一个)元音。这意味着应避免使用音节辅音,而是使用弱化元音进行转录。例如:

示例字词 IPA X-SAMPA
kitten ˈkɪtən 而非 ˈkɪtn "kIt@n 而非 "kitn
kettle ˈkɛtəl 而非 ˈkɛtl "kEt@l 而非 "kEtl

音节划分

可选择性地使用 /./ 指定音节标界。每个音节必须包含一个(且只包含一个)元音。例如:

示例字词 IPA X-SAMPA
可读性 ˌɹiː.də.ˈbɪ.lə.tiː %r\i:.d@."bI.l@.ti:

时长

Text-to-Speech 支持 <say-as interpret-as="duration"> 以适当地读取时长。例如,以下示例会被读作“5 小时 30 分钟”:

<say-as interpret-as="duration" format="h:m">5:30</say-as>

格式字符串支持以下值:

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

<voice>

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

<speak>And then she asked, <voice language="fr-FR" gender="female">qu'est-ce qui
t'amène ici</voice><break time="250ms"/> in her sweet and gentle voice.</speak>

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

<speak>The dog is friendly<voice name="fr-CA-Wavenet-B">mais la chat est
mignon</voice><break time="250ms"/> said a pet shop
owner</speak>

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

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

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

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

使用 requiredordering 标记的配置示例:

<speak>And there it was <voice language="en-GB" gender="male" required="gender"
ordering="gender language">a flying bird </voice>roaring in the skies for the
first time.</speak>
<speak>Today is supposed to be <voice language="en-GB" gender="female"
ordering="language gender">Sunday Funday.</voice></speak>

<lang>

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

<speak>The french word for cat is <lang xml:lang="fr-FR">chat</lang></speak>

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

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

SSML 时间点

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

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

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

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

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