CSS 语音模块第 1 级

W3C 候选推荐草案

关于本文件的更多细节
此版本:
https://www.w3.org/TR/2023/CRD-css-speech-1-20230214/
最新发布版本:
https://www.w3.org/TR/css-speech-1/
编辑草稿:
https://drafts.csswg.org/css-speech-1/
以前版本:
历史:
https://www.w3.org/standards/history/css-speech-1
实施报告:
https://wpt.fyi/results/css/css-speech
测试套件:
http://test.csswg.org/suites/css-speech-1_dev/nightly-unstable/
反馈:
CSSWG 问题库
编辑:
(Tetralogical)
Elika J. Etemad / fantasai (受邀专家)
前编辑:
(DAISY 联盟)
Claudio Santambrogio (Opera 软件)
(W3C / 佳能)
为此规范建议编辑:
GitHub 编辑器

摘要

语音模块定义了允许作者通过语音合成声明性地控制文档渲染的听觉 CSS 属性,并使用可选的音频提示。请注意,该标准是在与语音浏览器活动的合作中制定的。

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

本文件的状态

本节描述了本文件在发布时的状态。当前 W3C 出版物和本技术报告的最新修订列表可以在W3C 技术报告索引 https://www.w3.org/TR/中找到。

本文件由CSS 工作组作为候选推荐草案发布,使用推荐跟踪。发布为候选推荐草案并不意味着获得 W3C 及其成员的认可。候选推荐草案集成了来自之前候选推荐的更改,工作组打算在随后的候选推荐快照中包含这些更改。

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

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

本文件受2021 年 11 月 2 日 W3C 过程文件的管理。

本文件由遵循W3C 专利政策的团体制作。W3C 保持公开的任何专利披露列表,该列表与该团体的交付成果有关;该页面还包括披露专利的说明。任何对某个专利有实际了解的个人,若认为该专利包含基本声明,必须根据W3C 专利政策第 6 节披露该信息。

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

“处于风险”是 W3C 过程中的术语,并不一定意味着该功能有被删除或延迟的危险。它意味着工作组认为该功能可能在及时实施方面存在困难,标记为此允许工作组在必要时在过渡到提议的推荐阶段时删除该功能,而无需先发布不包含该功能的新候选推荐。

1. 引言,设计目标

本节为非规范性内容。

听觉呈现信息通常被盲人、视力受损者或其他有打印障碍的人使用。例如,“屏幕阅读器”允许用户与本来无法访问的视觉界面进行交互。还有一些情况下,内容(而非阅读)是更受欢迎的,或者有时甚至是必要的,无论个人是否有能力访问信息。例如:在驾驶时播放电子书,学习如何操作工业和医疗设备,与家庭娱乐系统互动,教导幼儿阅读。

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

2. 背景信息,CSS 2.1

本节为非规范性内容。

CSS 语音模块是对信息性 CSS2.1 听觉附录 的重构,其中描述了听觉媒体类型,但也被弃用了(以支持语音媒体类型,而现在也已被弃用)。尽管[CSS2] 规范保留了语音媒体类型,但并没有实际定义相应的属性。语音模块描述了适用于语音输出的 CSS 属性,并为听觉维度定义了新的“盒子”模型。

内容创作者可以为具有文本到语音合成能力的用户代理包括 CSS 属性,适用于任何媒体类型——尽管一般来说,它们仅对所有屏幕类型有意义。这些样式将被不支持语音模块的用户代理简单忽略。

3. 与 SSML 的关系

本节为非规范性内容。

本规范中的某些功能在概念上与语音合成标记语言(SSML)版本 1.1 的功能相似[SSML]。然而,由于 CSS 模型的特定性,语法和/或语义上与 SSML 的兼容性只能部分实现。语音模块中每个属性的定义都包含信息性声明,以澄清它们与 SSML 中类似功能的关系。

3.1. 值的定义

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

除了在定义中列出的特定于属性的值外,本规范中定义的所有属性也接受CSS-wide 关键字作为其属性值。为了可读性,它们没有被明确重复。

4. 示例

