HTML 中语音呈现规范

W3C 工作草案

此版本:
https://www.w3.org/TR/2021/WD-spoken-html-20210923/
最新发布版本:
https://www.w3.org/TR/spoken-html/
最新编辑草案:
https://w3c.github.io/pronunciation/technical-approach
上一版本:
https://www.w3.org/TR/2021/WD-spoken-html-20210518/
编辑者:
Irfan Ali (Educational Testing Service)
Markku Hakkinen (Educational Testing Service)
Paul Grenier (受邀专家)
Ruoxi Ran (W3C)
参与:
GitHub w3c/pronunciation
提交问题
提交历史
拉取请求

摘要

通过文本转语音(TTS)合成实现准确发音在许多 上下文中都非常 重要,并且在教育、出版、通信、 娱乐 等领域至关重要。TTS 已成为一项重要技术,用于 提供对 Web 上数字内容的访问。然而,目前还没有办法 标记内容,使其能够在常用的 TTS 引擎和操作环境中 正确呈现 TTS 生成的输出。

我们在本出版物中确定了两种标记方法,以便为内容 作者提供可靠的 HTML 内容发音,而不受用户可能选择使用的操作环境 (或辅助技术)的影响。每种方法都已被证明能够产生 一致的结果。我们希望获得作者和实现者的反馈,以帮助确定哪种方法应由 W3C 推进为规范性推荐标准状态。

我们将每种候选方法建立在 语音 合成标记 语言(SSML)的一个子集之上。我们选定的 子集经过谨慎选择,旨在为各种辅助技术和 操作环境中的语音呈现带来一致性和可预测性。本 出版物中描述的两种技术方法都谨慎地避免了阻碍 SSML 成为原生 HTML 技术的僵局,因此应当具有普遍 适用性。这里描述的任一种方法都满足我们对 辅助技术的要求,并且对消费和以语音形式呈现 HTML 内容的 语音助手也会有用。 我们希望获得反馈,以了解哪种方法在 Web 内容语音呈现的所有应用中最易实现。

本文档状态

本节描述本文档在其 发布时的状态。其他文档可能会取代 本文档。当前 W3C 出版物列表以及本技术报告的 最新修订版可在 W3C 技术报告 索引中找到,地址为 https://www.w3.org/TR/。

本文档由 发音任务组(隶属于 无障碍平台架构工作组)作为 首次公开工作草案发布。 本文档旨在成为 W3C 推荐标准。

本文档提供规范性规范和最佳实践指导,以便文本转语音(TTS) 合成能够正确发音 HTML 内容。本更新工作草案描述了两种可能的 技术方法,用于作者控制 HTML 内容的发音,使用语音合成标记 语言(SSML)。任一种方法都将满足我们的无障碍要求。不过,我们希望建立一种 广泛适用的方法。因此,任务组正在寻求关于这些方法的更多意见,特别是 来自内容作者和实现者的意见,他们会将所描述的创作技术转换为听觉 呈现。

如需评论,请W3C pronunciation GitHub 仓库中提交问题。如果这不可 行,请发送电子邮件至 public-pronunciation@w3.org订阅归档)。评论请求截止 日期为 2021年10月30日。本文档的进行中更新可在公开可见的编辑者草案中查看。

作为工作草案发布并不意味着 得到 W3C 会员的认可。

这是一份草案文档,可能随时被更新、替换 或由其他文档废弃。除作为进行中的工作外,引用 本文档是不合适的。

本文档由一个根据 W3C 专利 政策运作的工作组制作。 W3C 维护一份 任何专利披露的公开列表, 这些披露与该工作组的可交付成果有关; 该页面还包括 披露专利的说明。实际知晓某项专利且个人认为该专利包含 必要权利要求的个人 必须根据 W3C 专利政策第 6 节 披露相关信息。

本文档受 2020年9月15日 W3C 流程文档管理。

1. 引言

本节为非规范性内容。

在这份首次公开工作草案(FPWD)出版物中,我们定义了两种 独立的方法,用于实现文本转语音(TTS)引擎在所有 操作环境中的准确、一致 且可靠的发音,而不受同时使用的任何辅助技术 的影响。我们现在发布两种方法,是为了从更广泛的社区获得 反馈,了解这两种方法中哪一种被认为更可取——以及原因。

