CSS 语音模块第 1 级

W3C 候选推荐标准草案

关于此文档的更多细节
此版本
https://w3org.cn/TR/2023/CRD-css-speech-1-20230214/
最新发布版本
https://w3org.cn/TR/css-speech-1/
编辑草案
https://drafts.csswg.org/css-speech-1/
历史版本
历史
https://w3org.cn/standards/history/css-speech-1
实现报告
https://wpt.fyi/results/css/css-speech
测试套件
http://test.csswg.org/suites/css-speech-1_dev/nightly-unstable/
反馈
CSS 工作组问题仓库
编辑
(Tetralogical)
Elika J. Etemad / fantasai (特邀专家)
前任编辑
(DAISY Consortium)
Claudio Santambrogio (Opera Software)
(W3C / Canon)
建议编辑此规范
GitHub 编辑器

摘要

语音(Speech)模块定义了听觉 CSS 属性,使作者能够通过语音合成及可选的音频提示,以声明方式控制文档的呈现。注意:本标准是与 Voice Browser Activity(语音浏览器活动) 协作开发的。

CSS 是一种用于描述结构化文档(如 HTML 和 XML)在屏幕、纸张等介质上渲染方式的语言。

关于本文档

本部分描述了本文档在发布时的状态。当前 W3C 出版物列表及本技术报告的最新版本可在 W3C 技术报告索引(https://w3org.cn/TR/)中找到。

本文档由 CSS 工作组推荐标准轨道发布为候选推荐标准草案。作为候选推荐标准发布并不意味着得到了 W3C 及其成员的背书。候选推荐标准草案整合了前一个候选推荐标准中的变更,工作组打算将其包含在后续的候选推荐标准快照中。

这是一份草案文档,可能会随时被其他文档更新、替换或废弃。将其作为非进行中工作引用是不恰当的。

请通过 在 GitHub 上提交问题(首选)发送反馈,并在标题中包含规范代码“css-speech”,例如:“[css-speech] …评论摘要…”。所有问题和评论均已 存档。或者,也可以将反馈发送至(已存档的)公共邮件列表 www-style@w3.org

本文档受 2021 年 11 月 2 日版 W3C 流程文档管辖。

本文档由在 W3C 专利政策下运作的组织制作。W3C 维护一份与该组织交付成果相关的 公开专利披露列表;该页面还包含披露专利的说明。任何知悉其认为包含 必要权利要求 的专利的个人,必须按照 W3C 专利政策第 6 节披露该信息。

以下功能存在风险,可能会在 CR 期间被删除:

“风险(At-risk)”是 W3C 流程中的术语,并不一定意味着该特性面临被删除或推迟的危险。这表示工作组认为该特性可能难以及时实现互操作,将其标记为此类允许工作组在转向“建议推荐标准(Proposed Rec)”阶段时,在必要的情况下删除该特性,而无需先发布一个不包含该特性的新“候选推荐标准(Candidate Rec)”。

1. 简介,设计目标

本节是非规范性的。

信息的听觉呈现通常由盲人、视力障碍者或其他阅读障碍者使用。例如,“屏幕阅读器”允许用户与视觉界面交互,否则他们将无法使用这些界面。在某些情况下,无论个人的身体状况如何,倾听内容(相对于阅读)都是更受欢迎甚至必需的选择。例如:在驾驶车辆时播放电子书、学习操作工业或医疗设备、与家庭娱乐系统交互、教幼儿学习阅读。

本语音模块定义的 CSS 属性使作者能够以声明方式控制文档在听觉维度的呈现。文档的听觉渲染结合了语音合成(也称为“TTS”,即文本转语音的缩写)和听觉图标(在本规范中称为“音频提示”)。CSS 语音属性提供了控制语音音高和语速、声级、TTS 音色等的能力。这些样式表属性可以与视觉属性(混合媒体)一起使用,也可以作为视觉呈现的完全听觉替代方案。

2. 背景信息,CSS 2.1

本节是非规范性的。

CSS 语音模块是对资料性 CSS 2.1 听觉附录的重构,其中描述了 aural 媒体类型,但该类型也已被弃用(转而使用现也已被弃用的 speech 媒体类型)。尽管 [CSS2] 规范保留了 speech 媒体类型,但它并未实际定义相应的属性。语音模块描述了适用于语音输出的 CSS 属性,并定义了一个专门用于听觉维度的“盒”模型。

内容创建者可以为任何媒体类型的用户代理包含语音合成文本的 CSS 属性——尽管通常它们只对 allscreen 有意义。不支持语音模块的用户代理将简单地忽略这些样式。

3. 与 SSML 的关系

本节是非规范性的。

本规范中的某些功能在概念上类似于语音合成标记语言(SSML)1.1 版 [SSML] 中描述的功能。然而,CSS 模型的具体性意味着在语法和/或语义方面与 SSML 的兼容性只能部分实现。语音模块中每个属性的定义都包含了必要的信息性说明,以阐明它们与 SSML 中类似功能的关系。

3.1. 值定义

本规范遵循 [CSS2] 中的 CSS 属性定义约定,并使用 [CSS-VALUES-3] 中的 值定义语法。本规范中未定义的值类型在 CSS Values & Units [CSS-VALUES-3] 中定义。与其他 CSS 模块的组合可能会扩展这些值类型的定义。

除了定义中列出的属性特定值外,本规范中定义的所有属性也都接受 CSS 全局关键字 作为其属性值。为了可读性,未明确重复列出。

4. 示例

本示例展示了作者如何告知语音合成器以名为“paul”的音色朗读 HTML 标题,并使用“中等”强调(比正常程度更强),以及如何在每个标题进行 TTS 渲染开始前插入一个音频提示(位于给定 URL 的预录音频片段)。在支持立体声的音响系统中,标记为 CSS 类 heidi 的段落将在左音频通道渲染(并使用女声等),而类 peter 则对应右通道(并使用男声等)。标记为类 special 的文本段的音量水平比正常水平低,并且通过在朗读后引入强停顿来创建韵律边界(注意 span 是如何从其父段落继承 voice-family 的)。
h1, h2, h3, h4, h5, h6 {
  voice-family: paul;
  voice-stress: moderate;
  cue-before: url(../audio/ping.wav);
  voice-volume: medium 6dB;
}
p.heidi {
  voice-family: female;
  voice-balance: left;
  voice-pitch: high;
  voice-volume: -6dB;
}
p.peter {
  voice-family: male;
  voice-balance: right;
  voice-rate: fast;
}
span.special {
  voice-volume: soft;
  pause-after: strong;
}

...

<h1>I am Paul, and I speak headings.</h1>
<p class="heidi">Hello, I am Heidi.</p>
<p class="peter">
  <span class="special">Can you hear me ?</span>
  I am Peter.
</p>

5. 听觉格式化模型

用于听觉媒体的 CSS 格式化模型基于在嵌套上下文内发生的一系列声音和静音,类似于 视觉盒模型,我们将其命名为 听觉“盒”模型。听觉“画布”由双通道(立体声)空间和时间维度组成,合成语音和音频提示在其中共存。所选元素周围环绕着 rest(间歇)、cue(提示)和 pause(停顿)属性(从最内层到最外层)。它们可以分别被视为 padding(内边距)、border(边框)和 margin(外边距)的听觉等价物。使用时,::before::after 伪元素 [CSS2] 会被插入到元素内容与 rest 之间。

下图展示了应用于所选 <element> 的视觉和听觉盒模型属性之间的等价关系

The aural 'box' model, illustrated by a diagram: the selected element is positioned in the center, on its left side are (from innermost to outermost) rest-before, cue-before, pause-before, on its right side are (from innermost to outermost) rest-after, cue-after, pause-after, where rest is conceptually similar to padding, cue is similar to border, pause is similar to margin.

6. 混合属性

6.1. voice-volume 属性

名称voice-volume
silent | [[x-soft | soft | medium | loud | x-loud] || <decibel>]
初始值 medium
应用于 所有元素
可继承
百分比 不适用
计算值 silent,或关键字值及可选的分贝偏移量(如果非零)
规范顺序 按语法

voice-volume 属性允许作者控制由语音合成器产生的音频波形的振幅,也用于调整所选元素 听觉盒模型音频提示 的相对音量水平。

注意: 虽然此属性提供的功能类似于 SSML 标记语言 [SSML]prosody 元素的 volume 属性,但两者存在显著差异。例如,CSS 语音音量关键字和分贝单位并非互斥,这是由于值在所选元素上的继承和组合方式所致。

silent
指定不产生声音(文本“静默”朗读)。

注意: 这与使用负无穷大分贝的效果相同。另请注意,将 voice-volume 属性值设为 silent 的元素,与将 speak 属性值设为 none 的元素之间存在差异。前者中,所选元素所占用的时间与朗读时相同(包括元素前后的任何停顿),但不产生声音(所选元素 听觉盒模型 内的后代可以覆盖 voice-volume 值,因此可能会产生音频输出)。后者中,所选元素在听觉维度不渲染,且不分配播放时间(所选元素 听觉盒模型 内的后代可以覆盖 speak 值,因此可能会产生音频输出)。

x-softsoftmediumloudx-loud
这一系列关键字对应单调递增的音量水平,映射到满足听者对感知响度要求的实现相关值。这些音频水平通常通过偏好设置机制提供,允许用户根据其听觉环境校准声音选项。关键字 x-soft 映射到用户的最小可听音量水平,x-loud 映射到用户的最大可容忍音量水平,medium 映射到用户的首选音量水平,softloud 则映射到中间值。
<decibel>
这表示相对于给定关键字值(见上文枚举)、根元素的默认值,或者继承音量水平(这本身可能是关键字值与分贝偏移量的组合,在这种情况下分贝值会相加)的更改(正向或负向)。当继承的音量水平为 silent 时,此 voice-volume 也会解析为 silent,而无论指定的 <decibel> 值为何。

<decibel> 类型表示一个带有“dB”(分贝单位)标识符的 量纲。根据以下对数公式,分贝表示新信号振幅 a1 的平方与当前振幅 a0 的平方之比:volume(dB) = 20 × log10(a1 / a0)。

注意: -6.0dB 约为音频信号振幅的一半,+6.0dB 约为两倍。

注意: 感知响度取决于多种因素,如听觉环境、用户偏好或身体能力。x-softx-loud 之间的有效音量变化代表了音频输出的动态范围(就响度而言)。通常情况下,该范围在嘈杂环境中会被压缩,即对应 x-soft 的感知响度将比在安静环境中更接近 x-loud。也可能存在将 x-softx-loud 都映射为低音量水平的情况,例如在需要安静的听觉环境中(如图书馆、夜间阅读)。

6.2. voice-balance 属性

名称voice-balance
<number> | left | center | right | leftwards | rightwards
初始值 center
应用于 所有元素
可继承
百分比 不适用
计算值 指定的值解析为 -100100(含)之间的 <number>
规范顺序 按语法

voice-balance 属性控制音频输出在横向声场上的空间分布:一端位于左侧,另一端位于右侧,相对于听者的位置。作者可以在左右极端之间指定中间步长,以表示沿生成的左右轴线的音频分离。

注意: SSML 标记语言 [SSML] 中没有与此属性功能相匹配的内容。

<number>
-100100(含)之间的 数字。小于 -100 的值将被截断为 -100。大于 100 的值将被截断为 100。值 -100 代表左侧,值 100 代表右侧。值 0 代表中心点,此时左右两侧之间没有可辨别的音频分离。(在立体声系统中,这对应于左右扬声器之间音频信号的平均分配)。
left
等同于 -100
center
等同于 0
right
等同于 100
leftwards
通过从继承的 voice-balance 值中减去 20(并将所得数字截断为 -100),将声音向左移动。
rightwards
通过将 20 加到继承的 voice-balance 值(并将所得数字截断为 100),将声音向右移动。

用户代理可以连接到不同种类的音响系统,这些系统具有不同的音频混合功能。单声道、立体声和环绕声系统的预期行为定义如下

CSS 语音模块的未来版本可能包含对三维音频的支持,这将有效地使作者能够指定“方位角”和“仰角”值。将来,使用当前规范创作的内容因此可以由符合支持三维音频版本 CSS 语音的用户代理所消费。为了为这种可能性做准备,当前 voice-balance 属性启用的值设计为保持与“方位角”角度兼容。更确切地说,当前左右音频轴(横向声场)与围绕听者位置预想的 360 度平面之间的映射定义如下

注意: 音响系统可以由用户配置,从而干扰文档作者指定的左右音频分布。通常,现代音响系统中可用的各种“环绕”模式(包括基于基本立体声扬声器的系统)往往会极大地改变音频信号的感知空间排列。三维声场的幻觉通常是通过相位移动、数字延迟、音量控制(通道混合)和其他技术的组合来实现的。有些用户甚至可能将他们的系统配置为将任何渲染的声音“降级”为单一单声道通道,在这种情况下,voice-balance 属性的效果显然根本无法感知。因此,创作内容的渲染保真度取决于此类用户自定义,而 voice-balance 属性仅指定预期的最终结果。

注意: 许多语音合成器只产生单声道声音,因此在本质上不支持 voice-balance 属性。因此,沿左右轴的音频分布发生在合成后阶段(当启用语音的用户代理混合文档中创作的各种音频源时)。

7. 朗读属性

7.1. speak 属性

名称speak
auto | never | always
初始值 auto
应用于 所有元素
可继承
百分比 不适用
计算值 指定的值
规范顺序 按语法

speak 属性确定是否以听觉方式渲染文本。

注意: SSML 标记语言 [SSML] 中没有与此属性功能相匹配的内容。

auto
displaynone 时解析为 never 的计算值,否则解析为 auto 的计算值。如果 visibilityvisible,则 auto 的使用值等同于 always,否则等同于 never

注意: display 属性的 none 值不能被所选元素的后代覆盖,但 speakauto 值可以通过使用 neveralways 来覆盖。

never
该值导致元素(包括停顿、提示、间歇和实际内容)不被渲染(即,该元素在听觉维度上没有影响)。

注意: 受影响元素的任何后代均可覆盖此值,因此即使在此级别使用 display: none,后代实际上也可以参与听觉渲染。然而,祖先元素的停顿、提示和间歇在听觉维度上保持“停用”,因此不参与 停顿合并 或相邻间歇的相加行为。

always
该元素以听觉方式渲染(无论其 display 值,或其祖先的 displayspeak 值为何)。

注意: 使用此值可能会导致元素在听觉维度被渲染,即使它不会在视觉画布上渲染。

7.2. speak-as 属性

名称speak-as
normal | spell-out || digits || [ literal-punctuation | no-punctuation ]
初始值 normal
应用于 所有元素
可继承
百分比 不适用
计算值 指定的值
规范顺序 按语法

speak-as 属性根据预定义的可能性列表,确定文本以何种方式进行听觉渲染。

注意: 此属性提供的功能在概念上类似于 SSML 标记语言 [SSML] 中的 say-as 元素(其可能的值在 [SSML-SAYAS] W3C 笔记中描述)。尽管设计目标相似,但 CSS 模型仅限于一组基本发音规则。

normal
使用语言特定的发音规则来渲染元素的内容。例如,标点符号不会照原样朗读,而是根据需要自然地渲染为相应的停顿。
spell-out
逐字母拼写文本(适用于缩略词和缩写)。在变音字符很少的语言中,允许为了替代非变音拼写而省略变音符号。例如,在英语中,单词“rôle”也可以写作“role”。因此,符合要求的实现能够将“rôle”拼写为“R O L E”。
digits
按数字逐位朗读,例如,“twelve”会被朗读为“one two”,“31”会被朗读为“three one”。

注意: 语音合成器知道什么是数字speak-as 属性使得用户代理如何渲染数字得到一定程度的控制,并可能作为在将文本传递给实际语音合成器之前的预处理步骤来实现。

literal-punctuation
诸如分号、大括号等标点符号被大声读出(即按字面朗读),而不是自然地渲染为相应的停顿。
no-punctuation
标点符号不进行渲染:既不朗读也不渲染为停顿。

8. 停顿属性

8.1. pause-beforepause-after 属性

名称pause-beforepause-after
<time> | none | x-weak | weak | medium | strong | x-strong
初始值 none(无)
应用于 所有元素
可继承
百分比 不适用
计算值 指定的值
规范顺序 按语法

pause-beforepause-after 属性指定在元素进行语音合成渲染之前(或之后)发生的韵律边界(具有特定持续时间的静音),或者如果指定了任何 cue-before(或 cue-after),则在 听觉盒模型 内的该提示之前(或之后)。

注意:虽然此属性提供的功能类似于 SSML 标记语言 [SSML] 中的 break 元素,但 CSS 语音 听觉盒模型pause 韵律边界的应用需要特殊考虑(例如 “合并”停顿)。

<time>
以绝对时间单位(秒和毫秒,例如“+3s”、“250ms”)表示停顿。只允许非负值。
none
等同于 0ms(语音处理器不产生韵律中断)。
x-weakweakmediumstrong,以及 x-strong
通过语音输出中韵律中断的强度来表达停顿。具体时间取决于实现。这些值表示元素之间单调递增(概念上增加)的中断强度。

注意: 更强的内容边界通常伴随更明显的停顿。例如,段落之间的中断通常比句子内单词之间的中断要大得多。

此示例说明了特定元素的默认韵律中断强度(由用户代理样式表定义)如何被作者定义的样式所覆盖。
p { pause: none } /* pause-before: none; pause-after: none */

8.2. pause 简写属性

名称pause
<'pause-before'> <'pause-after'>?
初始值 不适用(见各个属性)
应用于 所有元素
可继承
百分比 不适用
计算值 不适用(见各个属性)
规范顺序 按语法

pause 属性是 pause-beforepause-after 的简写属性。如果给定两个值,第一个值是 pause-before,第二个是 pause-after。如果只给定一个值,它同时应用于两个属性。

属性值示例

h1 { pause: 20ms; } /* pause-before: 20ms; pause-after: 20ms */
h2 { pause: 30ms 40ms; } /* pause-before: 30ms; pause-after: 40ms */
h3 { pause-after: 10ms; } /* pause-before: unspecified; pause-after: 10ms */

8.3. 合并停顿

停顿定义了听觉“盒”与其前后听觉“盒”之间的最小距离。相邻的停顿通过选择最强的命名中断和最长的绝对时间间隔进行合并。例如,在合并“strong”和“weak”时选择“strong”,在合并“1s”和“250ms”时选择“1s”,而在合并“strong”和“250ms”时,“strong”和“250ms”会产生相加效果。

以下停顿是相邻的

如果一个合并停顿的任何组成部分停顿与另一个停顿相邻,则该合并停顿被视为与另一个停顿相邻。

注意: pause 已从元素内容与任何 cue 之间移动到了 cue 之外。这与资料性 CSS 2.1 听觉附录 [CSS2] 不向后兼容。

9. 间歇属性

9.1. rest-beforerest-after 属性

名称rest-beforerest-after
<time> | none | x-weak | weak | medium | strong | x-strong
初始值 none(无)
应用于 所有元素
可继承
百分比 不适用
计算值 指定的值
规范顺序 按语法

rest-beforerest-after 属性指定在 听觉盒模型 内,元素语音合成渲染之前(或之后)发生的韵律边界(具有特定持续时间的静音)。

注意: 虽然此属性提供的功能类似于 SSML 标记语言 [SSML] 中的 break 元素,但 CSS 语音 听觉盒模型rest 韵律边界的应用需要特殊考虑(例如穿插的音频提示、相加的相邻间歇)。

<time>
以绝对时间单位(秒和毫秒,例如“+3s”、“250ms”)表示间歇。只允许非负值。
none
等同于 0ms。(语音处理器不产生韵律中断。)
x-weakweakmediumstrong,以及 x-strong
通过语音输出中韵律中断的强度来表达间歇。具体时间取决于实现。这些值表示元素之间单调递增(概念上增加)的中断强度。

停顿属性 相反,间歇被插入到元素内容与任何 cue-beforecue-after 内容之间。相邻的间歇被相加处理,不会合并。

9.2. rest 简写属性

名称rest
<'rest-before'> <'rest-after'>?
初始值 不适用(见各个属性)
应用于 所有元素
可继承
百分比 不适用
计算值 不适用(见各个属性)
规范顺序 按语法

rest 属性是 rest-beforerest-after 的简写。如果给定两个值,第一个值是 rest-before,第二个是 rest-after。如果只给定一个值,它同时应用于两个属性。

10. 提示属性

10.1. cue-beforecue-after 属性

名称cue-beforecue-after
<uri> <decibel>? | none
初始值 none(无)
应用于 所有元素
可继承
百分比 不适用
计算值 指定的值
规范顺序 按语法

cue-beforecue-after 属性指定在 听觉盒模型 内元素之前(或之后)播放的听觉图标(即预录制/预生成的音频片段)。

注意: 虽然此属性提供的功能看起来与 SSML 标记语言 [SSML] 中的 audio 元素相关,但实际上存在重大差异。例如,听觉盒模型 意味着音频提示与元素的音量水平相关联;且 CSS 语音的听觉图标与 SSML 的 audio 元素相比提供了有限的功能。

<uri>
URI 指定了一个听觉图标资源。当用户代理无法渲染指定的听觉图标(例如缺少文件资源或不支持的音频编解码器)时,建议产生替代提示,例如铃声。
none(无)
指定不使用听觉图标。
<decibel>
表示相对于所选元素 听觉盒模型voice-volume 属性计算值的改变(正向或负向)。(因此,当 voice-volume 属性改变时,音频提示的音量水平也会改变)。省略时,隐式值计算为 0dB。

voice-volume 属性的计算值为 silent 时,音频提示也设置为 silent(无论指定的 <decibel> 值为何)。否则(当不为 silent 时),voice-volume 值总是相对于音量关键字(见 voice-volume 的定义)来指定,这些关键字映射到用户校准的“首选”响度设置范围。如果继承的 voice-volume 值已经包含分贝偏移量,音频提示特定的 dB 偏移量会相加组合。

注意: 音量设置为 silent 的音频提示与值为 none 的音频提示之间存在差异。在前者中,音频提示占用的时间与实际播放相同,但不产生声音。在后者中,音频提示根本不会表现出来(即在听觉维度不会为提示分配时间)。

属性值示例

a
{
  cue-before: url(/audio/bell.aiff) -3dB;
  cue-after: url(dong.wav);
}

h1
{
  cue-before: url(../clips-1/pop.au) +6dB;
  cue-after: url(../clips-2/pop.au) 6dB;
}

div.caution { cue-before: url(./audio/caution.wav) +8dB; }

10.2. 音频提示与语音合成音量水平之间的关系

本节是非规范性的。

所选元素 听觉盒模型 内音频提示与语音合成的音量水平是相关的。例如,音量水平设置为 +0dB(由 <decibel> 值指定)的音频提示的预期效果是,其播放时的感知响度接近所选元素语音合成渲染的感知响度,这由 voice-volume 属性的计算值决定。注意,voice-volume 属性的计算值为 silent 会导致音频提示也被“强行”静音(即无论指定的音频提示 <decibel> 值如何)。

voice-volume 属性的音量关键字是经用户校准的,以满足创作时未知的要求(例如听觉环境、个人偏好)。因此,为了实现音频提示与语音合成的近似响度对齐,作者应确保音频提示的音量水平(平均而言,因为感知响度可能会因音频流的变化而产生离散差异,如语调、强调等)匹配基于拟用 voice-family 的语音合成渲染的输出,并给定“典型”听觉条件(即默认系统音量水平,频率谱上居中的均衡)。由于语音处理器能够直接控制生成文本转语音音频的波形振幅,且由于用户代理能够调整音频提示的音量输出(即根据数字化声音片段的固有波形振幅放大或衰减音频信号),这设定了一个基准,使实现能够管理听觉盒模型内 TTS 和提示音频流的响度,相对于用户校准的音量水平(参见 voice-volume 属性中定义的关键字)。

由于感知音频特征(例如响度)与应用于数字化音频信号的处理(例如信号压缩)之间存在复杂关系,我们参考了一个简单的场景,其中衰减以分贝为单位表示,通常范围从 0dB(即最大音频输入,接近削波阈值)到 -60dB(即完全静音)。在此背景下,“标准”音频片段将在这些值之间振荡,最响的峰值水平将接近 -3dB(以避免失真),相关可听段落的平均(RMS)音量水平将尽可能高(即不要太安静,以避免放大期间的背景噪声)。这大致提供了一种可以与文本转语音输出无缝结合的音频体验(即从预录音频切换到语音合成时,音量水平不会有可察觉的差异)。虽然目前没有行业标准来支持这种惯例,但不同的 TTS 引擎在未指定增益或衰减时往往会生成响度相当的音频信号。对于语音和轻音乐,-15dB RMS 似乎是相当标准的。

10.3. cue 简写属性

名称cue
<'cue-before'> <'cue-after'>?
初始值 不适用(见各个属性)
应用于 所有元素
可继承
百分比 不适用
计算值 不适用(见各个属性)
规范顺序 按语法

cue 属性是 cue-beforecue-after 的简写。如果给定两个值,第一个值是 cue-before,第二个是 cue-after。如果只给定一个值,它同时应用于两个属性。

简写符号示例

h1
{
  cue-before: url(pop.au);
  cue-after: url(pop.au);
}
/* ...is equivalent to: */
h1
{
  cue: url(pop.au);
}

11. 语音特征属性

11.1. voice-family 属性

名称voice-family
[[<family-name> | <generic-voice>],]* [<family-name> | <generic-voice>] | preserve
初始值 由实现决定的
应用于 所有元素
可继承
百分比 不适用
计算值 指定的值
规范顺序 按语法

voice-family 属性指定了一个以逗号分隔的组成值优先级列表,表明它们是替代项。(这类似于视觉样式表中的 font-family。)每个组成值通过指定匹配标准,潜在地指定一个语音合成音色实例。请参阅关于此主题的 语音选择 部分。

<generic-voice> = [<age>? <gender> <integer>?]

注意: 虽然此属性提供的功能类似于 SSML 标记语言 [SSML] 中的 voice 元素,但 CSS 语音不提供与 SSML 复杂的语音语言选择等同的功能。这种技术限制可能会在语音模块的未来版本中得到缓解。

<family-name>
值是具体的音色实例(例如:Mike, comedian, mary, carlos2, "valley girl")。与 font-family 名称一样,音色名称必须以 字符串 形式加引号,或者作为一或多个 CSS 标识符 的序列不加引号。

注意: 因此,大多数标点符号或位于每个标记开头的数字,在不加引号的音色名称中必须进行转义。

如果将一系列标识符作为音色名称给出,计算出的值是通过用单个空格连接序列中所有标识符而转换为字符串的名称。

恰好与性别关键字(malefemaleneutral)相同,或恰好匹配 CSS 广泛关键字preserve 的音色名称,必须加引号以与这些关键字区分开来。关键字 default 保留供将来使用,用作音色名称时也必须加引号。

注意:[SSML] 中,音色名称是以空格分隔的,不能包含空白字符。

建议对包含空白、数字或除连字符以外的标点符号的音色名称加引号——即使这些音色名称在不加引号的形式下是有效的——以提高代码清晰度。例如:voice-family: "john doe", "Henry the-8th";

<age>
可能的值有 childyoungold,指示语音选择期间匹配的首选年龄类别。

注意:[SSML] 年龄的推荐映射为:child = 6 岁,young = 24 岁,old = 75 岁。处理器相关的语音匹配算法可以使用更灵活的年龄范围。

<gender>
关键字 malefemaleneutral 之一,分别指定男性、女性或中性声音。

注意: 人类年龄或性别与可识别音色类型之间关系的解释,无法现实地以通用方式定义,因为它实际上取决于众多标准(文化、语言、生物等)。因此,本规范提供的功能代表了一个可以合理应用于广泛语音语境的简化模型,尽管是以一定程度的近似为代价的。随着语音处理器实现变得更加标准化,本规范的未来版本可能会提高语音匹配算法的精确度。

<integer>
表示首选变体的整数(例如“第二个男性儿童声音”)。只允许正整数(即不包括零)。值 1 指所有匹配声音中的第一个。
preserve(保留)
指示 voice-family 值被继承并使用,无论内容标记中是否有任何潜在的语言更改(见下文关于语音选择和语言处理的部分)。当应用于根元素时,此值表现为 inherit。注意:元素的后代会自动继承 preserve 值,除非它被其他 voice-family 值(例如名称、性别、年龄)显式覆盖。

无效声明示例

voice-family: john/doe; /* forward slash character should be escaped */
voice-family: john "doe"; /* identifier sequence cannot contain strings */
voice-family: john!; /* exclamation mark should be escaped */
voice-family: john@doe; /* "at" character should be escaped */
voice-family: #john; /* identifier cannot start with hash character */
voice-family: john 1st; /* identifier cannot start with digit */

11.1.1. 语音选择,内容语言

voice-family 属性用于引导语音合成音色实例的选择。作为此选择过程的一部分,支持语音的用户代理还必须考虑标记内容中选定元素的语言。“名称”、“性别”、“年龄”和首选“变体”(索引)是语音选择提示,随着 voice-family 属性值被后代元素继承,这些提示会沿着内容层次结构向下传递。在内容结构的任何点上,语言都优先(即具有比指定的 CSS 语音特征更高的优先级)。

以下列表概述了语音选择算法(注意此处的“语言”定义较为宽松,以迎合方言变化)

每当内容流中任何 CSS 语音特征发生变化时,必须重新评估语音合成器语音(即必须再次进行选择过程)。每当内容语言发生变化时,语音也必须重新计算,除非使用了 preserve 关键字(这在嵌入的外语文本可以使用非为此语言设计的语音朗读的情况下非常有用,如下例所示)。

注意: 动态计算语音可能会导致意外滞后,因此用户代理应尽量在播放开始前解析文档树中的具体语音实例。

属性值示例

h1 { voice-family: announcer, old male; }
p.romeo  { voice-family: romeo, young male; }
p.juliet { voice-family: juliet, young female; }
p.mercutio { voice-family: young male; }
p.tybalt { voice-family: young male; }
p.nurse { voice-family: amelie; }

...

<p class="romeo" xml:lang="en-US">
  The French text below will be spoken with an English voice:
  <span style="voice-family: preserve;" xml:lang="fr-FR">Bonjour monsieur !</span>

  The English text below will be spoken with a voice different
  than that corresponding to the class "romeo"
  (which is inherited from the "p" parent element):
  <span style="voice-family: female;">Hello sir!</span>
</p>

11.2. voice-rate 属性

名称voice-rate
[normal | x-slow | slow | medium | fast | x-fast] || <percentage>
初始值 normal
应用于 所有元素
可继承
百分比 参考默认值
计算值 关键字值,以及可选的相对于关键字的百分比(如果非 100%)
规范顺序 按语法

voice-rate 属性以每分钟字数操纵生成合成语音的语速。

注意: 虽然此属性提供的功能类似于 SSML 标记语言 [SSML]prosody 元素的 rate 属性,但存在显著差异。例如,CSS 语音语速关键字和百分比修饰符并非互斥,这是由于值在所选元素上的继承和组合方式所致。

normal
表示语音合成器为当前活动语音产生的默认语速。这是处理器特定的,取决于语言和方言,以及语音的“个性”。
x-slowslowmediumfastx-fast
一系列实现和语音特定的单调递增朗读速度。例如,英语的典型值(每分钟字数)为:x-slow = 80, slow = 120, medium = 180 到 200 之间, fast = 500。
<percentage>

只允许非负 百分比 值。这表示相对于给定关键字值(见上文枚举)、根元素的默认值,或者继承语速(这本身可能是关键字值与百分比的组合,在这种情况下百分比会相乘组合)的更改。例如,50% 意味着语速乘以 0.5(值的一半)。超过 100% 的百分比会导致更快的语速(相对于基础关键字),而低于 100% 的百分比则导致更慢的语速。

继承值示例

<body>
  <e1>
    <e2>
      <e3>
        ...
      </e3>
    </e2>
  </e1>
</body>

body { voice-rate: inherit; } /* the initial value is 'normal'
                                 (the actual speaking rate value
                                 depends on the active voice) */

e1 { voice-rate: +50%; } /* the computed value is
                            ['normal' and 50%], which will resolve
                            to the rate corresponding to 'normal'
                            multiplied by 0.5 (half the speaking rate) */

e2 { voice-rate: fast 120%; } /* the computed value is
                                 ['fast' and 120%], which will resolve
                                 to the rate corresponding to 'fast'
                                 multiplied by 1.2 */

e3 { voice-rate: normal; /* "resets" the speaking rate to the intrinsic voice value,
                            the computed value is 'normal' (see comment below for actual value) */
     voice-family: "another-voice"; } /* because the voice is different,
                                         the calculated speaking rate may vary
                                         compared to "body" (even though the computed
                                         'voice-rate' value is the same) */

11.3. voice-pitch 属性

名称voice-pitch
<frequency> && absolute | [[x-low | low | medium | high | x-high] || [<frequency> | <semitones> | <percentage>]]
初始值 medium
应用于 所有元素
可继承
百分比 参考继承值
计算值 如果仅单独指定关键字,则为预定义的音高关键字之一,否则为绝对频率,该频率是通过将关键字值(如有)转换为基于当前 voice-family 的固定频率并应用指定的相对偏移量(如有)计算得出的
规范顺序 按语法

voice-pitch 属性指定生成语音输出的“基准”音高,这取决于所使用的 voice-family 实例,并在不同的语音合成处理器之间有所不同(它大致对应于输出的平均音高)。例如,男声的常用音高约为 120Hz,而女声约为 210Hz。

注意:尽管此属性提供的功能类似于 SSML 标记语言 [SSML]prosody 元素的 pitch 属性,但两者存在显著差异。例如,由于 CSS Speech 的值在选中元素中继承和组合的方式,其音高关键字和相对变化(频率、半音或百分比)并非互斥的。

<frequency>
以频率单位(赫兹或千赫兹,例如 100Hz, +2kHz)表示的值。当指定了 absolute 关键字时,值仅限正数。否则(未指定 absolute 关键字时),负值表示相对于继承值的减少,正值表示相对于继承值的增加。例如,2kHz 是一个正偏移量(严格等同于 +2kHz),而 +2kHz absolute 是一个绝对频率(严格等同于 2kHz absolute)。
absolute
如果指定,此关键字表示所给频率为绝对值。如果指定了负频率,则计算出的频率将为零。
<semitones>
指定相对于继承值的相对变化(减少或增加)。<semitones> 的允许值语法是带有单位标识符 st(半音)的 维度 (dimension)半音 (semitone) 间隔对应于等程律半音阶中每个音符之间的阶梯。因此,一个 半音 可以量化为该音阶上两个连续音高频率之间的差值。相隔恰好一个 半音 的两个连续频率之间的比率是 2 的 12 次方根(约为 11011/10393,即 1.0594631)。因此,以赫兹为单位对应于半音偏移的值是相对于应用该偏移的初始频率的。(换句话说,半音 并不对应于固定的赫兹数值。)
<percentage>
允许使用正负 百分比 值,分别表示相对于继承值的增加或减少。计算值是通过在继承值上加上(或减去)继承值的指定分数来计算的。例如,在继承值为 200Hz 的情况下,50%(等同于 +50%)的结果为 200 + (200*0.5) = 300Hz。相反,-50% 的结果为 200-(200*0.5) = 100Hz。
x-low, low, medium, high, x-high
一系列单调非递减的音高水平,具体取决于实现和语音。当给定元素的计算值仅为一个关键字(即未指定相对偏移)时,相应的绝对频率将在语音更改时重新评估。相反,应用相对偏移需要根据指定相对偏移时的当前语音计算所得频率,因此计算出的频率将绝对继承,而不管后续样式级联中是否有语音更改。因此,作者应仅在希望语音更改触发从关键字到具体的、与语音相关的频率的转换重新评估时,才使用关键字值。

计算出的负绝对频率会被钳位至零赫兹。支持语音的用户代理更可能支持特定的值范围,而不是频率的所有可能计算数值范围。因此,用户代理中的实际值可能会被钳位到依赖于实现的最小和最大边界。例如:尽管 0Hz 频率在计算上是合法的,但在语音合成器的上下文中,它可能会被钳位为一个更有意义的值。

属性值示例

h1 { voice-pitch: 250Hz; } /* positive offset relative to the inherited absolute frequency */
h1 { voice-pitch: +250Hz; } /* identical to the line above */
h2 { voice-pitch: +30Hz absolute; } /* not an increment */
h2 { voice-pitch: absolute 30Hz; } /* identical to the line above */
h3 { voice-pitch: -20Hz; } /* negative offset (decrement) relative to the inherited absolute frequency */
h4 { voice-pitch: -20Hz absolute; } /* illegal syntax => value ignored ("absolute" keyword not allowed with negative frequency) */
h5 { voice-pitch: -3.5st; } /* semitones, negative offset */
h6 { voice-pitch: 25%; } /* this means "add a quarter of the inherited value, to the inherited value" */
h6 { voice-pitch: +25%; } /* identical to the line above */

11.4. voice-range 属性

名称voice-range
<frequency> && absolute | [[x-low | low | medium | high | x-high] || [<frequency> | <semitones> | <percentage>]]
初始值 medium
应用于 所有元素
可继承
百分比 参考继承值
计算值 如果仅单独指定关键字,则为预定义的音高关键字之一,否则为绝对频率,该频率是通过将关键字值(如有)转换为基于当前 voice-family 的固定频率并应用指定的相对偏移量(如有)计算得出的
规范顺序 按语法

voice-range 属性指定了“基线”音高的可变性,即基频可能偏离语音输出平均音高的程度。对于极具表现力的语音,生成的语音的动态音高范围通常会增加,例如在语音中使用语调变化来传达含义和强调时。通常,低范围会产生平淡、单调的语音,而高范围则产生生动的语音。

注意:尽管此属性提供的功能类似于 SSML 标记语言 [SSML]prosody 元素的 range 属性,但两者存在显著差异。例如,CSS Speech 的音高范围关键字和相对变化(频率、半音或百分比)并非互斥的,这是由于值在选定元素中的继承和组合方式决定的。

<frequency>(频率)
以频率单位(赫兹或千赫兹,例如 100Hz, +2kHz)表示的值。当指定了 absolute 关键字时,值仅限正数。否则(未指定 absolute 关键字时),负值表示相对于继承值的减少,正值表示相对于继承值的增加。例如,2kHz 是一个正偏移量(严格等同于 +2kHz),而 +2kHz absolute 是一个绝对频率(严格等同于 2kHz absolute)。
absolute
如果指定,此关键字表示所给频率为绝对值。如果指定了负频率,则计算出的频率将为零。
<semitones>
指定相对于继承值的相对变化(减少或增加),以 半音 为单位。
<percentage>
正负 百分比 值分别表示相对于继承值的增加或减少。计算值是通过在继承值上加上(或减去)继承值的指定分数来计算的。例如,在继承值为 200Hz 的情况下,50%(等同于 +50%)的结果为 200 + (200*0.5) = 300Hz。相反,-50% 的结果为 200-(200*0.5) = 100Hz。
x-low, low, medium, high, x-high
一系列单调非递减的音高水平,具体取决于实现和语音。当给定元素的计算值仅为一个关键字(即未指定相对偏移)时,相应的绝对频率将在语音更改时重新评估。相反,应用相对偏移需要根据指定相对偏移时的当前语音计算所得频率,因此计算出的频率将绝对继承,而不管后续样式级联中是否有语音更改。因此,作者应仅在希望语音更改触发从关键字到具体的、与语音相关的频率的转换重新评估时,才使用关键字值。

计算出的负绝对频率会被钳位至零赫兹。支持语音的用户代理更可能支持特定的值范围,而不是频率的所有可能计算数值范围。因此,用户代理中的实际值可能会被钳位到依赖于实现的最小和最大边界。例如:尽管 0Hz 频率在计算上是合法的,但在语音合成器的上下文中,它可能会被钳位为一个更有意义的值。

继承值示例

<body>
  <e1>
    <e2>
      <e3>
        <e4>
          <e5>
            <e6>
              ...
            </e6>
          </e5>
        </e4>
      </e3>
    </e2>
  </e1>
</body>



body { voice-range: inherit; } /* the initial value is 'medium'
                               (the actual frequency value
                               depends on the current voice) */

e1 { voice-range: +25%; } /* the computed value is
                             ['medium' + 25%] which resolves
                             to the frequency corresponding to 'medium'
                             plus 0.25 times the frequency
                             corresponding to 'medium' */

e2 { voice-range: +10Hz; } /* the computed value is
                              [FREQ + 10Hz] where "FREQ" is the absolute frequency
                              calculated in the "e1" rule above. */

e3 { voice-range: inherit; /* this could be omitted,
                              but we explicitly specify it for clarity purposes */

     voice-family: "another-voice"; } /* this voice change would have resulted in
                                         the re-evaluation of the initial 'medium' keyword
                                         inherited by the "body" element
                                         (i.e. conversion from a voice-dependent keyword value
                                         to a concrete, absolute frequency),
                                         but because relative offsets were applied down the style
                                         cascade, the inherited value is actually the frequency
                                         calculated at the "e2" rule above. */

e4 { voice-range: 200Hz absolute; } /* override with an absolute frequency
                                       which doesn’t depend on the current voice */

e5 { voice-range: 2st; } /* the computed value is an absolute frequency,
                            which is the result of the
                            calculation: 200Hz + two semitones
                            (reminder: the actual frequency corresponding to a semitone
                            depends on the base value to which it applies) */

e6 { voice-range: inherit; /* this could be omitted,
                              but we explicitly specify it for clarity purposes */

     voice-family: "yet-another-voice"; } /* despite the voice change,
                                             the computed value is the same as
                                             for "e5" (i.e. an absolute frequency value,
                                             independent from the current voice) */

11.5. voice-stress 属性

名称voice-stress
normal | strong | moderate | none | reduced
初始值 normal
应用于 所有元素
可继承
百分比 不适用
计算值 指定的值
规范顺序 按语法

voice-stress 属性用于操纵强调的强度,通常通过音高变化、时间变化、响度和其他声学差异的组合来实现。因此,值的精确含义取决于所说的语言。

注意:此属性提供的功能类似于 SSML 标记语言 [SSML] 中的 emphasis 元素

normal
表示语音合成器产生的默认强调。
none

阻止合成器强调它通常会强调的文本。

moderatestrong
这些值在强度上是单调非递减的。其应用结果比语音合成器通常产生的内容(即超过 normal 对应的值)有更多的强调。
reduced
实际上是强调单词的反面。

属性值示例,包含 HTML 示例

.default-emphasis { voice-stress: normal; }
.lowered-emphasis { voice-stress: reduced; }
.removed-emphasis { voice-stress: none; }
.normal-emphasis { voice-stress: moderate; }
.huge-emphasis { voice-stress: strong; }

...

<p>This is a big car.</p>
<!-- The speech output from the line above is identical to the line below: -->
<p>This is a <em class="default-emphasis">big</em> car.</p>

<p>This car is <em class="lowered-emphasis">massive</em>!</p>
<!-- The "em" below is totally de-emphasized, whereas the emphasis in the line above is only reduced: -->
<p>This car is <em class="removed-emphasis">massive</em>!</p>

<!-- The lines below demonstrate increasing levels of emphasis: -->
<p>This is a <em class="normal-emphasis">big</em> car!</p>
<p>This is a <em class="huge-emphasis">big</em> car!!!</p>

12. 语音持续时间属性

12.1. voice-duration 属性

名称voice-duration
auto | <time>
初始值 auto
应用于 所有元素
可继承
百分比 不适用
计算值 指定的值
规范顺序 按语法

voice-duration 属性指定渲染所选元素内容所需的时间(不包括 音频提示暂停停顿)。除非指定了 auto 值,否则此属性优先于 voice-rate 属性,并应被用于确定适合该语音的说话速率。对于 voice-duration 属性值不为 auto 的元素,其后代元素如果指定了 voice-durationvoice-rate 属性,则必须被忽略。换句话说,当为所选元素的 voice-duration 指定了 <time> 时,它将应用于整个元素子树(子元素无法覆盖该属性)。

注意:此属性提供的功能类似于 SSML 标记语言 [SSML]prosody 元素的 duration 属性

auto
解析为使用继承的 voice-rate 时语音合成持续时间所对应的值。
<time>
指定绝对时间单位(秒和毫秒,例如 "+3s", "250ms")的值。只允许使用非负值。

13. 列表项和计数器样式

[CSS2]list-style-type 属性指定了三种类型的列表项标记:字形、编号系统和字母系统。此属性的允许值也用于 content 属性的 counter() 函数。CSS Speech 模块定义了如何使用语音合成在听觉维度上渲染这些样式。[CSS2] 的 list-style-image 属性将被忽略,而是使用 list-style-type

注意:CSS Lists and Counters Module Level 3 [CSS3LIST] 中新特性的语音渲染不在本级 CSS Speech 中涵盖,但可能会在未来的规范中定义。

disc, circle, square
对于这些列表项样式,用户代理会定义(可能基于用户偏好)所说的对应短语或播放的音频提示。因此,带有图形项目符号的列表项会以特定于实现的方式适当地宣布。
decimal, decimal-leading-zero, lower-roman, upper-roman, georgian, armenian
对于这些列表项样式,语音合成器会原样读出相应的数字,并可能在文档语言中辅以额外的音频提示或语音短语(即使用与读出列表项内容相同的 TTS 语音),以指示列表项的存在。例如,当使用英语时,列表项计数器可以前缀“Item”一词,从而使列表项被宣布为“Item one”, “Item two”等。
lower-latin, lower-alpha, upper-latin, upper-alpha, lower-greek
这些列表项样式由语音合成器在文档语言中逐字母读出(即使用与读出列表项内容相同的 TTS 语音)。例如,英语中的 lower-greek 会读作“alpha”, “beta”, “gamma”等。同样,法语中的 upper-latin 会读作 /a/, /be/, /se/ 等(音标符号)。

注意:屏幕阅读器等用户代理宣布列表项的嵌套深度,或者更一般地,指出有关复杂分层内容的额外结构信息,这是很常见的。这些额外音频提示和/或语音输出的冗长程度通常可以由用户控制,并有助于提高可用性。这些导航辅助功能依赖于实现,但建议支持 CSS Speech 模块的用户代理确保这些额外的音频提示和语音输出不会产生冗余或造成不一致(例如:重复或不同的列表项编号方案)。

14. 插入和替换内容

本节是非规范性的。

有时,作者希望在应用常规发音规则之前,指定从源文本到另一个字符串的映射。这可用于合成器可能无法识别的不常见缩写或首字母缩略词。可以使用 content 属性将一个字符串替换为另一个。此属性提供的功能类似于 SSML 标记语言 [SSML] 中的 sub 元素的 alias 属性

在此示例中,缩写使用 title 属性的内容而不是元素的内容进行渲染。
/* This replaces the content of the selected element
by the string "World Wide Web Consortium". */
abbr { content: attr(title); }
...

<abbr title="World Wide Web Consortium">W3C</abbr>

以类似的方式,文档中的文本字符串可以被预先录制的版本替换。

在此示例中——假设支持该格式、文件可用且用户代理已配置为执行此操作——将播放 Sir John Gielgud 朗诵著名独白的录音。否则,用户代理将退回使用合成语音渲染文本。
.hamlet { content: url(./audio/gielgud.wav); }
...

<div class="hamlet">
To be, or not to be: that is the question:
</div>

此外,作者(或通过用户样式表的用户)可以添加一些信息,以在与文档进行非视觉交互时更容易理解结构。他们可以通过使用 ::before::after 伪元素来实现这一点。注意,不同的样式表可以用于定义屏幕阅读器朗读额外信息的详细程度。

此示例在列表前插入字符串“Start list: ”,并在每个列表项的内容前插入字符串“List item: ”。同样,字符串“List end: ”被插入到列表后,以通知用户列表语音输出已结束。

ul::before { content: "Start list: "; }
ul::after  { content: "List end. "; }
li::before { content: "List item: "; }

详细信息可以在 CSS3 Generated and Replaced Content 模块 [CSS3GENCON] 中找到。

15. 发音,音素

本节是非规范性的。

CSS 不指定如何定义标记文档中特定文本片段的发音(使用定义良好的音标字母表表示)。在本规范的早期草案中描述了一个“音素 (phonemes)”属性,但由于破坏了内容与表示分离的原则而遭到了反对。(在听觉 CSS 样式表中编写的“音素”需要在文档中的文本每次更改时都进行更新。)因此,“音素”功能在 CSS(表示层)中被认为超出了范围,应在标记/内容层中解决。

"pronunciation" rel 值允许在 HTML 文档中使用 link 元素导入发音词典(类似于包含 CSS 样式表的方式)。W3C PLS(发音词典规范)[PRONUNCIATION-LEXICON] 是可用于描述此类词典的一种格式。

此外,可以在标记中使用基于属性的机制来创作文本与发音的关联。在撰写本文时,此类机制尚未在 W3C HTML 标准中正式定义。但是,EPUB 3.0 规范 允许 (x)HTML5 文档包含源自 [SSML] 规范的属性,这些属性描述了如何基于特定的音标字母表朗读文本。

词汇表

本模块使用了以下术语和缩写。

UA
用户代理 (user agent)

代表用户读取和/或编写 CSS 样式表的程序,类别包含以下两类或其中之一:其目的是渲染 文档(例如浏览器)的程序,以及其目的是创建样式表(例如编辑器)的程序。UA 可能同时属于这两类。(还有其他程序可以读取或编写样式表,但本模块不对其提供规则。)

文档 (document)

具有元素和属性的树状结构文档,例如 SGML 或 XML 文档 [XML11]

样式表 (style sheet)

一个 CSS 样式表

附录 D — 致谢

编辑们感谢 W3C 语音浏览器和层叠样式表工作组的成员在准备本规范时提供的帮助。特别感谢 Ellen Eide (IBM) 提供的详细评论,以及 Elika Etemad (Fantasai) 的全面审查。

附录 E — 变更

2012 候选推荐标准 以来进行了以下更改

此外,进行了一些小的编辑修复,并将源代码转换为 Bikeshed 格式。

一致性

文档约定

一致性要求通过描述性断言和 RFC 2119 术语相结合来表达。本文档规范性部分中的关键词“MUST”(必须)、“MUST NOT”(不得)、“REQUIRED”(必需)、“SHALL”(应)、“SHALL NOT”(不应)、“SHOULD”(推荐)、“SHOULD NOT”(不推荐)、“RECOMMENDED”(建议)、“MAY”(可以)和“OPTIONAL”(可选)应按照 RFC 2119 中的描述进行解释。然而,为了可读性,这些词在本文档中不以全大写形式出现。

本规范的所有文本均为规范性文本,明确标记为非规范性的部分、示例和注释除外。 [RFC2119]

本规范中的示例均以“例如”一词引入,或者通过 class="example" 与规范性文本隔开,如下所示

这是一个说明性示例。

说明性注释以“Note”一词开头,并使用 class="note" 与规范性文本隔开,如下所示

注意,这是一个说明性注释。

建议(Advisements)是规范性章节,旨在引起特别注意,并使用 <strong class="advisement"> 与其他规范性文本区分开来,如下所示: 用户代理必须提供可访问的替代方案。

一致性类别

本规范为三类一致性定义了一致性要求。

样式表
一份 CSS 样式表
渲染器
一种 用户代理 (UA),它解释样式表的语义并渲染使用它们的文档。
创作工具
一种 用户代理 (UA),用于编写样式表。

如果样式表包含的所有使用本模块定义语法的语句,根据通用 CSS 语法及本模块定义的各功能语法均有效,则该样式表符合本规范。

如果渲染器除了按相应规范解释样式表外,还通过正确解析本规范定义的所有功能并相应地渲染文档来支持这些功能,则该渲染器符合本规范。然而,由于设备限制导致 UA 无法正确渲染文档,并不意味着该 UA 不符合规范。(例如,UA 无需在单色显示器上渲染颜色。)

如果创作工具编写的样式表根据通用 CSS 语法及本模块中各功能的语法是句法正确的,并符合本模块中描述的所有其他样式表一致性要求,则该创作工具符合本规范。

部分实现

为了使作者能够利用前向兼容的解析规则来指定后备值,CSS 渲染器 **必须** 将其无法使用支持级别的任何 @规则、属性、属性值、关键字和其他语法结构视为无效(并 适当忽略)。特别地,用户代理 **不得** 在单一多值属性声明中选择性地忽略不支持的组件值而保留支持的值:如果任何值被视为无效(因为不支持的值必须如此),CSS 要求忽略整个声明。

不稳定和专有特性的实现

为了避免与未来稳定的 CSS 功能发生冲突,CSS 工作组建议在实施不稳定功能和私有扩展遵循最佳实践

非实验性实现

一旦规范达到候选推荐阶段,非实验性实现即可成为可能,实现者应发布他们能够证明根据规范正确实现的任何 CR 级别特性的无前缀实现。

为建立并保持 CSS 在不同实现间的互操作性,CSS 工作组请求非实验性的 CSS 渲染器在发布任何 CSS 功能的无前缀实现之前,向 W3C 提交一份实现报告(并在必要时提交用于该实现报告的测试用例)。提交给 W3C 的测试用例需经 CSS 工作组审阅和修正。

有关提交测试用例和实现报告的详细信息,请访问 CSS 工作组网站 https://w3org.cn/Style/CSS/Test/。问题可发送至 public-css-testsuite@w3.org 邮件列表。

候选推荐标准 (CR) 退出标准

为了使本规范能够推进到提案推荐标准 (PR),必须至少有两个独立的、可互操作的每个功能的实现。每个功能可以由不同组的产品实现,不要求所有功能都由单个产品实现。为了实现此标准,我们定义以下术语

independent
每个实现必须由不同的方开发,并且不能共享、重用或派生自另一个合格实现所使用的代码。对本规范实现无影响的代码段不受此要求限制。
可互操作
通过官方 CSS 测试套件中的相应测试用例,或者如果实现不是 Web 浏览器,则通过等效测试。如果此类用户代理 (UA) 用于声明互操作性,则测试套件中的每个相关测试都应创建等效测试。此外,如果此类 UA 用于声明互操作性,则必须有一个或多个额外的 UA,它们也可以以相同的方式通过这些等效测试,以实现互操作性的目的。等效测试必须公开,以供同行评审。
实现
用户代理,即
  1. 实现了该规范。
  2. 对公众可用。该实现可以是出货产品或其他公开可用的版本(即测试版、预览发布版或“每日构建版”)。非出货产品发布版必须已实现该功能至少一个月,以证明其稳定性。
  3. 不是实验性的(即,专门为通过测试套件设计且不打算用于正常使用的版本)。

该规范将保持候选推荐标准状态至少六个月。

索引

本规范定义的术语

通过引用定义的术语

引用

规范性引用

[CSS-BACKGROUNDS-3]
Bert Bos; Elika Etemad; Brad Kemper. CSS Backgrounds and Borders Module Level 3. 2021年7月26日. CR. URL: https://w3org.cn/TR/css-backgrounds-3/
[CSS-BOX-4]
Elika Etemad. CSS Box Model Module Level 4. 2022年11月3日. WD. URL: https://w3org.cn/TR/css-box-4/
[CSS-CASCADE-5]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS Cascading and Inheritance Level 5. 2022年1月13日. CR. URL: https://w3org.cn/TR/css-cascade-5/
[CSS-COUNTER-STYLES-3]
Tab Atkins Jr.. CSS Counter Styles Level 3. 2021年7月27日. CR. URL: https://w3org.cn/TR/css-counter-styles-3/
[CSS-DISPLAY-3]
Tab Atkins Jr.; Elika Etemad. CSS Display Module Level 3. 2022年11月18日. CR. URL: https://w3org.cn/TR/css-display-3/
[CSS-FONTS-4]
John Daggett; Myles Maxfield; Chris Lilley. CSS 字体模块第 4 级. 2021 年 12 月 21 日. WD. URL: https://w3org.cn/TR/css-fonts-4/
[CSS-POSITION-3]
Elika Etemad; Tab Atkins Jr.. CSS Positioned Layout Module Level 3. 2022年9月1日. WD. URL: https://w3org.cn/TR/css-position-3/
[CSS-PSEUDO-4]
Daniel Glazman; Elika Etemad; Alan Stearns. CSS 伪元素模块 Level 4. 2022年12月30日. WD. URL: https://w3org.cn/TR/css-pseudo-4/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS 值与单位模块第 3 级. 2022年12月1日. CR. URL: https://w3org.cn/TR/css-values-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS 值与单位模块第 4 级. 2022年10月19日. WD. URL: https://w3org.cn/TR/css-values-4/
[CSS2]
Bert Bos; et al. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 2011年6月7日. REC. URL: https://w3org.cn/TR/CSS21/
[CSS22]
Bert Bos. Cascading Style Sheets Level 2 Revision 2 (CSS 2.2) Specification. 2016年4月12日. WD. URL: https://w3org.cn/TR/CSS22/
[CSS3GENCON]
Elika Etemad; Dave Cramer. CSS Generated Content Module Level 3. 2019年8月2日. WD. URL: https://w3org.cn/TR/css-content-3/
[CSS3LIST]
Elika Etemad; Tab Atkins Jr.. CSS Lists and Counters Module Level 3. 2020年11月17日. WD. URL: https://w3org.cn/TR/css-lists-3/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra 标准. Living Standard. URL: https://infra.spec.whatwg.org/
[MEDIAQUERIES-5]
Dean Jackson; 等人. Media Queries Level 5. 2021年12月18日. WD. URL: https://w3org.cn/TR/mediaqueries-5/
[RFC2119]
S. Bradner. RFC 中用于指示要求级别的关键词. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[SSML]
Daniel Burnett; Zhi Wei Shuang. Speech Synthesis Markup Language (SSML) Version 1.1. 2010年9月7日. REC. URL: https://w3org.cn/TR/speech-synthesis11/
[XML11]
Tim Bray; 等. Extensible Markup Language (XML) 1.1 (Second Edition). 2006年8月16日. REC. URL: https://w3org.cn/TR/xml11/

参考资料

[HTML]
Anne van Kesteren; et al. HTML 标准. Living Standard. URL: https://html.whatwg.cn/multipage/
[PRONUNCIATION-LEXICON]
Paolo Baggia. Pronunciation Lexicon Specification (PLS) Version 1.0. 2008年10月14日. REC. URL: https://w3org.cn/TR/pronunciation-lexicon/
[SSML-SAYAS]
Daniel Burnett; 等. SSML 1.0 say-as attribute values. 2005年5月26日. NOTE. URL: https://w3org.cn/TR/ssml-sayas/

属性索引

名称初始值应用于继承百分比规范顺序计算值
cue <'cue-before'> <'cue-after'>?不适用(见各个属性)所有元素不适用按语法不适用(见各个属性)
cue-after <uri> <decibel>? | nonenone(无)所有元素不适用按语法指定的值
cue-before <uri> <decibel>? | nonenone(无)所有元素不适用按语法指定的值
pause <'pause-before'> <'pause-after'>?不适用(见各个属性)所有元素不适用按语法不适用(见各个属性)
pause-after <time> | none | x-weak | weak | medium | strong | x-strongnone(无)所有元素不适用按语法指定的值
pause-before <time> | none | x-weak | weak | medium | strong | x-strongnone(无)所有元素不适用按语法指定的值
rest <'rest-before'> <'rest-after'>?不适用(见各个属性)所有元素不适用按语法不适用(见各个属性)
rest-after <time> | none | x-weak | weak | medium | strong | x-strongnone(无)所有元素不适用按语法指定的值
rest-before <time> | none | x-weak | weak | medium | strong | x-strongnone(无)所有元素不适用按语法指定的值
speak auto | never | alwaysauto所有元素不适用按语法指定的值
speak-as normal | spell-out || digits || [ literal-punctuation | no-punctuation ]normal所有元素不适用按语法指定的值
voice-balance <number> | left | center | right | leftwards | rightwardscenter所有元素不适用按语法指定的值解析为 -100 到 100 之间(含)的 <number>
voice-duration auto | <time>auto所有元素不适用按语法指定的值
voice-family [[<family-name> | <generic-voice>],]* [<family-name> | <generic-voice>] | preserve由实现决定的所有元素不适用按语法指定的值
voice-pitch <frequency> && absolute | [[x-low | low | medium | high | x-high] || [<frequency> | <semitones> | <percentage>]]medium所有元素参考继承值按语法如果仅单独指定关键字,则为预定义的音高关键字之一,否则为绝对频率,该频率是通过将关键字值(如有)转换为基于当前 voice-family 的固定频率并应用指定的相对偏移量(如有)计算得出的
voice-range <frequency> && absolute | [[x-low | low | medium | high | x-high] || [<frequency> | <semitones> | <percentage>]]medium所有元素参考继承值按语法如果仅单独指定关键字,则为预定义的音高关键字之一,否则为绝对频率,该频率是通过将关键字值(如有)转换为基于当前 voice-family 的固定频率并应用指定的相对偏移量(如有)计算得出的
voice-rate [normal | x-slow | slow | medium | fast | x-fast] || <percentage>normal所有元素参考默认值按语法关键字值,以及可选的相对于关键字的百分比(如果非 100%)
voice-stress normal | strong | moderate | none | reducednormal所有元素不适用按语法指定的值
voice-volume silent | [[x-soft | soft | medium | loud | x-loud] || <decibel>]medium所有元素不适用按语法silent,或关键字值,并可选地加上分贝偏移量(如果非零)