这个例子展示了作者如何告诉语音合成器使用名为 "paul" 的声音来朗读 HTML 标题,使用 "moderate" 的强调(比正常强调更多),以及如何在每个标题的 TTS 渲染开始前插入音频提示(位于给定 URL 的预录音频剪辑)。在具备立体声能力的音响系统中,标记 CSS 类 heidi 的段落将在左声道中呈现(并使用女性声音等),而类 peter 对应于右声道(并使用男性声音等)。标记为 special 的文本跨度的音量级别低于正常音量,并通过在其发音后引入强暂停来创建一个韵律边界(注意如何 span 从其父段落中继承了声音家族)。
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 格式模型基于一系列声音和沉默,这些声音和沉默发生在一个嵌套上下文中,类似于视觉盒模型,我们称之为听觉“盒”模型。听觉“画布”由一个双声道(立体声)空间和一个时间维度组成,在这个维度中,合成语音和音频提示共存。所选元素周围由restcuepause 属性(从最内层到最外层)包围。这些可以看作是填充边框外边距的听觉等价物。使用时,::before::after 伪元素[CSS2]被插入在元素内容和rest之间。

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

听觉'盒'模型的示意图:所选元素位于中央,左侧是(从内到外)rest-before、cue-before、pause-before,右侧是(从内到外)rest-after、cue-after、pause-after,其中 rest 概念上类似于填充,cue 类似于边框,pause 类似于外边距。

6. 属性混合

6.1. voice-volume 属性

名称: voice-volume
值: silent | [[x-soft | soft | medium | loud | x-loud] || <decibel>]
初始值: medium
适用对象: 所有元素
继承:
百分比: N/A
计算值: silent,或一个关键字值,另外还可以有一个分贝偏移(如果不为零)
标准顺序: 根据语法

音量 属性允许作者控制由语音合成器生成的音频波形的振幅,并用于调整音频提示在所选元素的听觉盒模型中的相对音量级别。

注意: 虽然此属性提供的功能与prosody 元素的volume 属性在 SSML 标记语言[SSML] 中相似,但存在显著的差异。例如,CSS Speech 的音量关键字和分贝单位不是互斥的,因为值是如何继承和组合的,适用于所选元素。

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
适用对象: 所有元素
继承:
百分比: N/A
计算值: 指定值解析为介于 -100100(含)之间的<number>
标准顺序: 根据语法

音量平衡 属性控制音频输出在横向声场中的空间分布:一侧在左边,另一侧在右边,相对于听众的位置。作者可以指定左边和右边之间的中间步骤,以表示沿着左-右轴的音频分离。

注意: 此属性提供的功能在 SSML 标记语言[SSML]中没有对应项。

<number>
一个介于 -100100(含)的数字。小于 -100 的值被限制为 -100。大于 100 的值被限制为 100。值 -100 表示左侧,值 100 表示右侧。值 0 表示中心点,左右之间没有可分辨的音频分离。(在立体声系统中,这对应于音频信号在左侧和右侧扬声器之间的均匀分配)。
left
等同于 -100
center
等同于 0
right
等同于 100
leftwards
向左移动声音,通过从继承的voice-balance 值中减去 20(并将结果限制为 -100)。
rightwards
向右移动声音,通过在继承的voice-balance 值中加上 20(并将结果限制为 100)。

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

CSS Speech 模块的未来修订可能会包括对三维音频的支持,这将有效地使作者能够指定“方位角”和“仰角”值。将来,使用当前规范创建的内容可能因此会被用户代理消费,这些用户代理符合支持三维音频的 CSS Speech 版本。为了准备这种可能性,目前voice-balance 属性允许的值设计为与“方位角”保持兼容。更精确地说,当前左右音频轴(横向声场)与听众位置周围设想的 360 度平面之间的映射定义如下:

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

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

7. 说话属性

7.1. speak 属性

名称: speak
值: auto | never | always
初始值: auto
适用对象: 所有元素
继承:
百分比: N/A
计算值: 指定值
标准顺序: 根据语法

说话 属性决定是否以声音呈现文本。

注意: 此属性提供的功能在 SSML 标记语言[SSML]中没有对应项。

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

注意: none 值的display 属性无法被所选元素的后代覆盖,但是auto 值的speak 属性可以被覆盖,使用neveralways

never
此值导致元素(包括暂停、提示、休息和实际内容)不被渲染(即该元素在听觉维度上没有效果)。

注意: 受影响元素的任何后代可以覆盖此值,因此后代实际上可以参与听觉渲染,即使在该层使用了display: none。但是,祖先元素的暂停、提示和休息在听觉维度上仍然“停用”,因此不会对暂停合并或相邻休息的附加行为产生影响。

always
无论其display 值如何,元素都以声音呈现(或其祖先的speak 值)。

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

7.2. speak-as 属性

名称: speak-as
值: normal | spell-out || digits || [ literal-punctuation | no-punctuation ]
初始值: normal
适用对象: 所有元素
继承:
百分比: N/A
计算值: 指定值
标准顺序: 根据语法

说话方式 属性决定文本以何种方式以声音呈现,基于预定义的可能性列表。

注意: 此属性提供的功能在 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”。

