你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用 SSML 发音

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

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

音素元素

phoneme 元素用于 SSML 文档中的拼音发音。 始终提供易于理解的语音作为后备选项。

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

注意

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

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

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

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

音素示例

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 不支持该元素。 对于长格式文本转语音,请改用 批处理合成 API (预览版)。

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

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

自定义词典示例

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 文件中定义它们。

注意

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

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

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

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

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

Microsoft为自定义词典提供了一个 validation 工具,可帮助你在自定义词典文件中查找错误(包含详细的错误消息)。 建议在将生产中的自定义词典 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下表描述了元素属性的用法。

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

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

注意

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

interpret-as 格式 解释
charactersspell-out 区分大小写 这段文字是以单个字母的形式(逐个拼出)朗读出来的。 语音合成引擎发音:

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

读作“T E S T”。
发音:

<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 没有 以基数形式朗读文本。 语音合成引擎发音:

There are <say-as interpret-as="cardinal">10</say-as> 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, 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 October twelfth two thousand sixteen.”
发音:

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>

朗读为“The train departs at four A M.”
duration hms、hm、ms 此文本朗读为持续时间。 该 format 属性指定持续时间的格式(h=hour、m=minute 和 s=second)。 语音合成引擎发音:

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

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

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

发音为“一分八秒”。
此标记仅在英语和西班牙语上受支持。
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”。
unit 没有 以单位形式朗读文本。 语音合成引擎发音:

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

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

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

朗读为:“I'm at 150th court north east redmond washington.”
name 没有 此文本朗读为人名。 语音合成引擎发音:

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

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-Ava:DragonHDLatestNeural">
        <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下表描述了元素属性的用法。

属性 描述 必需或可选
alias 应该读出的文本值,而不是元素内的文本。 必填

子示例

sub元素属性支持的值之前已描述

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

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
    <voice name="en-US-Ava:DragonHDLatestNeural">
        <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

数学表达式阅读

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

注意

以下区域设置目前支持这两种功能: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 元素和属性:

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

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

MathML 示例

本示例的文本转语音输出为“a squared 加 b squared 等于 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>

后续步骤