使用 SSML 发音

可以将语音合成标记语言 (SSML) 与文本转语音配合使用,以指定语音的发音方式。 例如,可以将 SSML 与音素和自定义词典一起使用,以提高发音。 还可以使用 SSML 定义单词或数学表达式的具体发音。

有关如何使用 SSML 元素改进发音的详细信息,请参阅以下部分。 有关 SSML 语法的详细信息,请参阅 SSML 文档结构和事件

音素元素

phoneme 元素用于 SSML 文档中的拼音发音。 始终提供人类可读的语音作为备用。

拼音字母由电话组成,这些电话由字母、数字或字符组成,有时组合在一起。 每个手机描述独特的语音声音。 拼音字母与拉丁字母形成鲜明对比,在拉丁字母中,任何字母都可能代表多种发音。 想像一下在 en-US 中单词“candy”和“cease”中字母“c”的不同发音,或者字母组合“th”在单词“thing”和“those”中的不同发音。

Note

有关支持音素的区域设置列表,请参阅语言支持表中的脚注。

下表描述了 phoneme 元素的属性用法。

Attribute 说明 必需或可选
alphabet 合成ph 属性中字符串发音时要使用的音标字母。 指定字母表的字符串必须用小写字母指定。 以下是您可以指定的字母表选项:
字母表仅适用于元素中的 phoneme
Optional
ph 字符串中含有音素,这些音素在 phoneme 元素中指定了单词的发音。 每个区域设置都支持特定的电话集。 请参阅 SSML 拼音字母。 如果指定的字符串包含无法识别的电话,文本转语音服务将返回无效 SSML 的 http 400 错误。

对于 ipa,若要通过在此音节之前放置重音符号来强调一个音节,需要标记单词的所有音节。 否则,这个重音符号前的音节将被重读。 对于 sapi,如果要强调一个音节,需要在这个音节后面放置重音符号,无论单词的所有音节是否都已标记。
Required

音素示例

phoneme介绍了 元素属性支持的值。 在前两个示例中,指定了 ph="tə.ˈmeɪ.toʊ"ph="təmeɪˈtoʊ" 的值来强调音节 meɪ

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
    <voice name="en-US-AvaNeural">
        <phoneme alphabet="ipa" ph="tə.ˈmeɪ.toʊ"> tomato </phoneme>
    </voice>
</speak>
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
    <voice name="en-US-AvaNeural">
        <phoneme alphabet="ipa" ph="təmeɪˈtoʊ"> tomato </phoneme>
    </voice>
</speak>
<speak version="1.0" xmlns="https://www.w3.org/2001/10/synthesis" xml:lang="en-US">
    <voice name="en-US-AvaNeural">
        <phoneme alphabet="sapi" ph="iy eh n y uw eh s"> en-US </phoneme>
    </voice>
</speak>
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
    <voice name="en-US-AvaNeural">
        <s>His name is Mike <phoneme alphabet="ups" ph="JH AU"> Zhou </phoneme></s>
    </voice>
</speak>
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
     <voice name="en-US-AvaNeural">
        <phoneme alphabet='x-sampa' ph='he."lou'>hello</phoneme>
    </voice>
</speak>

自定义词典

可以使用 phonemesub 元素来定义如何在 SSML 中读取单个实体(例如公司、医学术语或表情符号)。 若要定义多个实体的读取方式,请创建一个 XML 结构化自定义词典文件。 然后上传该自定义词典 XML 文件并使用 SSML lexicon 元素引用它。

Note

有关支持自定义词典的区域设置的列表,请参阅语言支持表中的脚注。

下表描述了 lexicon 元素的属性用法。

Attribute 说明 必需或可选
uri 扩展名为 .xml.pls 的可公开访问自定义词典 XML 文件的 URI。 建议使用 Azure Blob 存储,但不建议这样做,GitHub URI 和其他可公开访问的链接也受支持。 如果不想公开自定义词典,可以使用 SAS。 有关自定义词典文件的详细信息,请参阅 发音词典规范(PLS)版本 1.0 Required

自定义词典示例

lexicon介绍了 元素属性支持的值。