注意: 语音合成器能够识别什么是数字说话方式 属性能够对用户代理渲染数字的方式进行某种程度的控制,并可能在将文本传递给实际语音合成器之前,作为预处理步骤进行实现。

literal-punctuation
标点符号,例如分号、大括号等,会被朗读出来(即字面上说出),而不是像适当的停顿一样自然呈现。
no-punctuation
标点符号不会被呈现:既不被说出,也不作为停顿呈现。

8. 暂停属性

8.1. pause-beforepause-after 属性

名称: pause-beforepause-after
值: <time> | none | x-weak | weak | medium | strong | x-strong
初始值: none
适用对象: 所有元素
继承:
百分比: N/A
计算值: 指定值
标准顺序: 根据语法

pause-beforepause-after 属性指定了在元素的语音合成呈现之前(或之后)发生的韵律边界(具有特定持续时间的静音),如果指定了任何 cue-before(或 cue-after),则在 听觉框模型内发生的时间点也是如此。

注意:虽然此属性提供的功能与 SSML 标记语言中的 break 元素 相似[SSML],但在 CSS Speech 的 听觉框模型 内应用 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'>?
初始值: N/A(参见各个属性)
适用对象: 所有元素
继承:
百分比: N/A
计算值: N/A(参见各个属性)
标准顺序: 根据语法

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: 未指定; pause-after: 10ms */

8.3. 合并暂停

暂停定义了听觉 "框" 到其前后听觉 "框" 的最小距离。相邻的暂停通过选择最强的命名中断和最长的绝对时间间隔进行合并。例如,当合并 "strong" 和 "weak" 时选择 "strong",当合并 "1s" 和 "250ms" 时选择 "1s",以及当合并 "strong" 和 "250ms" 时,"strong" 和 "250ms" 的效果会加和。

以下暂停是相邻的:

被合并的暂停被认为是与另一个暂停相邻的,如果它的任何组成暂停与该暂停相邻。

注意: pause 已经从元素内容和任何 cue 之间移动到 cue 的外部。与信息 CSS2.1 听觉附录 [CSS2] 不向后兼容。

9. 休息属性

9.1. rest-beforerest-after 属性

名称: rest-beforerest-after
值: <time> | none | x-weak | weak | medium | strong | x-strong
初始值: none
适用对象: 所有元素
继承:
百分比: N/A
计算值: 指定的值
标准顺序: 根据语法

rest-beforerest-after 属性指定在 听觉框模型 中,元素的语音合成呈现之前(或之后)发生的音韵边界(带有特定持续时间的静默)。

注意: 尽管这些属性提供的功能与 SSML 标记语言中的 break 元素 相似,rest 音韵边界在 CSS Speech 的 听觉框模型 中的应用需要特殊考虑(例如,夹杂的音频提示和相邻的附加休息)。

<time>
用绝对时间单位表示休息(秒和毫秒,例如 "+3s","250ms")。只允许非负值。
none
相当于 0ms。(语音处理器不会产生音韵中断。)
x-weakweakmediumstrong, and x-strong
用语音输出中的音韵中断强度来表示休息。确切的时间依赖于实现。值表示元素之间单调不递减(概念上递增)的中断强度。

暂停属性 相比,休息插入在元素内容与任何 cue-beforecue-after 内容之间。相邻的休息以附加的方式处理,不会合并。

9.2. rest 简写属性

名称: rest
值: <'rest-before'> <'rest-after'>?
初始值: N/A(请参见各个属性)
适用对象: 所有元素
继承:
百分比: N/A
计算值: N/A(请参见各个属性)
标准顺序: 根据语法

rest 属性是 rest-beforerest-after 的简写。如果给定两个值,第一个值为 rest-before,第二个值为 rest-after。如果只给定一个值,则该值适用于两个属性。

10. 提示属性

10.1. cue-beforecue-after 属性

名称: cue-beforecue-after
值: <uri> <decibel>? | none
初始值: none
适用对象: 所有元素
继承:
百分比: N/A
计算值: 指定值
标准顺序: 根据语法

cue-beforecue-after 属性指定要在元素的 听觉框模型 中播放的音频图标(即预先录制/生成的声音片段)。

注意: 尽管此属性所提供的功能可能与 SSML 标记语言中的 audio 元素 相关,但实际上存在重大差异。例如,听觉框模型 意味着音频提示与元素的音量水平相关;而 CSS Speech 的音频图标提供的功能有限,相较于 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 属性的计算值决定。请注意,silent 属性计算值会导致音频提示被“强制”静音(即无论指定的音频提示 <decibel> 值如何)。