文本转语音对残障人士是必要的,对 所有人也有用。准确发音在许多情况下都 至关重要,例如教育和教育 评估(测试学生)。如今许多计算机和移动 设备都内置了 TTS 功能,该功能也常被 非残障人士在 不同情境中使用,例如驾驶时或与个人 数据助手交互时。

W3C 的 Web 内容无障碍指南(WCAG) 强调了 正确发音的重要性。

例如,在英语中,同形异音异义词是指拼写相同但 发音和含义不同的词,例如 desert(放弃)和 desert(干旱地区)这两个词。…… 此外,在某些语言中,某些字符可以 以不同方式发音。例如在日语中,有 像汉字(Kanji)这样的字符具有多种发音。 ……如果读错,内容对 用户来说就没有意义。 理解 成功准则 3.1.6:发音
虽然 WCAG 提供了许多用于指示正确 发音的变通方法,但它仍被迫将成功准则 3.1.6 归类为 AAA,因为它无法指向可靠的技术解决方案。

W3C 有两项成熟的发音相关规范:

这些规范长期以来提供了技术方法,允许作者在其 HTML 文档中嵌入发音(以及相关语音呈现)标记,但由于若干技术 原因,SSML 的方法尚未被采用。此外,来自不同浏览器和辅助 技术供应商的反馈 表明,这不是一种可能或可行的方法。因此,在我们的 规范中,我们并不试图重新发明这个轮子,而是 弥合长期存在的技术障碍,这些障碍一直 阻碍 SSML 在 HTML 中的使用。我们的方法直接依赖这两项 规范,将它们包装为 HTML 验证会接受的属性。

如前所述,我们确定了两种候选方法:

任务组鼓励实现者和作者就这些方法 提供反馈。反馈经过分析后,将帮助 确定哪种 方法将成为最终的规范性 W3C 推荐标准。

以下各节包含每种方法的示例代码。 请参阅示例内容 示例, 其中包含音频文件,可与现有 TTS 技术进行比较。

编辑者注
使用 data- 前缀来命名属性并不是 编辑者的推荐或偏好。相反,这是 HTML 5.x 规范中定义的、开发 HTML 增强功能的规范 方法。 这种基于标准的开发方法支持实验性 实现,而这些实现又将为本 规范的进一步发展提供信息。

如需更深入地了解发音问题和相关 W3C 文档,请参阅发音 概述

2. 在 HTML 中包含 SSML 的多属性方法

通过将 SSML 标签和属性转换为 HTML 属性, 作者可以在其 HTML 文档中嵌入发音(以及相关语音呈现)。 作者可以将大多数受支持的标签彼此组合,以应用 多种语音效果。

SSML 中包含的大多数标记都适合大多数 内容开发者使用; 然而,某些功能,例如 phonemeprosody,可能需要专业知识。 日本的出版商对 SSML phoneme 元素使用了一种来自 EPUB 3 的类似 技术

Edgar Allen Poe 的 The Raven

示例 1
<p data-ssml-prosody-rate="slow" data-ssml-prosody-pitch="low">
    Once upon a midnight 
    <span data-ssml-phoneme-alphabet="ipa" data-ssml-phoneme-ph="ˈdrɪəri">dreary</span>
    <span data-ssml-break-time="500ms"></span>,
    while I pondered, weak
    <span data-ssml-break-time="150ms"></span> and weary,<br data-ssml-break-time="500ms" />
    Over many a quaint and curious volume of forgotten
    <span data-ssml-prosody-rate="x-slow" data-ssml-prosody-pitch="low"> lore—</span><br />
    While I nodded, nearly napping, suddenly there came a tapping,
    <br data-ssml-audio-src="/soundlibrary/wood/hits/hits_11" />
    As of some one gently rapping,
    <span data-ssml-audio-src="/soundlibrary/wood/hits/hits_11"></span>
    rapping at my chamber door.
    <span data-ssml-audio-src="/soundlibrary/wood/hits/hits_11"></span>
    <br data-ssml-audio-src="/soundlibrary/wood/hits/hits_11" />
    <span data-ssml-prosody-volume="x-soft" data-ssml-prosody-rate="medium">
      "'Tis some visitor,"
    </span>
    I muttered, <span data-ssml-prosody-volume="x-soft" data-ssml-prosody-rate="x-slow">
    <span data-ssml-phoneme-alphabet="ipa" data-ssem-phoneme-ph="tæpɪŋ">"tapping</span>
    at my chamber door—</span><br data-ssml-break-time="750ms" />
    Only this <span data-ssml-break-strength="weak"></span> and nothing
    <span data-ssml-break-strength="none"></span>
    <span data-ssml-prosody-volume="soft" data-ssml-prosody-rate="75%"> more."</span>