发布自定义词典后,可以从 SSML 引用它。 以下 SSML 示例引用了已上传到 https://www.example.com/customlexicon.xml 的自定义词典。 我们支持来自 Azure Blob 存储 的词典 URL。 但是,请注意,其他公共 URL 可能不兼容。

<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="en-US-AvaNeural">
        <lexicon uri="https://www.example.com/customlexicon.xml"/>
        BTW, we will be there probably at 8:00 tomorrow morning.
        Could you help leave a message to Robert Benigni for me?
    </voice>
</speak>

自定义词典文件

若要定义多个实体的读取方式,可以在扩展名为 .xml.pls 的自定义词典 XML 文件中定义这些实体。

Note

自定义词典文件是有效的 XML 文档,但不能用作 SSML 文档。

下面是自定义词典文件的一些限制:

  • 文件大小:自定义词典文件大小限制为最多 100 KB。 如果文件大小超过 100 KB 限制,合成请求将失败。 如果文件大小超过 100 KB,则可以将词典拆分为多个词典,并将它们包含在 SSML 中。
  • Lexicon 缓存刷新:首次加载时,自定义词典使用 URI 作为text to speech上的密钥进行缓存。 具有相同 URI 的词典在 15 分钟内不会重新加载,因此自定义词典更改最多需要等待 15 分钟才能生效。

发音词典规范 (PLS) 版本 1.0 中描述了自定义词典 XML 文件支持的元素和属性。 下面是支持的元素和属性的一些示例:

  • lexicon 元素包含至少一个 lexeme 元素。 词典包含必需的 xml:lang 属性,用于指示要应用词典的区域设置。 根据设计,一个自定义词典仅限于一种区域设置,因此如果将其应用于另一种区域设置,它将无法正常工作。 lexicon 元素还有一个 alphabet 属性,该属性指示词典中使用的字母表。 可能的值为 ipax-microsoft-sapi
  • 每个 lexeme 元素包含至少一个 grapheme 元素以及一个或多个 graphemealiasphoneme 元素。 该 lexeme 元素在自定义词典中区分大小写。 例如,如果只提供 lexeme“Hello”的音素,则它对 lexeme“hello”不起作用。
  • grapheme 元素包含描述拼字法的文本。
  • 这些 alias 元素用于指示首字母缩略词或缩写词的发音。
  • phoneme 元素提供描述 lexeme 发音方式的文本。 IPA 字母表中的音节边界为“.”。 使用 IPA 字母表时,phoneme 元素不能包含空格。
  • aliasphoneme元素与grapheme元素一起提供时,alias的优先级更高。

Microsoft 提供了自定义词典验证工具来帮助你查找自定义词典文件中的错误(它还提供详细的错误消息)。 在生产环境中将自定义词典 XML 文件与语音服务配合使用之前,建议使用该工具。

自定义词典文件示例

以下 XML 示例(而不是 SSML)将包含在自定义词典 .xml 文件中。 使用此自定义词典时,“BTW”将读作“顺便说一句”。“Benigni”的发音按提供的 IPA “bɛˈniːnji” 阅读。

<?xml version="1.0" encoding="UTF-8"?>
<lexicon version="1.0"
      xmlns="http://www.w3.org/2005/01/pronunciation-lexicon"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.w3.org/2005/01/pronunciation-lexicon
        http://www.w3.org/TR/2007/CR-pronunciation-lexicon-20071212/pls.xsd"
      alphabet="ipa" xml:lang="en-US">
    <lexeme>
        <grapheme>BTW</grapheme>
        <alias>By the way</alias>
    </lexeme>
    <lexeme>
        <grapheme>Benigni</grapheme>
        <phoneme>bɛˈniːnji</phoneme>
    </lexeme>
    <lexeme>
        <grapheme>😀</grapheme>
        <alias>test emoji</alias>
    </lexeme>
</lexicon>

不能使用自定义词典直接设置短语的发音。 如果需要设置首字母缩略词或缩写词的发音,请首先提供 alias,再将 phoneme 与该 alias 关联。 例如:

