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. 示例
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 格式模型基于一系列声音和沉默,这些声音和沉默发生在一个嵌套上下文中,类似于视觉盒模型,我们称之为听觉“盒”模型。听觉“画布”由一个双声道(立体声)空间和一个时间维度组成,在这个维度中,合成语音和音频提示共存。所选元素周围由rest、cue 和 pause 属性(从最内层到最外层)包围。这些可以看作是填充、边框和外边距的听觉等价物。使用时,::before 和::after 伪元素[CSS2]被插入在元素内容和rest之间。
下图展示了视觉和听觉盒模型属性之间的等价关系,应用于所选的<element>:
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-soft、soft、medium、loud、x-loud
- 这一系列关键字对应于单调不减的音量级别,映射到实现相关的值,满足听众对感知响度的要求。这些音频级别通常通过首选项机制提供,允许用户根据听觉环境进行声音选项的校准。关键字x-soft 映射到用户的最低可听音量级别,x-loud 映射到用户的最大可接受音量级别,medium 映射到用户的偏好音量级别,soft 和 loud 映射到中间值。
- <decibel>
- 这表示相对于给定关键字值(见上面的枚举)或根元素的默认值的变化(正或负),或者相对于继承的音量级别(后者本身可能是关键字值和分贝偏移的组合,在这种情况下,分贝值是累加组合的)。当继承的音量级别为silent时,此voice-volume 也解析为silent,与指定的<decibel>值无关。
<decibel> 类型表示具有“dB”(分贝单位)单位标识符的维度。分贝表示新信号幅度a1和当前幅度a0平方的比率,按照以下对数方程计算:volume(dB) = 20 × log10(a1 / a0)。
注意: -6.0dB 大约是音频信号幅度的一半,而 +6.0dB 大约是音频信号幅度的两倍。
注意: 感知响度取决于多种因素,例如听音环境、用户偏好或身体能力。x-soft 和 x-loud 之间的有效音量变化代表音频输出的动态范围(以响度为单位)。通常,在嘈杂的环境中,这个范围会被压缩,即对应于 x-soft 的感知响度实际上会比在安静环境中接近x-loud。还可能出现这种情况,即 x-soft 和 x-loud 都映射到低音量级别,例如在需要谨慎的听音环境中(例如图书馆、夜间阅读)。
6.2. voice-balance 属性
名称: | voice-balance |
---|---|
值: | <number> | left | center | right | leftwards | rightwards |
初始值: | center |
适用对象: | 所有元素 |
继承: | 是 |
百分比: | N/A |
计算值: | 指定值解析为介于 -100 和 100(含)之间的<number> |
标准顺序: | 根据语法 |
音量平衡 属性控制音频输出在横向声场中的空间分布:一侧在左边,另一侧在右边,相对于听众的位置。作者可以指定左边和右边之间的中间步骤,以表示沿着左-右轴的音频分离。
注意: 此属性提供的功能在 SSML 标记语言[SSML]中没有对应项。
- <number>
- 一个介于 -100 和 100(含)的数字。小于 -100 的值被限制为 -100。大于 100 的值被限制为 100。值 -100 表示左侧,值 100 表示右侧。值 0 表示中心点,左右之间没有可分辨的音频分离。(在立体声系统中,这对应于音频信号在左侧和右侧扬声器之间的均匀分配)。
- left
- 等同于 -100。
- center
- 等同于 0。
- right
- 等同于 100。
- leftwards
- 向左移动声音,通过从继承的voice-balance 值中减去 20(并将结果限制为 -100)。
- rightwards
- 向右移动声音,通过在继承的voice-balance 值中加上 20(并将结果限制为 100)。
用户代理可以连接到不同类型的声音系统,具有不同的音频混合能力。对于单声道、立体声和环绕声系统的预期行为定义如下:
-
当用户代理通过单声道声系统(即单扬声器设置)生成音频时,voice-balance 属性无效。
-
当用户代理通过立体声声系统(例如两个扬声器或一副耳机)生成音频时,音频信号的左右分配可以精确匹配voice-balance 属性的作者值。
-
当用户代理能够通过多个声道混合音频信号(例如 5 扬声器的环绕声系统,包括一个专用的中央通道)时,由应用voice-balance 属性生成的音频信号的物理分布应使听者感知到声音就像来自基本的立体声布局。例如,中央通道和左/右扬声器可以一起使用,以模拟center 值的行为。
CSS Speech 模块的未来修订可能会包括对三维音频的支持,这将有效地使作者能够指定“方位角”和“仰角”值。将来,使用当前规范创建的内容可能因此会被用户代理消费,这些用户代理符合支持三维音频的 CSS Speech 版本。为了准备这种可能性,目前voice-balance 属性允许的值设计为与“方位角”保持兼容。更精确地说,当前左右音频轴(横向声场)与听众位置周围设想的 360 度平面之间的映射定义如下:
-
值 0 映射到零度(center)。这是在听众的“前面”,而不是“后面”。
-
值 -100 映射到 -40 度(left)。负角度为逆时针方向(假设从顶部看音频舞台)。
-
值 100 映射到 40 度(right)。正角度为顺时针方向(假设从顶部看音频舞台)。
-
在 100 和 100 之间的标度上的中间值按数字线性比例映射到 -40 和 40 度之间。例如,-50 映射到 -20 度。
注意: 声音系统可以由用户配置,以干扰文档作者指定的左右音频分布。通常,现代声音系统中可用的各种“环绕”模式(包括基于基本立体声扬声器的系统)倾向于大大改变音频信号的感知空间安排。三维声场的错觉通常通过相位移动、数字延迟、音量控制(通道混合)和其他技术的组合来实现。一些用户甚至可能将他们的系统配置为“降级”任何渲染的声音到单个单声道,在这种情况下,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,如果visibility 是visible,否则等同于never。
注意: none 值的display 属性无法被所选元素的后代覆盖,但是auto 值的speak 属性可以被覆盖,使用never 或always。
- 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-before 和 pause-after 属性
名称: | pause-before, pause-after |
---|---|
值: | <time> | none | x-weak | weak | medium | strong | x-strong |
初始值: | none |
适用对象: | 所有元素 |
继承: | 否 |
百分比: | N/A |
计算值: | 指定值 |
标准顺序: | 根据语法 |
pause-before 和 pause-after 属性指定了在元素的语音合成呈现之前(或之后)发生的韵律边界(具有特定持续时间的静音),如果指定了任何 cue-before(或 cue-after),则在 听觉框模型内发生的时间点也是如此。
注意:虽然此属性提供的功能与 SSML 标记语言中的 break
元素 相似[SSML],但在 CSS Speech 的 听觉框模型 内应用 pause 韵律边界需要特别考虑(例如 “折叠”暂停)。
- <time>
- 以绝对时间单位表示暂停(秒和毫秒,例如 "+3s", "250ms")。只允许非负值。
- none
- 相当于 0ms(语音处理器不会产生韵律断裂)。
- x-weak, weak, medium, strong,和 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-before 和 pause-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-after 的听觉 "框" 和其最后一个子元素的 pause-after,前提是前者没有 rest-after 和没有 cue-after。
- 听觉 "框" 的 pause-before 和其第一个子元素的 pause-before,前提是前者没有 rest-before 和没有 cue-before。
- 听觉 "框" 的 pause-after 和其下一个兄弟的 pause-before。
- 听觉 "框" 的 pause-before 和 pause-after,如果 "框" 的 voice-duration 为 "0ms" 且没有 rest-before 或 rest-after,并且没有 cue-before 或 cue-after,或者如果 "框" 根本没有呈现的内容(见 speak)。
被合并的暂停被认为是与另一个暂停相邻的,如果它的任何组成暂停与该暂停相邻。
注意: pause 已经从元素内容和任何 cue 之间移动到 cue 的外部。与信息 CSS2.1 听觉附录 [CSS2] 不向后兼容。
9. 休息属性
9.1. rest-before 和 rest-after 属性
名称: | rest-before, rest-after |
---|---|
值: | <time> | none | x-weak | weak | medium | strong | x-strong |
初始值: | none |
适用对象: | 所有元素 |
继承: | 否 |
百分比: | N/A |
计算值: | 指定的值 |
标准顺序: | 根据语法 |
rest-before 和 rest-after 属性指定在 听觉框模型 中,元素的语音合成呈现之前(或之后)发生的音韵边界(带有特定持续时间的静默)。
注意: 尽管这些属性提供的功能与 SSML 标记语言中的 break
元素 相似,rest
音韵边界在 CSS Speech 的 听觉框模型
中的应用需要特殊考虑(例如,夹杂的音频提示和相邻的附加休息)。
- <time>
- 用绝对时间单位表示休息(秒和毫秒,例如 "+3s","250ms")。只允许非负值。
- none
- 相当于 0ms。(语音处理器不会产生音韵中断。)
- x-weak, weak, medium, strong, and x-strong
- 用语音输出中的音韵中断强度来表示休息。确切的时间依赖于实现。值表示元素之间单调不递减(概念上递增)的中断强度。
与 暂停属性 相比,休息插入在元素内容与任何 cue-before 或 cue-after 内容之间。相邻的休息以附加的方式处理,不会合并。
9.2. rest 简写属性
名称: | rest |
---|---|
值: | <'rest-before'> <'rest-after'>? |
初始值: | N/A(请参见各个属性) |
适用对象: | 所有元素 |
继承: | 否 |
百分比: | N/A |
计算值: | N/A(请参见各个属性) |
标准顺序: | 根据语法 |
rest 属性是 rest-before 和 rest-after 的简写。如果给定两个值,第一个值为 rest-before,第二个值为 rest-after。如果只给定一个值,则该值适用于两个属性。
10. 提示属性
10.1. cue-before 和 cue-after 属性
名称: | cue-before,cue-after |
---|---|
值: | <uri> <decibel>? | none |
初始值: | none |
适用对象: | 所有元素 |
继承: | 否 |
百分比: | N/A |
计算值: | 指定值 |
标准顺序: | 根据语法 |
cue-before 和 cue-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-before 和 cue-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 标识符 的序列形式给出。
注意: 结果是,大多数标点符号或每个标记开头的数字字符必须在未引用的语音名称中转义。
如果以标识符序列作为语音名称,则计算值是通过将所有标识符按单个空格连接起来转换为字符串的名称。
与性别关键字相同的语音名称(male、female 和 neutral)或与 CSS-wide 关键字 或 preserve 匹配的语音名称必须被引用以消除与这些关键字的歧义。保留 default 关键字以备将来使用,使用时也必须引用。
注意: 在 [SSML] 中,语音名称是以空格分隔的,不能包含空白字符。
建议对包含空格、数字或其他标点符号(连字符除外)的语音名称进行引用—即使这些语音名称在未引用的形式下是有效的——以提高代码清晰度。例如:
voice-family: "john doe", "Henry the-8th";
- <age>
- 可能的值为 child、young 和 old,指示在语音选择时首选的年龄类别。
注意: 与 [SSML] 年龄的推荐映射为:child = 6岁,young = 24岁,old = 75岁。语音匹配算法可以使用更灵活的年龄范围。
- <gender>
- 为关键字 male、female 或 neutral,分别指定男性、女性或中性声音。
注意: 年龄或性别与可识别声音类型之间关系的解释不能以普遍的方式定义,因为它实际上取决于许多标准(文化、语言、生物等)。因此,该规范提供的功能代表了可以合理应用于各种语音上下文的简化模型,尽管代价是一定程度的近似。随着语音处理器实现的标准化,未来版本的规范可能会提高语音匹配算法的精度。
- <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 语音特征。
- 如果为选定内容的语言提供多个语音实例,则选择与指定名称、性别、年龄和首选语音变体最接近的语音。实际的“最佳匹配”定义依赖于处理器。例如,在只有男性和女性成人声音可用的系统中,对于“voice-family: young male”的合理匹配可能是音调较高的女性声音,因为这种声音更接近年轻男孩的音色。如果没有语音实例匹配任何 voice-family 组件值提供的特征,则必须使用所有适合选定内容语言的第一个可用语音实例。
- 如果没有适合选定内容语言的语音,则建议用户代理告知用户缺少合适的 TTS 语音。
每当内容流中的任何 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-slow、slow、medium、fast 和 x-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
-
防止合成器强调它通常会强调的文本。
- moderate 和 strong
- 这些值的强度是单调递增的。 它们的应用导致比语音合成器通常会产生的强调更多 (即比对应于 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-duration 和 voice-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 中涵盖,但可能会在将来的规范中定义。
- 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 标记语言的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]。
- 样式表
附录 D — 致谢
编辑者感谢 W3C 语音浏览器和层叠样式表工作组的成员们对本规范的准备提供的帮助。特别感谢艾伦·埃德(IBM)对其详细评论的贡献,以及艾丽卡·埃特马德(Fantasai)对其全面审查的支持。
附录 E — 变更
自2012 年候选推荐以来,已进行以下更改:
此外,还进行了些许小的编辑修正,并将源代码转换为Bikeshed 格式。