voice-volume 属性的音量关键字经过用户校准,以匹配在创作时无法得知的需求(例如,听觉环境、个人偏好)。因此,为了实现音频提示和语音合成的近似响度对齐,作者应确保音频提示的音量级别(平均而言,可能因音频流中声音的变化(如语调、重音等)而有所不同)与基于 voice-family 的语音合成输出相匹配,假设“典型”的听音条件(即默认系统音量水平,频率范围内的均衡化)。由于语音处理器能够直接控制生成的文本到语音音频的波形振幅,并且用户代理能够调整音频提示的输出音量(即基于数字化声音片段的内在波形振幅放大或衰减音频信号),这就为实现相对用户校准音量级别的 TTS 和提示音频流的响度管理奠定了基础(见 voice-volume 属性中定义的关键字)。

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

10.3. cue 缩写属性

名称: cue
值: <'cue-before'> <'cue-after'>?
初始值: N/A (见各个属性)
适用对象: 所有元素
继承:
百分比: N/A
计算值: N/A (见各个属性)
标准顺序: 根据语法

cue 属性是 cue-beforecue-after 的缩写。如果给出两个值,则第一个值为 cue-before,第二个值为 cue-after。如果只给出一个值,则该值适用于两个属性。

缩写表示法示例:

h1
{
  cue-before: url(pop.au);
  cue-after: url(pop.au);
}
/* ...等同于: */
h1
{
  cue: url(pop.au);
}

11. 声音特征属性

11.1. voice-family 属性

名称: voice-family
值: [[<family-name> | <generic-voice>],]* [<family-name> | <generic-voice>] | preserve
初始值: 依实现而定
适用对象: 所有元素
继承:
百分比: N/A
计算值: 指定值
标准顺序: 根据语法

voice-family 属性指定以逗号分隔的优先值列表,以表示这些值为替代选项。(这与视觉样式表中的 font-family 类似。)每个组成值可能指定一个语音合成声音实例,通过指定匹配标准。有关此主题,请参见 语音选择 部分。

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

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

<family-name>
值为特定声音实例(例如,Mike、comedian、mary、carlos2、"valley girl")。像 font-family 名称,语音名称必须被引用为 字符串,或以一或多个 CSS 标识符 的序列形式给出。

注意: 结果是,大多数标点符号或每个标记开头的数字字符必须在未引用的语音名称中转义。

如果以标识符序列作为语音名称,则计算值是通过将所有标识符按单个空格连接起来转换为字符串的名称。

与性别关键字相同的语音名称(malefemaleneutral)或与 CSS-wide 关键字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 相同。注意: 除非通过其他 voice-family 值(例如名称、性别、年龄)显式覆盖,否则该元素的后代会自动继承 preserve 值。

无效声明的示例:

voice-family: john/doe; /* 斜杠字符应被转义 */
voice-family: john "doe"; /* 标识符序列不能包含字符串 */
voice-family: john!; /* 感叹号应被转义 */
voice-family: john@doe; /* "at" 字符应被转义 */
voice-family: #john; /* 标识符不能以哈希字符开头 */
voice-family: john 1st; /* 标识符不能以数字开头 */

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">
  下面的法语文本将使用英语声音发音:
  <span style="voice-family: preserve;" xml:lang="fr-FR">Bonjour monsieur !</span>

  下面的英语文本将使用与“romeo”类(从父元素继承)对应的不同声音:
  <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 属性控制生成的合成语音的语速,以每分钟单词数为单位。

注意: 虽然该属性提供的功能类似于 rate 属性 的 prosody 元素,来自 SSML 标记语言 [SSML], 但存在显著的差异。例如,CSS Speech 的速率关键字和百分比修饰符不是相互排斥的, 因为它们的值在所选元素中是如何继承和组合的。

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; } /* 初始值为 'normal'
                                 (实际语速取决于活动语音) */

e1 { voice-rate: +50%; } /* 计算值为
                            ['normal' 和 50%],将解析为 'normal'
                            的语速乘以 0.5(即一半的语速) */

e2 { voice-rate: fast 120%; } /* 计算值为
                                 ['fast' 和 120%],将解析为 'fast'
                                 的语速乘以 1.2 */

e3 { voice-rate: normal; /* "重置"语速为固有语音值,
                            计算值为 'normal'(见下方注释获取实际值) */
     voice-family: "another-voice"; } /* 因为语音不同,
                                         计算的语速可能与 "body" 不同
                                         (尽管计算的 'voice-rate' 值相同) */

11.3. 声音音高属性 voice-pitch 属性

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

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

