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>
自定义词典
可以使用 phoneme 和 sub 元素来定义如何在 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
属性,该属性指示词典中使用的字母表。 可能的值为ipa
和x-microsoft-sapi
。- 每个
lexeme
元素包含至少一个grapheme
元素以及一个或多个grapheme
、alias
和phoneme
元素。lexeme
元素在自定义词典中区分大小写。 例如,如果只提供lexeme
“Hello”的音素,则它对lexeme
“hello”不起作用。 grapheme
元素包含描述拼字法的文本。alias
元素用于指示某个首字母缩写词或某个缩写词的发音。phoneme
元素提供了描述lexeme
发音方式的文本。 IPA 字母表中的音节边界为“.”。 使用 IPA 字母表时,phoneme
元素不能包含空格。- 当
alias
与phoneme
元素具有相同的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-US
、fr-FR
、de-DE
、es-ES
、ja-JP
、zh-cn
、zh-HK
和 zh-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-as
和 format
属性支持的内容类型。 仅当此表中的 format
列不为空时才包含 format
属性。
注意
所有文本转语音区域设置都支持 interpret-as
属性的 characters
和 spell-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-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
。
支持 MathML 2.0 和 MathML 3.0 规范中的所有元素,但 MathML 3.0 基本数学元素除外。
请注意以下 MathML 元素和属性:
<math xmlns="http://www.w3.org/1998/Math/MathML">
中的xmlns
属性是可选的。semantics
、annotation
和annotation-xml
元素不输出语音,因此将被忽略。- 如果无法识别某个元素,则会忽略该元素,但仍会处理其中的子元素。
XML 语法不支持 MathML 实体,因此必须使用相应的 unicode 字符来表示该实体,例如,实体 ©
应使用其 unicode 字符 ©
来表示,否则会发生错误。
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>