</p>

2.1 data-ssml-* 多属性集

这些属性提供与 SSML 对应项的功能等价性。 这些属性在以下 HTML 元素上有效:

2.1.1 data-ssml-say-as(-*)

允许作者对元素的文本内容进行分类。这些 属性派生自 SSML say-as 元素及其相关属性。

编辑者 注
interpret-as 似乎是多余的,并且 应当是隐含的

data-ssml-say-as

值: date | time | telephone | characters | cardinal | ordinal

data-ssml-say-as-format(可选)

值:如 W3C 说明、SSML say-as 属性值中定义的时间/日期格式。SSML 1.0 say-as 属性

data-ssml-say-as-detail(可选)

值:如 W3C 说明、SSML say-as 属性值中定义的 detail。SSML 1.0 say-as 属性

编辑者 注
data-ssml-say-as-detail 属性允许作者 针对 特定于实现的 TTS 引擎功能或行为。
示例 2
According the 2010 US Census, the population of <span data-ssml-say-as='characters'>90274</span>
increased to 25209 from 24976 over the past 10 years.

2.1.2 data-ssml-phoneme-*

为音位/语音发音定义两个必需属性。 带有 phoneme 属性的 元素只能包含文本(不能包含元素)。这些 属性派生自 SSML phoneme 元素及其相关属性。

data-ssml-phoneme-ph

值:音位字符串。

data-ssml-phoneme-alphabet

值:所使用的音标字母表。ipa | x-sampa

示例 3
Once upon a midnight <span data-ssml-alphabet="ipa" data-ssml-phoneme-ph="ˈdrɪəri">dreary</span>

2.1.3 data-ssml-sub-alias

一个用来替换文本内容以供发音的字符串值。 虽然类似于 aria-label,但 alias 不会改变 拼写(即盲文显示)。 此外,alias 属性可由不访问 无障碍 树的 TTS 技术使用。处理器应当对 alias 值应用文本规范化。该属性派生自 SSML sub 元素及其相关属性。

值:要替换并传递给 TTS 进行 呈现的文本字符串。

示例 4
<span data-ssml-sub-alias="Sodium Chloride">NaCL</span>

2.1.4 data-ssml-voice-*

一组定义产生值的属性,用于请求 改变说话声音。voice 元素有 两类属性:一类表示 期望的声音特征,另一类 控制行为。这些属性派生自 SSML voice 元素及其相关属性。

data-ssml-voice-gender(可选)

值:female | male | neutral

data-ssml-voice-age(可选)

值:对应年龄(以年为单位)的 integer

data-ssml-voice-variant(可选)

值:表示数字声音变体的 integer

data-ssml-voice-name(可选)

值:从当前 TTS 引擎请求的特定声音名称 (例如 "David")。

data-ssml-voice-languages(可选)

值:string,一个或多个 由空格分隔、由该声音朗读的语言列表。

编辑者 注
data-ssml-voice-languages 属性仅帮助 TTS 引擎选择适当的声音。它并不 指示内容的语言。若要指定语言,请使用 HTML lang 属性。
示例 5
She said, "<span data-ssml-voice-gender="female">My name is Marie</span>".

2.1.5 data-ssml-emphasis-level

请求以强调方式朗读文本内容 (也 称为突出或重音)。这是一个单一属性, 派生自 SSML emphasis 元素及其相关属性。

值:strong | moderate | none | reduced

示例 6
Please use <span data-ssml-emphasis-level="strong">extreme caution.</span>

2.1.6 data-ssml-break-*

描述与空元素关联的时序,用于 控制标记之间的停顿或其他韵律边界。 在 任意一对标记之间使用 break 属性是可选的。如果元素 不存在于标记之间,合成 处理器应 根据语言上下文自动确定停顿。 这些属性派生自 SSML break 元素及其相关属性。

data-ssml-break-strength

值: none | x-weak | weak | medium(默认)| strong | x-strong

data-ssml-break-time

值:string,包含以数字形式表示的时间 时长,如 "250ms"、"1s" 等。