注意: 虽然该属性提供的功能类似于 pitch 属性的 prosody 元素,来自 SSML 标记语言 [SSML], 但存在显著的差异。 例如,CSS Speech 的音高关键字和相对变化(频率、半音或百分比)不是相互排斥的, 因为它们的值在所选元素中是如何继承和组合的。

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

负的计算绝对频率被限制为零赫兹。 支持特定值范围的语音合成用户代理可能不会支持所有可能计算的频率数值。 因此,用户代理中的实际值可能会限制在实现相关的最小和最大边界内。 例如,尽管 0Hz 的频率可以合理计算, 但在语音合成器的上下文中,它可能会限制为更有意义的值。

属性值示例:

h1 { voice-pitch: 250Hz; } /* 正偏移量,相对于继承的绝对频率 */
h1 { voice-pitch: +250Hz; } /* 与上一行相同 */
h2 { voice-pitch: +30Hz absolute; } /* 不是增量 */
h2 { voice-pitch: absolute 30Hz; } /* 与上一行相同 */
h3 { voice-pitch: -20Hz; } /* 负偏移量(递减),相对于继承的绝对频率 */
h4 { voice-pitch: -20Hz absolute; } /* 非法语法 => 值被忽略(“absolute”关键字与负频率不允许) */
h5 { voice-pitch: -3.5st; } /* 半音,负偏移量 */
h6 { voice-pitch: 25%; } /* 这意味着“将继承值的四分之一加到继承值上” */
h6 { voice-pitch: +25%; } /* 与上一行相同 */

11.4. 声音范围属性 voice-range 属性

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

声音范围属性 voice-range 属性指定“基线”音高的可变性, 即基频可能从语音输出的平均音高偏离多少。 生成语音的动态音高范围通常在高度生动的语音中增加, 例如,当使用语调变化来传达语音中的意义和强调时。 通常,低范围会产生平坦、单调的声音, 而高范围会产生生动的声音。

注意: 虽然该属性提供的功能类似于 range 属性的 prosody 元素,来自 SSML 标记语言 [SSML], 但存在显著的差异。 例如,CSS Speech 的音高范围关键字和相对变化(频率、半音或百分比)不是相互排斥的, 因为它们的值在所选元素中是如何继承和组合的。

<frequency>
以频率单位(赫兹或千赫兹,例如 100Hz+2kHz)表示的值。 当指定 absolute 关键字时,值限制为正数。 否则(当未指定 absolute 关键字时), 负值表示递减,正值表示递增, 相对于继承值。 例如,2kHz 是一个正偏移量(严格等同于 +2kHz), 而 +2kHz absolute 是一个绝对频率(严格等同于 2kHz absolute)。
absolute
如果指定,则此关键字表示指定频率表示绝对值。 如果指定了负频率,则计算频率将为零。
<semitones>
指定相对于继承值的相对变化(递减或递增), 作为一个 半音
<percentage>
正负 百分比 值分别表示 相对于继承值的增量或递减。 计算值是通过将指定的继承值的分数相加(或减去)计算得出的, 到(从)继承值。 例如,50%(等同于 +50%)与继承值 200Hz 结果为 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; } /* 初始值为 'medium'
                               (实际频率值
                               取决于当前声音) */

e1 { voice-range: +25%; } /* 计算值为
                             ['medium' + 25%],解析为
                             对应于 'medium' 的频率
                             加上 0.25 倍的频率
                             对应于 'medium' */

e2 { voice-range: +10Hz; } /* 计算值为
                              [FREQ + 10Hz],其中 "FREQ" 是上述 "e1" 规则中计算的绝对频率。 */

e3 { voice-range: inherit; /* 可以省略,但为了清晰起见我们显式指定它 */

     voice-family: "another-voice"; } /* 此声音更改将导致
                                         重新评估继承自 "body" 元素的初始 'medium' 关键字
                                         (即从依赖于声音的关键字值转换为
                                         具体的、绝对频率),
                                         但由于在样式级联中应用了相对偏移量,实际继承值
                                         是在 "e2" 规则中计算的频率。 */

e4 { voice-range: 200Hz absolute; } /* 用绝对频率覆盖
                                       不依赖于当前声音 */

e5 { voice-range: 2st; } /* 计算值为绝对频率,
                            是以下计算结果:
                            200Hz + 两个半音
                            (提醒:与半音对应的实际频率
                            取决于应用于的基值) */

e6 { voice-range: inherit; /* 可以省略,但为了清晰起见我们显式指定它 */

     voice-family: "yet-another-voice"; } /* 尽管声音更改,
                                             计算值与
                                             "e5" 相同(即绝对频率值,
                                             独立于当前声音) */

11.5. 声音重音属性 voice-stress 属性