<?xml version="1.0" encoding="UTF-8"?>
<lexicon version="1.0"
      xmlns="http://www.w3.org/2005/01/pronunciation-lexicon"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.w3.org/2005/01/pronunciation-lexicon
        http://www.w3.org/TR/2007/CR-pronunciation-lexicon-20071212/pls.xsd"
      alphabet="ipa" xml:lang="en-US">
    <lexeme>
        <grapheme>Scotland MV</grapheme>
        <alias>ScotlandMV</alias>
    </lexeme>
    <lexeme>
        <grapheme>ScotlandMV</grapheme>
        <phoneme>ˈskɒtlənd.ˈmiːdiəm.weɪv</phoneme>
    </lexeme>
</lexicon>

也可以直接提供所需的 alias 作为首字母缩略词或缩写词。 例如:

  <lexeme>
    <grapheme>Scotland MV</grapheme>
    <alias>Scotland Media Wave</alias>
  </lexeme>

前面的自定义词典 XML 文件示例使用 IPA 字母表,也称为 IPA 音素集。 我们建议你使用 IPA,因为它是国际标准。 对于某些 IPA 字符,使用 Unicode 表示时,它们是“预编译”和“分解”版本。 自定义词典仅支持分解的 Unicode。

语音服务为这些语言环境定义了 SAPI 拼音集:en-USen-CAfr-FRfr-CAfr-BEfr-CHde-DEde-ATde-CHes-ESja-JPzh-cnzh-HKyue-CNzh-TW。 有关语音服务拼音字母表的详细信息,请参阅 语音服务拼音集

您可以将x-microsoft-sapi用作alphabet属性的值,配合自定义词典,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<lexicon version="1.0"
      xmlns="http://www.w3.org/2005/01/pronunciation-lexicon"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.w3.org/2005/01/pronunciation-lexicon
        http://www.w3.org/TR/2007/CR-pronunciation-lexicon-20071212/pls.xsd"
      alphabet="x-microsoft-sapi" xml:lang="en-US">
  <lexeme>
    <grapheme>BTW</grapheme>
    <alias> By the way </alias>
  </lexeme>
  <lexeme>
    <grapheme> Benigni </grapheme>
    <phoneme> b eh 1 - n iy - n y iy </phoneme>
  </lexeme>
</lexicon>

Say-as 元素

say-as 元素指示元素文本的内容类型(例如数字或日期)。 此元素为语音合成引擎提供有关如何朗读文本的指导。

下表描述了 say-as 元素的属性用法。

Attribute 说明 必需或可选
interpret-as 指示元素文本的内容类型。 有关类型列表,请参阅下表。 Required
format 为可能具有不明确格式的内容类型提供有关元素文本的精确格式设置的其他信息。 SSML 为使用它们的内容类型定义格式。 请参阅下表。 Optional
detail 指示要说出的详细信息级别。 例如,此属性可以要求语音合成引擎朗读标点符号。 没有为 detail 定义的标准值。 Optional

下面是 interpret-asformat 属性支持的内容类型。 仅当表中format列不为空时,才包含format属性。

Note

characters 属性的 spell-outinterpret-as 值适用于所有 文本到语音区域设置。 以下语言的所有区域设置都支持其他 interpret-as 属性值:阿拉伯语、加泰罗尼亚语、中文、丹麦语、荷兰语、英语、法语、芬兰语、德语、印地语、意大利语、日语、朝鲜语、挪威语、波兰语、葡萄牙语、俄语、西班牙语和瑞典语。

interpret-as 格式 释义
charactersspell-out 区分大小写 此文本朗读为各个字符(拼读出来)。 语音合成引擎发音:

<say-as interpret-as="characters">Test</say-as>

作为“TEST”。
发音:

<say-as interpret-as="characters" format="casesensitive">Test</say-as>

大写的“T E S T”。
alphanumeric 拼写 文本以单个字母的形式朗读,并适当地停顿。 语音合成引擎发音:

<say-as interpret-as="alphanumeric" format="spell">ABCDEF</say-as>

作为“A B C <暂停> D E F”。
可以使用“-”指定暂停。 语音合成引擎发音:

<say-as interpret-as="alphanumeric" format="spell">AB-CD-EF</say-as>