示例 7
Take a deep breath,<span data-ssml-break-time="1s"></span> and exhale.

2.1.7 data-ssml-prosody-*

允许控制语音输出的音高、语速和音量。 这些属性派生自 SSML prosody 元素及其相关属性。

data-ssml-prosody-pitch(可选)

值: frequency-value"Hz" | +/- change value | "x-low" | "low" | "medium" | "high" | "x-high" | "default"

data-ssml-prosody-contour(可选)

值:如 SSML 1.1 推荐标准中定义的轮廓变化参数的 string

data-ssml-prosody-range(可选)

值:如 SSML 1.1 推荐标准中定义的 string range 值。

data-ssml-prosody-rate(可选)

值: non-negative-percentage% | "x-slow" | "slow" | "medium" | "fast"| "x-fast" | "default"

data-ssml-prosody-duration(可选)

值:string,包含时间时长(例如 "250ms"、 "1s" 等)。

data-ssml-prosody-volume(可选)

值: +/- soundlevel>"dB" | "silent" | "x-soft" | "soft" | "medium" | "loud" | "x-loud" | "default"

示例 8
The tortoise, said (slowly) "<span data-ssml-prosody-rate="x-slow">
I am almost at the finish line</span>."

2.1.8 data-ssml-audio-*

支持将录制的音频文件与 合成语音输出结合插入。 元素可以为空。如果元素不为空,则当 音频文档不可用时,应朗读其内容。 这些属性派生自 SSML audio 元素及其相关属性。

data-ssml-audio-src

值:带有适当媒体 文件的文档 URI。

data-ssml-audio-fetchtimeout (可选)

值:string,包含时间时长(例如 "250ms"、 "1s" 等)。

data-ssml-audio-fetchint(可选)

值:safe | prefetch

data-ssml-audio-maxage(可选)

值:string

data-ssml-audio-maxstale(可选)

值:string

data-ssml-audio-clipBegin(可选)

值:string,包含时间时长(例如 "250ms"、 "1s" 等)。

data-ssml-audio-clipEnd(可选)

值:string,包含时间时长(例如 "250ms"、 "1s" 等)。

data-ssml-audio-repeatCount(可选)

值:integer,表示重复播放 音频片段的次数。

data-ssml-audio-repeatDur(可选)

值:string,包含时间时长(例如 "250ms"、 "1s" 等)。

示例 9
You will hear a brief chime <span data-ssml-audio-src="/audio/chime.ogg"></span> 
when your time is up.

3. 在 HTML 中包含 SSML 的单属性方法

通过将 SSML 标签和属性转换为一个带有 JSON 字符串 值的单个 HTML 属性, 作者可以在其 HTML 文档中嵌入发音(以及相关语音呈现)。 作者可以将大多数受支持的标签彼此组合,以应用 多种语音效果。

SSML 中包含的大多数标记都适合大多数 内容开发者使用; 然而,某些功能,例如 phonemeprosody,可能需要专业知识。 这种方法是作为转换符合 IMS Question & Test Interoperability(QTI)规范的内容的一种手段出现的。QTI 标准支持在 HTML 中包含 SSML,以用于 教育评估中的 TTS 工具。

Edgar Allen Poe 的 The Raven

示例 1
<p data-ssml='{"prosody":{"rate":"slow","pitch":"low"}}'>
	Once upon a midnight
        <span data-ssml='{"phoneme":{"alphabet":"ipa","ph":"ˈdrɪəri"}}'>dreary</span>
	<span data-ssml='{"break":{"time":"500ms"}'></span>,
	while I pondered, weak
	<span data-ssml='{"break":{"time":"150ms"}'></span> and weary,
        <br data-ssml='{"break":{"time":"500ms"}' />
	Over many a quaint and curious volume of forgotten 
	<span data-ssml='{"prosody":{"rate":"x-slow","pitch":"low"}}'>lore—</span><br />
	While I nodded, nearly napping, suddenly there came a tapping,
	<br data-ssml='{"audio":{"src":"/soundlibrary/wood/hits/hits_11"}}'/>
	As of some one gently rapping,
	<span data-ssml='{"audio":{"src":"/soundlibrary/wood/hits/hits_11"}}'></span>
	rapping at my chamber door.
	<span data-ssml='{"audio":{"src":"/soundlibrary/wood/hits/hits_11"}}'></span>
	<br data-ssml='{"audio":{"src":"/soundlibrary/wood/hits/hits_11"}}' />
	<span data-ssml='{"prosody":{"volume":"x-soft","rate":"medium"}}'>
          "'Tis some visitor,"
        </span>
	I muttered, <span data-ssml='{"prosody":{"volume":"x-soft","rate":"x-slow"}}'>
	<span data-ssml='{"phoneme":{"alphabet":"ipa","ph":"tæpɪŋ"}}'>"tapping</span>
	at my chamber door—</span><br data-ssml='{"break":{"time":"750ms"}'/>
	Only this<span data-ssml='{"break":{"strength":"weak"}'></span>
	and nothing<span data-ssml='{"break":{"strength":"none"}'> </span>
	<span data-ssml='{"prosody":{"volume":"soft","rate":"75%"}}'>more."</span>