名称: voice-stress
值: normal | strong | moderate | none | reduced
初始值: normal
适用范围: 所有元素
继承属性:
百分比: N/A
计算值: 指定值
规范顺序: 按语法

声音重音属性 voice-stress 属性操作强调的强度, 通常通过改变音高、时间、音量和其他声学差异的组合来应用。 因此,值的确切含义取决于所说的语言。

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

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>这是一辆大车。</p>
<!-- 上面这一行的语音输出与下面这一行完全相同: -->
<p>这是一辆 <em class="default-emphasis">大</em>车。</p>

<p>这辆车是 <em class="lowered-emphasis">巨大的</em>!</p>
<!-- 下面的 "em" 完全被去强调,而上面一行的强调只是减少: -->
<p>这辆车是 <em class="removed-emphasis">巨大的</em>!</p>

<!-- 下面的行展示了越来越强的强调级别: -->
<p>这是一辆 <em class="normal-emphasis">大</em>车!</p>
<p>这是一辆 <em class="huge-emphasis">大</em>车!!!</p>

12. 声音持续时间属性

12.1. 声音持续时间属性 voice-duration

名称: voice-duration
值: auto | <time>
初始值: auto
适用范围: 所有元素
继承属性:
百分比: N/A
计算值: 指定值
规范顺序: 按语法

声道持续时间属性 voice-duration 属性指定渲染所选元素内容所需的时间 (不包括 音频提示暂停静音)。 除非指定值 auto, 否则此属性优先于 voice-rate 属性, 应用于确定适合的说话速率。 对于 voice-duration 属性值不是 auto 的元素,可以有 子元素,其 voice-durationvoice-rate 属性被指定, 但这些必须被忽略。 换句话说,当为所选元素指定 <time>voice-duration 时, 它适用于整个元素子树(子元素无法覆盖该属性)。

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

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

13. 列表项和计数器样式

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

注意: CSS 列表和计数器模块第 3 级的新功能的语音呈现 [CSS3LIST] 不在此级别的 CSS Speech 中涵盖,但可能会在将来的规范中定义。

disccirclesquare
对于这些列表项样式,用户代理定义(可能基于用户偏好)所说的等效短语或播放的音频提示。因此,带有图形子弹的列表项以实现依赖的方式适当地宣布。
decimaldecimal-leading-zerolower-romanupper-romangeorgianarmenian
对于这些列表项样式,语音合成器按原样朗读相应的数字,并可能用附加音频提示或文档语言中的语音短语(即与用于读取列表项内容的相同 TTS 语音)来补充,以表示列表项的存在。例如,在使用英语时,列表项计数器可能以单词 "Item" 为前缀,从而导致列表项被宣布为 "Item one"、"Item two" 等。
lower-latinlower-alphaupper-latinupper-alphalower-greek
这些列表项样式由语音合成器按字母拼读,在文档语言中(即与用于读取列表项内容的相同 TTS 语音)。例如,英语中的 lower-greek 将被朗读为 "alpha"、"beta"、"gamma" 等。类似地,法语中的 upper-latin 将被朗读为 /a/、/be/、/se/ 等(音标符号)。

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

14. 插入和替换的内容

本节不是规范性的。

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

在此示例中,缩写使用标题属性的内容而不是元素的内容进行渲染。
/* 这将用字符串 "World Wide Web Consortium" 替换选定元素的内容。 */
abbr { content: attr(title); }
...

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

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

在此示例中——假设格式受到支持、文件可用且用户代理已配置为这样做——播放了约翰·吉尔古德爵士对著名独白的朗诵录音。否则,用户代理将回退到使用合成语音渲染文本。
.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 生成和替换内容模块中找到 [CSS3GENCON]

15. 发音,音素

本节不是规范性的。

CSS 并未指定如何定义标记文档中特定文本的发音(使用明确定义的音标)。在此规范的早期草稿中描述了一个 "phonemes" 属性,但由于违反了内容与表现之间的分离原则而引起了反对。(在听觉 CSS 样式表中编写的 "phonemes" 属性需要在标记文档中的文本更改时进行更新。)因此,"phonemes" 功能被认为超出了 CSS(表现层)的范围,应在标记 / 内容层中处理。

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

此外,可以在标记中使用基于属性的机制来编写文本与发音的关联。撰写时,这种机制在 W3C HTML 标准中尚未正式定义。然而,EPUB 3.0 规范 允许 (x)HTML5 文档包含来自 [SSML] 规范的属性,以描述如何根据特定音标字母发音文本。

词汇表

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

UA
用户代理