作为“A B <暂停> C D <暂停> E F”。
cardinalnumber None 该文本将按基数形式朗读。 语音合成引擎发音:

There are <say-as interpret-as="cardinal">10</say-as> options

因为“有十个选项”。
ordinal None 文本按照序数读出。 语音合成引擎发音:

Select the <say-as interpret-as="ordinal">3rd</say-as> option

朗读为“Select the third option.”
number_digit None 该文本是按单个数字序列进行朗读的。 语音合成引擎发音:

<say-as interpret-as="number_digit">123456789</say-as>

作为“1 2 3 4 5 6 7 8 9”。
fraction None 文本以分数形式读出。 语音合成引擎发音:

<say-as interpret-as="fraction">3/8</say-as> of an inch

发音为“three eighths of an inch”。
date dmy, mdy, ymd, ym, my, md, dm, d, m, y 该文本被作为日期朗读。 该 format 属性指定日期的格式(d=day、m=month 和 y=year)。 语音合成引擎发音:

Today is <say-as interpret-as="date">10-12-2016</say-as>

今天是二零一六年十月十二日。
发音:

Today is <say-as interpret-as="date" format="dmy">10-12-2016</say-as>

正如“今天是二零一六年十二月十日”。
time hms12、hms24 此文本朗读为时间。 该 format 属性指定时间是使用 12 小时制(hms12)还是 24 小时制(hms24)。 请使用冒号分隔表示小时、分钟和秒的数字。 下面是一些有效的时间示例:12:35、1:14:32、08:15 和 02:50:45。 语音合成引擎发音:

The train departs at <say-as interpret-as="time" format="hms12">4:00am</say-as>

当“火车在凌晨四点出发时”
duration hms、hm、ms 文本会被作为时间长度来朗读。 format 属性指定持续时间的格式(h=小时、m=分钟和 s=秒)。 语音合成引擎发音:

<say-as interpret-as="duration">01:18:30</say-as>

作为“一小时十八分三十秒”。
发音:

<say-as interpret-as="duration" format="ms">01:18</say-as>

发音为“one minute and eighteen seconds”。
此标记仅在英语和西班牙语上受支持。
telephone None 文本会被当作电话号码来念。 语音合成引擎发音:

The number is <say-as interpret-as="telephone">(888) 555-1212</say-as>

正如“我的号码是区号八八八五五五一二一二。”
currency None 此文本朗读为货币。 语音合成引擎发音:

<say-as interpret-as="currency">99.9 USD</say-as>

发音为“ninety-nine US dollars and ninety cents”。
unit None 文本作为一个单元进行朗读。 语音合成引擎发音:

<say-as interpret-as="unit">10 m</say-as>

作为“十米”的用法。
address None 文本是以演讲的方式来进行朗读的。 语音合成引擎发音:

I'm at <say-as interpret-as="address">150th CT NE, Redmond, WA</say-as>

正如“我在华盛顿东北雷德蒙德第150法院。
name None 此文本朗读为人名。 语音合成引擎发音:

<say-as interpret-as="name">ED</say-as>

As [æd]。
在中文姓名中,某些字符出现在姓氏中时发音不同。 例如,语音合成引擎说出“仇”

<say-as interpret-as="name">仇先生</say-as>

发音为 [qiú] 而非 [chóu]。

假设示例

say-as介绍了 元素属性支持的值。

语音合成引擎将以下示例朗读为“您的第一个请求是预订一个房间,日期为二零一零年十月十九日,提前到达时间为下午十二点三十五分。”

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
    <voice name="en-US-AvaMultilingualNeural">
        <p>
        Your <say-as interpret-as="ordinal"> 1st </say-as> request was for <say-as interpret-as="cardinal"> 1 </say-as> room
        on <say-as interpret-as="date" format="mdy"> 10/19/2010 </say-as>, with early arrival at <say-as interpret-as="time" format="hms12"> 12:35pm </say-as>.
        </p>
    </voice>
</speak>

子元素

使用 sub 元素可以用来指示别名属性的文本值应被发音,而非元素所包含的文本。 这样,SSML 既包含口语形式,又包含书面形式。