</p>

3.1 data-ssml 属性、性质和值

以下性质已被定义,并提供与其 SSML 对应项的功能等价性。

data-ssml 提供与 SSML 的功能等价性。 该属性在以下 HTML 元素上有效:

data-ssml 属性的值是一个 JSON 字符串,用 单引号(')括起, 其中包含一个表示特定 SSML 功能的单个 JSON 对象, 并带有一个或 多个性质/值对。有效的对象、性质和 相关值在 以下各节中定义。 JSON 架构见附录 A。

3.1.1 say-as

允许作者对元素的文本内容进行分类。JSON 定义派生自 SSML say-as 元素及其相关属性。

interpret-as

值: date | time | telephone | characters | cardinal | ordinal

format(可选)

值:如 W3C 说明 SSML say-as 属性值中定义的时间/日期格式。

detail(可选)

值:如 W3C 说明 SSML say-as 属性值中定义的 detail。

编辑者 注
detail 性质允许作者针对 特定于实现的 TTS 引擎功能或行为。
示例 2
According the 2010 US Census, the population of 
<span data-ssml='{"say-as":{"interpret-as":"characters"}}'>90274</span>
increased to 25209 from 24976 over the past 10 years.

3.1.2 phoneme

为音位/语音发音定义两个必需属性。 带有 phoneme 属性的 元素只能包含文本(不能包含元素)。 JSON 定义派生自 SSML phoneme 元素及其相关属性。

ph

值:string,包含与要朗读内容 对应的语音字符

data-ssml-phoneme-alphabet

值:ipa | x-sampa,定义用于 ph 字符串的 音标字母表

示例 3
Once upon a midnight 
<span data-ssml='{"phoneme":{"alphabet":"ipa","ph":"ˈdrɪəri"}}'>dreary</span>

3.1.3 sub

表示 alias 属性值中的文本 会替换文本内容用于发音。必需的 alias 性质指定要朗读的字符串,以替代 文本内容。处理器 应当对 alias 值应用文本规范化。 JSON 定义派生自 SSML sub 元素及其相关属性。

alias

值:string,包含要作为 应用了 sub 的元素的文本内容的替代内容来 朗读的文本。

示例 4
<span data-ssml='{"sub":{"alias":"Sodium Chloride"}}'>NaCL</span>

3.1.4 voice

请求改变说话声音。voice 有 两类属性:一类表示 期望的声音特征, 另一类控制行为。JSON 定义派生自 SSML voice 元素及其相关属性。

gender(可选)

值:female | male | neutral

age(可选)

值:对应年龄(以年为单位)的 integer

variant(可选)

值:表示数字声音变体的 integer

name(可选)

值:string,定义从当前 TTS 引擎请求的 特定声音名称,例如 "Microsoft David (English)"

languages(可选)

值:string,一个或多个 由空格分隔、由该声音朗读的语言列表。

编辑者 注
voice > languages 性质仅帮助 TTS 引擎选择适当的声音。它并不 指示内容的语言。若要指定语言,请使用 HTML lang 属性。
示例 5
She said, "<span data-ssml='{"voice":{"gender":"female"}}'>My name is Marie</span>".

3.1.5 emphasis

请求将应用 emphasis 的元素的文本内容 以强调方式朗读(也称为 突出或重音)。JSON 定义派生自 SSML emphasis 元素及其相关属性。

level

值:strong | moderate | none | reduced

示例 6
Please use <span data-ssml='{"emphasis":{"level":"strong"}}'>extreme caution.</span>

3.1.6 break

描述与空元素关联的时序,用于 控制标记之间的停顿或其他韵律边界。 在任意一对标记之间使用 break 是可选的。如果元素不存在于标记之间,合成处理器 应当根据语言上下文自动 确定停顿。JSON 定义派生自 SSML break 元素及其相关属性。

strength

值: none | x-weak | weak | medium(默认)| strong | x-strong

time

值:string,包含以数字形式表示的 时间时长,如 "250ms"、"1s" 等。(s=秒,ms=毫秒)

示例 7
Take a deep breath,<span data-ssml='{"break":{"time":"1s"}}'></span> and exhale.

3.1.7 prosody

允许控制语音输出的音高、语速和音量。 该对象有六个性质。JSON 定义 派生自 SSML prosody 元素及其相关属性。

pitch

值: frequency-value"Hz" | +/- change value | "x-low" | "low" | "medium" | "high" | "x-high" | "default"

contour

值:如 SSML 1.1 推荐标准中定义的 轮廓变化参数的 string

range

值:如 SSML 1.1 推荐标准中定义的 string range 值

rate

值: non-negative-percentage% | "x-slow" | "slow" | "medium" | "fast"| "x-fast" | "default"

duration

值:string,包含以数字形式表示的 时间时长,如 "250ms"、"1s" 等。

volume

值: +/- soundlevel>"dB" | "silent" | "x-soft" | "soft" | "medium" | "loud" | "x-loud" | "default"

示例 8
The tortoise, said (slowly) "
<span data-ssml='{"prosody":{"rate":"x-slow"}}'>I am almost at the finish line</span>."

3.1.8 audio

支持将录制的音频文件与 合成语音输出结合插入。 元素可以为空。如果元素不为空,则其 内容应为在音频文档 不可用时要朗读的文本。JSON 定义派生自 SSML audio 元素及其相关属性。

src

值:带有适当媒体 文件的文档 URI。

fetchtimeout

值:string,包含以数字形式表示的 时间时长,如 "250ms"、"1s" 等。

fetchint

值:safe | prefetch

maxage

值:string

maxstale

值:string

clipBegin

值:string,包含以数字形式表示的 时间时长,如 "250ms"、"1s" 等。

clipEnd

值:string,包含以数字形式表示的 时间时长,如 "250ms"、"1s" 等。

repeatCount

值:integer,表示重复播放 音频片段的次数。

repeatDur

值:string,包含以数字形式表示的 时间时长,如 "250ms"、"1s" 等。

示例 9
You will hear a brief chime 
<span data-ssml='{"audio":{"src":"/audio/chime.ogg"}}'></span> when your time is up.

4. 技术考虑事项

在每种方法中,实现者必须消费 data-ssml- 属性、值 以及相关文本内容,以生成目标 TTS 技术 所需的有效格式。 例如,如果目标是 Web Speech API, 实现必须生成有效的 SSML。如何确定每个发音 功能的文本 内容,将对这两种方法的实现者构成挑战。

遵循多属性方法时,实现者必须找到所有 相关属性 并将它们收集为适当的 SSML 表示。实现者必须 确定 如何处理创作错误,例如缺失必需属性、 冲突的功能 或无效值。

遵循单属性方法时,实现者必须解析 JSON 字符串值。 目前没有 W3C 推荐标准在 HTML 中使用 JSON 字符串作为属性 值,但有证据表明它被用于使用 data- 属性的自定义应用。

JSON 存在 潜在的安全问题,而创作错误导致的 格式错误 JSON 字符串的影响也是 需要更广泛审查的问题之一。 实现者必须确定如何处理格式错误的 JSON,以及 不正确的性质 和值组合。使用 JSON 架构可能有助于 单属性方法的作者和实现者。

虽然提出了一个 JSON 架构,但也存在潜在的相关 标准,例如 正在开发中的 SpeakableSpecification。 将 SSML 转换为合适的 JSON 架构可能会 给实现者和作者造成困惑。通常,这类转换 “……并非完全 1:1 的转换,但非常非常接近”。据推测, 创作工具可以通过 消除作者直接编写 JSON 的需要来解决 这些问题。

A. SSML JSON 架构

请参阅此处的 JSON 架构示例。

B. 致谢

本节为非规范性内容。

以下人员为本文档的开发作出了贡献。

B.1 发布时在发音 TF 中活跃的参与者