代表用户读取和/或写入 CSS 样式表的程序,涵盖以下类别:渲染文档的程序(例如浏览器)和创建样式表的程序(例如编辑器)。用户代理可能同时属于这两类。(还有其他程序读取或写入样式表,但本模块对此没有规则。)

文档

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

样式表

CSS 样式表

附录 D — 致谢

编辑者感谢 W3C 语音浏览器和层叠样式表工作组的成员们对本规范的准备提供的帮助。特别感谢艾伦·埃德(IBM)对其详细评论的贡献,以及艾丽卡·埃特马德(Fantasai)对其全面审查的支持。

附录 E — 变更

2012 年候选推荐以来,已进行以下更改:

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

一致性

文档约定

一致性要求通过描述性声明和 RFC 2119 术语的组合来表达。关键字 “MUST”、 “MUST NOT”、 “REQUIRED”、 “SHALL”、 “SHALL NOT”、 “SHOULD”、 “SHOULD NOT”、 “RECOMMENDED”、 “MAY” 和 “OPTIONAL” 在本文件的规范部分中应根据 RFC 2119 的描述进行解释。然而,为了可读性,这些词在本规范中并未全部使用大写字母。

本规范的所有文本都是规范性的,除非章节明确标记为非规范性、示例和注释。[RFC2119]

本规范中的示例以“例如”开头,或使用 class="example" 与规范文本分开,如下所示:

这是一个信息示例。

信息注释以“注释”一词开头,并使用 class="note" 从规范文本中分开,如下所示:

注释,这是一个信息性注释。

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

一致性类

对此规范的一致性定义为三个一致性类:

样式表
CSS 样式表
渲染器
解释样式表语义并呈现使用它们的文档的 用户代理
创作工具
编写样式表的 用户代理

如果所有使用本模块中定义的语法的语句在通用 CSS 语法和本模块中定义的每个功能的单独语法中都是有效的,则样式表符合本规范。

如果渲染器除了根据适当的规范解释样式表外,还通过正确解析本规范定义的所有功能并相应呈现文档,则其符合本规范。然而,用户代理由于设备的限制而无法正确呈现文档并不使用户代理不符合规范。(例如,用户代理不需要在单色显示器上呈现颜色。)

如果创作工具编写的样式表在通用 CSS 语法和本模块中每个功能的单独语法上都是语法正确的,并满足本模块中描述的样式表的所有其他一致性要求,则其符合本规范。

部分实现

为了使作者能够利用向前兼容的解析规则来分配回退值,CSS 渲染器必须将任何它们没有可用支持级别的 at-rules、属性、属性值、关键字和其他语法构造视为无效(并在适当情况下忽略)。特别是,用户代理必须不在单个多值属性声明中选择性地忽略不支持的组件值,并遵循支持的值:如果任何值被视为无效(因为必须是不支持的值),CSS 要求整个声明被忽略。

不稳定和专有特性的实现

为了避免与未来稳定的 CSS 特性发生冲突,CSS 工作组建议遵循最佳实践来实现不稳定特性和专有扩展

非实验性实现

一旦规范达到候选推荐阶段,非实验性实现是可能的,实施者应该发布任何他们能够证明符合规范的 CR 级别特性的无前缀实现。

为了建立和维护 CSS 在各实现之间的互操作性,CSS 工作组要求非实验性的 CSS 渲染器在发布任何 CSS 特性的无前缀实现之前,向 W3C 提交实现报告(如有必要,还需提交用于该实现报告的测试用例)。提交给 W3C 的测试用例将由 CSS 工作组进行审核和修正。

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

CR 退出标准

为了将此规范提升为建议推荐,必须至少有两个独立的、互操作的实现每个特性。每个特性可以由不同的产品集实现,没有要求所有特性必须由单一产品实现。为此标准的目的,我们定义以下术语:

独立
每个实现必须由不同的主体开发,并且不能与其他合格实现共享、重用或衍生代码。与本规范的实现无关的代码部分不受此要求的限制。
互操作
通过官方 CSS 测试套件中的相应测试用例,或者如果实现不是 Web 浏览器,则通过等效测试。测试套件中的每个相关测试都应创建相应的测试,如果这样的用户代理(UA)被用于声称互操作性。此外,如果这样的 UA 被用于声称互操作性,则必须还有一个或多个其他 UA 也可以以相同的方式通过这些等效测试。出于同行评审的目的,必须公开提供等效测试。
实现
一个用户代理:
  1. 实现该规范。
  2. 对公众可用。该实现可以是已发布的产品或其他公开可用的版本(即,beta 版本、预览版本或“夜间构建”)。非发布产品发布的功能必须在至少一个月内实现,以证明其稳定性。
  3. 不是实验性的(即,专门设计用于通过测试套件并不打算用于未来正常使用的版本)。

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