下表描述了 sub 元素的属性用法。

Attribute 说明 必需或可选
alias 应该读出的文本值,而不是元素内的文本。 Required

子示例

sub介绍了 元素属性支持的值。

语音合成引擎将以下示例称为“万维网联盟”。

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
    <voice name="en-US-AvaMultilingualNeural">
        <sub alias="World Wide Web Consortium">W3C</sub>
    </voice>
</speak>

Markdown 文档阅读

要读取 markdown 内容,可以使用 mstts:markdown 元素封装 markdown 文本。 TTS 仅读取 markdown 中的文本内容,并忽略 markdown 语法。

例如,以下 SSML 将读出两个句子:“这是标题”和“这是粗体文本”,并且不会读取 markdown 语法。

<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='en-US-JennyNeural'>
    <mstts:markdown># This is headline 
And this is a **bold** text
    </mstts:markdown>
  </voice>
</speak>

支持的 markdown 语法

TTS 支持 CommonMark 规范中定义的 markdown 语法,这是广泛使用的 markdown 规范。 有关 CommonMark 规范的详细信息,请参阅 CommonMark

数学表达式的阅读

有两种方法可以读取数学表达式:

Note

以下区域设置目前支持这两种功能:de-DE、en-AU、en-GB、en-US、所有与英语相关的区域设置、es-ES、es-MX、所有与西班牙语相关的区域设置、fr-CA、fr-FR、it-IT、ja-JP、ko-KR、pt-BR以及所有与zh-CN相关的区域设置。

读取纯文本数学表达式

若要启用复杂的数学表达式读取,可以添加 <mstts:prompt domain="Math" /> 元素以启用特定于数学的发音规则。

<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="en-US-AvaMultilingualNeural">
       <mstts:prompt domain="Math" />
       x = (-b ± √(b² - 4ac)) / 2a
    </voice>
</speak>

默认情况下,数学表达式中不会读出括号。 如果想要读出括号,可以在 SSML 中指定<mstts:mathspeechverbosity level="verbose" />

<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="en-US-AvaMultilingualNeural">
       <mstts:prompt domain="Math" /><mstts:mathspeechverbosity level="verbose" />
       x = (-b ± √(b² - 4ac)) / 2a
    </voice>
</speak>

如果要使用多语言语音读出其他语言的表达式,请在 SSML 中指定 lang 元素。

<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="en-US-AvaMultilingualNeural"> 
      <mstts:prompt domain="Math" /> 
      <lang xml:lang="es-ES">x = (-b ± √(b² - 4ac)) / 2a</lang>
    </voice>
 </speak>

使用 MathML 读取数学表达式

数学标记语言(MathML)是一种 XML 兼容的标记语言,用于描述数学内容和结构。 语音服务可以使用 MathML 作为输入文本,以便在输出音频中正确读出数学符号。

MathML 2.0MathML 3.0 规范中的所有元素均受支持,但 MathML 3.0 基础数学元素除外。

请注意以下 MathML 元素和属性:

  • xmlns 中的 <math xmlns="http://www.w3.org/1998/Math/MathML"> 属性是可选的。
  • semanticsannotationannotation-xml 元素不输出语音,因此将被忽略。
  • 如果无法识别某个元素,将忽略该元素,但仍会处理其中的子元素。

XML 语法不支持 MathML 实体,因此必须使用相应的 unicode 字符来表示该实体,例如,实体 &copy; 应使用其 unicode 字符 &#x00A9; 来表示,否则会发生错误。

MathML 示例

此示例的文本转语音输出是“a 平方加 b 平方等于 c 平方”。

<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='en-US-JennyNeural'>
        <math xmlns='http://www.w3.org/1998/Math/MathML'>
            <msup>
                <mi>a</mi>
                <mn>2</mn>
            </msup>
            <mo>+</mo>
            <msup>
                <mi>b</mi>
                <mn>2</mn>
            </msup>
            <mo>=</mo>
            <msup>
                <mi>c</mi>
                <mn>2</mn>
            </msup>
        </math>
    </voice>
</speak>

后续步骤