SSML 发音

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

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

phoneme 元素

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

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

注意

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

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

属性 说明 必需还是可选
alphabet ph 属性中合成字符串发音时要使用的音标字母表。 指定音标的字符串必须以小写字母指定。 以下选项是可以指定的可能音标:
音标仅适用于元素中的 phoneme
可选
ph 一个字符串,包含用于在 phoneme 元素中指定单词发音的音素。 如果指定的字符串包含无法识别的音素,则文本转语音将拒绝整个 SSML 文档,并且不会生成文档中指定的任何语音输出。

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

phoneme 示例

前面介绍了 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 元素引用它。

注意

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

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

属性 说明 必需还是可选
uri 扩展名为 .xml.pls 的可公开访问自定义词典 XML 文件的 URI。 建议使用 Azure Blob 存储,但不要求如此。 有关自定义词典文件的详细信息,请参阅 Pronunciation Lexicon Specification (PLS) Version 1.0(发音词典规范 (PLS) 版本 1.0)。 必需

自定义词典示例

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

发布自定义词典后,可以从 SSML 引用它。 以下 SSML 示例引用了已上传到 https://www.example.com/customlexicon.xml 的自定义词典。 我们支持 Azure Blob 存储、高级媒体服务 (AMS) 存储和 GitHub 中的词典 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 文件中定义这些实体。

注意

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

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

  • 文件大小:自定义词典文件大小限制为最大 100 KB。 如果文件大小超过 100 KB 限制,则合成请求将会失败。 如果文件大小超过 100 KB,则可以将词典拆分为多个词典,并将它们包含在 SSML 中。
  • 词典缓存刷新:自定义词典在缓存时会将 URI 用作文本转语音上的密钥(在首次加载它时)。 不会在 15 分钟内重新加载具有相同 URI 的词典。因此,自定义词典更改最多需要等待 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”将读作“By the way”,而“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。

语音服务为以下区域设置定义了语音集:en-USfr-FRde-DEes-ESja-JPzh-cnzh-HKzh-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 元素的属性用法。

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

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

注意

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

interpret-as format 解释
characters, spell-out 此文本朗读为各个字符(拼读出来)。 语音合成引擎将以下内容:

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

朗读为“T E S T.”
cardinal, number 此文本朗读为序数。 语音合成引擎将以下内容:

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

朗读为“There are ten options。”
ordinal 此文本朗读为基数。 语音合成引擎将以下内容:

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

朗读为“Select the third option.”
number_digit 此文本朗读为个体数字的序列。 语音合成引擎将以下内容:

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

朗读为“1 2 3 4 5 6 7 8 9.”
fraction 此文本朗读为分数。 语音合成引擎将以下内容:

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

朗读为“three eighths of an inch.”
date dmy, mdy, ymd, ydm, ym, my, md, dm, d, m, y 此文本朗读为日期。 format 属性指定日期的格式 (d=日, m=月, and y=年)。 语音合成引擎将以下内容:

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

朗读为“Today is October twelfth two thousand sixteen.”
将以下内容:

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

朗读为“Today is December tenth two thousand sixteen.”
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>

朗读为“The train departs at four A M.”
duration hms、hm、ms 此文本朗读为持续时间。 format 属性指定持续时间的格式(h=小时、m=分钟和 s=秒)。 语音合成引擎将以下内容:

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

发音为“one hour eighteen minutes and thirty seconds”。
将以下内容:

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

发音为“one minute and eighteen seconds”。
此标记仅支持英语和西班牙语。
telephone 此文本朗读为电话号码。 语音合成引擎将以下内容:

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

朗读为“My number is area code eight eight eight five five five one two one two.”
currency 此文本朗读为货币。 语音合成引擎将以下内容:

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

朗读为“ninety-nine US dollars and ninety cents。”
address 此文本朗读为地址。 语音合成引擎将以下内容:

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

朗读为:“I'm at 150th Court Northeast Redmond Washington.”
name 此文本朗读为人名。 语音合成引擎将以下内容:

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

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

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

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

say-as 示例

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

语音合成引擎将以下示例朗读为“Your first request was for one room on October nineteenth twenty ten with early arrival at twelve thirty five PM.”

<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 元素

使用 sub 元素指示应读出的别名属性文本值,而不是元素中包含的文本。 这样,SSML 既包含口头形式的内容,也包含书面形式的内容。

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

属性 说明 必需还是可选
alias 应该读出的文本值,而不是元素中包含的文本。 必需

sub 示例

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

语音合成引擎将以下示例读出为“World Wide Web Consortium”。

<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>

MathML 发音

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

注意

MathML 元素(标记)当前在以下区域设置中受到支持:de-DEen-AUen-GBen-USes-ESes-MXfr-CAfr-FRit-ITja-JPko-KRpt-BRzh-cn

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

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

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

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

MathML 示例

此示例的文本转语音输出是“a squared plus b squared equals c squared”。

<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>

后续步骤