索引

本规范定义的术语

通过引用定义的术语

参考文献

规范性参考文献

[CSS-BACKGROUNDS-3]
Bert Bos; Elika Etemad; Brad Kemper. CSS 背景和边框模块第 3 版. 2021 年 7 月 26 日. CR. URL: https://www.w3.org/TR/css-backgrounds-3/
[CSS-BOX-4]
Elika Etemad. CSS 盒模型模块第 4 版. 2022 年 11 月 3 日. WD. URL: https://www.w3.org/TR/css-box-4/
[CSS-CASCADE-5]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS 级联和继承第 5 版. 2022 年 1 月 13 日. CR. URL: https://www.w3.org/TR/css-cascade-5/
[CSS-COUNTER-STYLES-3]
Tab Atkins Jr.. CSS 计数器样式第 3 版. 2021 年 7 月 27 日. CR. URL: https://www.w3.org/TR/css-counter-styles-3/
[CSS-DISPLAY-3]
Tab Atkins Jr.; Elika Etemad. CSS 显示模块第 3 版. 2022 年 11 月 18 日. CR. URL: https://www.w3.org/TR/css-display-3/
[CSS-FONTS-4]
John Daggett; Myles Maxfield; Chris Lilley. CSS 字体模块第 4 版. 2021 年 12 月 21 日. WD. URL: https://www.w3.org/TR/css-fonts-4/
[CSS-POSITION-3]
Elika Etemad; Tab Atkins Jr.. CSS 定位布局模块第 3 版. 2022 年 9 月 1 日. WD. URL: https://www.w3.org/TR/css-position-3/
[CSS-PSEUDO-4]
Daniel Glazman; Elika Etemad; Alan Stearns. CSS 伪元素模块第 4 版. 2022 年 12 月 30 日. WD. URL: https://www.w3.org/TR/css-pseudo-4/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS 值和单位模块第 3 版. 2022 年 12 月 1 日. CR. URL: https://www.w3.org/TR/css-values-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS 值和单位模块第 4 版. 2022 年 10 月 19 日. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS2]
Bert Bos; et al. 层叠样式表第二版修订 1 (CSS 2.1) 规范. 2011 年 6 月 7 日. REC. URL: https://www.w3.org/TR/CSS21/
[CSS22]
Bert Bos. 层叠样式表第二版修订 2 (CSS 2.2) 规范. 2016 年 4 月 12 日. WD. URL: https://www.w3.org/TR/CSS22/
[CSS3GENCON]
Elika Etemad; Dave Cramer. CSS 生成内容模块第 3 版. 2019 年 8 月 2 日. WD. URL: https://www.w3.org/TR/css-content-3/
[CSS3LIST]
Elika Etemad; Tab Atkins Jr.. CSS 列表和计数器模块第 3 版. 2020 年 11 月 17 日. WD. URL: https://www.w3.org/TR/css-lists-3/
[INFRA]
Anne van Kesteren; Domenic Denicola. 基础标准. 现行标准. URL: https://infra.spec.whatwg.org/
[MEDIAQUERIES-5]
Dean Jackson; et al. 媒体查询第 5 版. 2021 年 12 月 18 日. WD. URL: https://www.w3.org/TR/mediaqueries-5/
[RFC2119]
S. Bradner. 在 RFC 中使用的关键字以指示要求级别. 1997 年 3 月. 最佳当前实践. URL: https://datatracker.ietf.org/doc/html/rfc2119
[SSML]
Daniel Burnett; Zhi Wei Shuang. 语音合成标记语言 (SSML) 第 1.1 版. 2010 年 9 月 7 日. REC. URL: https://www.w3.org/TR/speech-synthesis11/
[XML11]
Tim Bray; et al. 可扩展标记语言 (XML) 1.1 (第二版). 2006 年 8 月 16 日. REC. URL: https://www.w3.org/TR/xml11/

非规范性参考文献

[HTML]
Anne van Kesteren; et al. HTML 标准. 现行标准. URL: https://html.spec.whatwg.org/multipage/
[PRONUNCIATION-LEXICON]
Paolo Baggia. 发音词典规范 (PLS) 第 1.0 版. 2008 年 10 月 14 日. REC. URL: https://www.w3.org/TR/pronunciation-lexicon/
[SSML-SAYAS]
Daniel Burnett; et al. SSML 1.0 say-as 属性值. 2005 年 5 月 26 日. NOTE. URL: https://www.w3.org/TR/ssml-sayas/

属性索引

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