附录 A. 听觉样式表

目录

本章为说明性内容。用户代理(UAs)不需要实现本章的属性即可符合CSS 2.2标准。

A.1 媒体类型 'aural' 和 'speech'

我们预计在未来的CSS版本中,将会为语音输出定义新的属性和值。因此,CSS 2.2保留了'speech'媒体类型(参见第7章,“媒体类型”),但尚未定义哪些属性适用于该媒体类型。

本附录中的属性适用于CSS2中引入的媒体类型'aural'。但'aural'类型现已被弃用。

这意味着如下样式表:

@media speech {
  body { voice-family: Paul }
}

是有效的,但其含义未被CSS 2.2定义;而

@media aural {
  body { voice-family: Paul }
}

已被弃用,但其含义由本附录定义。

A.2 听觉样式表简介

文档的听觉呈现方式已被盲人和视力受损的社区广泛使用,它结合了语音合成和“听觉图标”。这种听觉呈现通常是将文档转换为纯文本,并将其输入到屏幕阅读器中——这是一种简单地读取屏幕上所有字符的软件或硬件。这种方式的呈现效果不如保留文档结构时有效。听觉呈现的样式表属性可以与视觉属性(混合媒体)一起使用,也可以作为视觉呈现的听觉替代方案。

除了显而易见的可访问性优势外,还有其他广泛的市场需求,比如车载使用、工业和医疗文档系统(内部网)、家庭娱乐,以及帮助学习阅读或有阅读困难的用户。

在使用听觉属性时,画布由一个三维物理空间(环绕声)和一个时间空间(可以指定声音在其他声音之前、期间或之后播放)组成。CSS属性还允许作者改变合成语音的质量(语音类型、频率、声调变化等)。

示例:

h1, h2, h3, h4, h5, h6 {
    voice-family: paul;
    stress: 20;
    richness: 90;
    cue-before: url("ping.au")
}
p.heidi { azimuth: center-left }
p.peter { azimuth: right }
p.goat  { volume: x-soft }

这将指示语音合成器使用名为“paul”的语音(类似于“音频字体”)来朗读标题,语调平稳但声音非常丰富。在朗读标题之前,将从给定的URL播放一个声音样本。类为“heidi”的段落将从左前方传出(如果音响系统支持空间音效),类为“peter”的段落将从右边传出。类为“goat”的段落声音将非常柔和。

A.2.1 角度

角度值在文本中用 <angle> 表示。 它们的格式是一个紧跟在角度单位标识符后面的 <number>

角度单位标识符包括:

角度值可以为负数。用户代理应将其归一化为0-360度范围内。例如,-10度和350度是等效的。

例如,直角可以表示为 '90deg' 或 '100grad' 或 '1.570796326794897rad'。

与 <length> 类似,如果值为零,则可以省略单位:“0deg”可以写为“0”。

A.2.2 时间

时间值在文本中用 <time> 表示。 它们的格式是一个紧跟在时间单位标识符后面的 <number>

时间单位标识符包括:

时间值不能为负数。

与 <length> 类似,如果值为零,则可以省略单位:“0s”可以写为“0”。

A.2.3 频率

频率值在文本中用 <frequency> 表示。 它们的格式是一个紧跟在频率单位标识符后面的 <number>

频率单位标识符包括:

频率值不能为负数。

例如,200Hz(或200hz)是低音,6kHz 是高音。

与 <length> 类似,如果值为零,则可以省略单位:“0Hz”可以写为“0”。

A.3 音量属性'volume'

名称: volume
值: <number> | <percentage> | silent | x-soft | soft | medium | loud | x-loud | inherit
初始值: medium
应用于: 所有元素
是否继承:
百分比: 相对于继承值
媒体: aural
计算值: 数字

音量 指的是波形的中间音量。换句话说,音量为50的高度变化的声音可能会峰值远高于此。总体值可能会根据人类的舒适度进行调整,例如通过物理音量控制(这将成比例地增加0和100值);此属性的作用是调整动态范围。

值具有以下含义:

<number>
在“0”和“100”之间的任何数字。 “0”表示最小可听见的音量水平,而“100”对应于最大舒适水平。
<percentage>
百分比值相对于继承值计算,然后截断到“0”到“100”范围内。
silent
完全无声。“0”的值与“silent”不同。
x-soft
等同于“0”。
soft
等同于“25”。
medium
等同于“50”。
loud
等同于“75”。
x-loud
等同于“100”。

用户代理应允许听众设置与“0”和“100”对应的值。没有一种设置是普遍适用的;合适的值取决于所使用的设备(扬声器、耳机)、环境(车内、家庭影院、图书馆)和个人偏好。一些示例:

相同的作者样式表可以在所有情况下使用,只需在客户端适当地映射“0”和“100”点即可。

A.4 语音属性'speak'

名称: speak
值: normal | none | spell-out | inherit
初始值: normal
应用于: 所有元素
是否继承:
百分比: 不适用
媒体: aural
计算值: 按指定

此属性指定文本是否会以听觉方式呈现,如果会,则以何种方式呈现。可能的值包括:

none
抑制听觉呈现,使该元素不需要时间来呈现。然而请注意,后代元素可以覆盖此值并将被朗读。(要确保抑制一个元素及其后代的呈现,请使用'display'属性)。
normal
使用与语言相关的发音规则来呈现一个元素及其子元素。
spell-out
逐字母拼出文本(对于首字母缩写词和缩写词很有用)。

请注意一个元素的'volume'属性值为'silent'与其'speak'属性值为'none'之间的区别。前者占用的时间与其被朗读时相同,包括元素之前和之后的任何暂停,但不会生成声音。后者不需要时间且不会被呈现(尽管其后代元素可能会被呈现)。

A.5 暂停属性'pause-before''pause-after''pause'

名称: pause-before
值: <time> | <percentage> | inherit
初始值: 0
应用于: 所有元素
是否继承:
百分比: 参见正文
媒体: aural
计算值: 时间
名称: pause-after
值: <time> | <percentage> | inherit
初始值: 0
应用于: 所有元素
是否继承:
百分比: 参见正文
媒体: aural
计算值: 时间

这些属性指定在朗读元素内容之前(或之后)应停顿的时间。值具有以下含义:

注意。 在CSS3中,暂停被插入在提示和内容周围,而不是它们之间。详见[CSS3SPEECH]

<time>
以绝对时间单位(秒和毫秒)表示暂停。
<percentage>
指代'speech-rate'属性值的倒数。例如,如果语速为每分钟120个单词(即一个单词需要半秒或500毫秒),那么'pause-before'的100%意味着暂停500毫秒,而'pause-before'的20%意味着暂停100毫秒。

暂停被插入在元素的内容与任何'cue-before''cue-after'内容之间。

作者应使用相对单位,以在语速大幅变化时创建更健壮的样式表。

名称: pause
值: [ [<time> | <percentage>]{1,2} ] | inherit
初始值: 见各个属性
应用于: 所有元素
是否继承:
百分比: 见'pause-before'和'pause-after'的描述
媒体: aural
计算值: 见各个属性

'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 unspecified; pause-after: 10ms */

A.6 提示属性'cue-before''cue-after''cue'

名称: cue-before
值: <uri> | none | inherit
初始值: none
应用于: 所有元素
是否继承:
百分比: 不适用
媒体: aural
计算值: 绝对URI或'none'
名称: cue-after
值: <uri> | none | inherit
初始值: none
应用于: 所有元素
是否继承:
百分比: 不适用
媒体: aural
计算值: 绝对URI或'none'

听觉图标是区分语义元素的另一种方式。可以在元素之前和/或之后播放声音以对其进行界定。值具有以下含义:

<uri>
URI必须指定听觉图标资源。如果URI解析为音频文件以外的内容,如图像,则应忽略该资源,并将属性视为具有'none'值。
none
未指定听觉图标。

示例:

a {cue-before: url("bell.aiff"); cue-after: url("dong.wav") }
h1 {cue-before: url("pop.au"); cue-after: url("pop.au") }
名称: cue
值: [ <'cue-before'> || <'cue-after'> ] | inherit
初始值: 见各个属性
应用于: 所有元素
是否继承:
百分比: 不适用
媒体: aural
计算值: 见各个属性

'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") }

如果用户代理无法呈现听觉图标(例如,用户的环境不允许),我们建议它产生一个替代提示音。

请参阅 :before 和 :after 伪元素章节,了解有关其他内容生成技术的信息。'cue-before'声音和'pause-before'间隙插入在':before'伪元素的内容之前。同样,'pause-after'间隙和'cue-after'声音插入在':after'伪元素的内容之后。

A.7 混音属性'play-during'

名称: play-during
值: <uri> [ mix || repeat ]? | auto | none | inherit
初始值: auto
应用于: 所有元素
是否继承:
百分比: 不适用
媒体: aural
计算值: 绝对URI,其他按指定

'cue-before''cue-after'属性类似,此属性指定在朗读元素内容时作为背景播放的声音。值具有以下含义:

<uri>
由此<uri>指定的声音在朗读元素内容时作为背景播放。
mix
当存在此关键字时,意味着从父元素继承的'play-during'属性的声音继续播放,并与由<uri>指定的声音混合。如果未指定'mix',则元素的背景声音替换父元素的声音。
repeat
当存在此关键字时,意味着如果声音太短无法填满元素的整个持续时间,则会重复播放。否则,声音播放一次后停止。这类似于'background-repeat'属性。如果声音太长,则在元素朗读完后被截断。
auto
父元素的声音继续播放(不会重新开始播放,这将发生在此属性被继承的情况下)。
none
此关键字表示静音。在当前元素期间,父元素的声音(如果有)被静音,并在当前元素之后继续播放。

示例:

blockquote.sad { play-during: url("violins.aiff") }
blockquote Q   { play-during: url("harp.wav") mix }
span.quiet     { play-during: none }

A.8 空间属性'azimuth''elevation'

空间音频是听觉呈现中重要的样式属性。它提供了一种自然的方式来区分多个声音,就像在现实生活中一样(人们很少都站在房间的同一个位置)。立体声扬声器可以产生横向的声场。双耳耳机或越来越流行的5扬声器家庭影院系统可以生成完整的环绕声,多扬声器系统可以创建真正的三维声场。VRML 2.0也包含了空间音频,这意味着随着时间的推移,消费级空间音频硬件将变得更加普及。

名称: azimuth
值: <angle> | [[ left-side | far-left | left | center-left | center | center-right | right | far-right | right-side ] || behind ] | leftwards | rightwards | inherit
初始值: center
应用于: 所有元素
是否继承:
百分比: 不适用
媒体: aural
计算值: 归一化角度

这些值具有以下含义:

<angle>
位置用“-360deg”到“360deg”范围内的角度描述。“0deg”表示在声场的正中心。“90deg”表示在右侧,“180deg”在后面,“270deg”(或等效且更方便的“-90deg”)表示在左侧。
left-side
与“270deg”相同。与“behind”一起使用时为“270deg”。
far-left
与“300deg”相同。与“behind”一起使用时为“240deg”。
left
与“320deg”相同。与“behind”一起使用时为“220deg”。
center-left
与“340deg”相同。与“behind”一起使用时为“200deg”。
center
与“0deg”相同。与“behind”一起使用时为“180deg”。
center-right
与“20deg”相同。与“behind”一起使用时为“160deg”。
right
与“40deg”相同。与“behind”一起使用时为“140deg”。
far-right
与“60deg”相同。与“behind”一起使用时为“120deg”。
right-side
与“90deg”相同。与“behind”一起使用时为“90deg”。
leftwards
将声音相对于当前角度向左移动。更准确地说,减去20度。算术运算以360度为模数进行。请注意,“leftwards”更准确地描述为“逆时针转动”,因为它总是减去20度,即使继承的方位角已经在听者的后方(在这种情况下,声音实际上似乎向右移动)。
rightwards
将声音相对于当前角度向右移动。更准确地说,加上20度。请参阅“leftwards”了解算术运算。

该属性最有可能通过在不同通道中以不同音量混合同一信号来实现。它还可能使用相移、数字延迟等技术来提供声场的幻觉。实现这种效果的具体方法和使用的扬声器数量取决于用户代理;此属性仅标识期望的最终结果。

示例:

h1   { azimuth: 30deg }
td.a { azimuth: far-right }          /*  60deg */
#12  { azimuth: behind far-right }   /* 120deg */
p.comment { azimuth: behind }        /* 180deg */

如果指定了空间方位角且输出设备无法在听者位置的后方产生声音,用户代理应将后半球的值转换为前半球的值。以下是一个方法:

名称: elevation
值: <angle> | below | level | above | higher | lower | inherit
初始值: level
应用于: 所有元素
是否继承:
百分比: 不适用
媒体: aural
计算值: 归一化角度

此属性的值具有以下含义:

<angle>
将仰角指定为角度,在“-90deg”到“90deg”之间。'0deg'表示在前方地平线上,这大致意味着与听者水平。'90deg'表示正上方,'-90deg'表示正下方。
below
与“-90deg”相同。
level
与“0deg”相同。
above
与“90deg”相同。
higher
在当前仰角上加10度。
lower
在当前仰角上减去10度。

实现这种效果的具体方法和使用的扬声器数量未定义。此属性仅标识期望的最终结果。

示例:

h1   { elevation: above }
tr.a { elevation: 60deg }
tr.b { elevation: 30deg }
tr.c { elevation: level }

A.9 语音特征属性'speech-rate''voice-family''pitch''pitch-range''stress',以及'richness'

名称: speech-rate
值: <number> | x-slow | slow | medium | fast | x-fast | faster | slower | inherit
初始值: medium
应用于: 所有元素
是否继承:
百分比: 不适用
媒体: aural
计算值: number

此属性指定语速。请注意,允许使用绝对值和相对关键字值(与'font-size'进行比较)。这些值的含义如下:

<number>
指定以每分钟单词数(WPM)为单位的语速,尽管语速因语言而异,但这一数量仍然得到语音合成器的广泛支持。
x-slow
相当于80个词/分钟。
slow
相当于120个词/分钟。
medium
相当于180-200个词/分钟。
fast
相当于300个词/分钟。
x-fast
相当于500个词/分钟。
faster
在当前语速上增加40个词/分钟。
slower
在当前语速上减少40个词/分钟。
名称: voice-family
值: [[<specific-voice> | <generic-voice> ],]* [<specific-voice> | <generic-voice> ] | inherit
初始值: 取决于用户代理
应用于: 所有元素
是否继承:
百分比: 不适用
媒体: aural
计算值: 按指定计算

该值是一个以逗号分隔的优先级语音族名称列表(与'font-family'进行比较)。这些值的含义如下:

<generic-voice>
值为语音族。可能的值包括“male”、“female”和“child”。
<specific-voice>
值为特定实例(例如,comedian、trinoids、carlos、lani)。

示例:

h1 { voice-family: announcer, male }
p.part.romeo  { voice-family: romeo, male }
p.part.juliet { voice-family: juliet, female }

特定语音的名称可以加引号,如果名称中的任何单词不符合标识符的语法规则,则必须加引号。建议对由多个单词组成的特定语音加引号。如果省略引号,则在语音族名称之前和之后的任何空白字符将被忽略,语音族名称内部的任何空白字符序列将转换为一个空格。

名称: pitch
值: <frequency> | x-low | low | medium | high | x-high | inherit
初始值: medium
应用于: 所有元素
是否继承:
百分比: 不适用
媒体: aural
计算值: frequency

指定语音的平均音高(频率)。语音的平均音高取决于语音族。例如,标准男性语音的平均音高约为120Hz,而女性语音的平均音高约为210Hz。

这些值的含义如下:

<frequency>
指定语音的平均音高,以赫兹(Hz)为单位。
x-lowlowmediumhighx-high
这些值不映射到绝对频率,因为这些值取决于语音族。用户代理应根据语音族和用户环境将这些值映射到适当的频率。然而,用户代理必须按顺序映射这些值(即,“x-low”的频率低于“low”,等等)。
名称: pitch-range
值: <number> | inherit
初始值: 50
应用于: 所有元素
是否继承:
百分比: 不适用
媒体: aural
计算值: 按指定计算

指定平均音高的变化范围。语音的感知音高由基频决定,通常标准男性语音的基频为120Hz,女性语音的基频为210Hz。人类语言以不同的音调和音高说话;这些变化传达了额外的意义和强调。因此,高度生动的语音,即强烈的抑扬顿挫,显示出较高的音高范围。此属性指定这些变化发生的范围,即基频相对于平均音高可能偏离的程度。

这些值的含义如下:

<number>
值在“0”到“100”之间。音高范围为“0”会产生平淡、单调的声音。音高范围为50会产生正常的抑扬顿挫。音高范围大于50会产生生动的声音。
名称: stress
值: <number> | inherit
初始值: 50
应用于: 所有元素
是否继承:
百分比: 不适用
媒体: aural
计算值: 按指定计算

指定语音音调轮廓中“局部峰值”的高度。例如,英语是一种重音语言,句子的不同部分被分配为主重音、副重音或三级重音。'stress'的值控制由这些重音标记产生的抑扬顿挫的程度。此属性是'pitch-range'属性的配套属性,旨在让开发人员利用高端音频显示设备。

这些值的含义如下:

<number>
值在“0”到“100”之间。这些值的意义取决于所讲的语言。例如,对于一个标准的英语男性声音(平均音高=122Hz),以正常语调和强调说话时的“50”水平与意大利语语音的“50”水平的含义会有所不同。
名称: richness
值: <number> | inherit
初始值: 50
应用于: 所有元素
是否继承:
百分比: 不适用
媒体: aural
计算值: 按指定计算

指定语音的丰富度或亮度。丰富的声音将在大房间内“传播”,而柔和的声音则不会。(“柔和”一词是指当波形被绘制出来时的外观。)

这些值的含义如下:

<number>
值在“0”到“100”之间。值越高,声音传播得越远。较低的值会产生柔和、甜美的声音。

A.10 语音属性'speak-punctuation''speak-numeral'

另一个语音属性,'speak-header',将在下文中描述。

名称: speak-punctuation
值: code | none | inherit
初始值: none
应用于: 所有元素
是否继承:
百分比: 不适用
媒体: aural
计算值: 按指定计算

此属性指定标点符号的发音方式。这些值的含义如下:

code
标点符号如分号、大括号等将被按字面意思读出。
none
标点符号不会被读出,而是自然地呈现为各种停顿。
名称: speak-numeral
值: digits | continuous | inherit
初始值: continuous
应用于: 所有元素
是否继承:
百分比: 不适用
媒体: aural
计算值: 按指定计算

此属性控制数字的发音方式。这些值的含义如下:

digits
将数字按单个数字发音。例如,"237"将读作"Two Three Seven"。
continuous
将数字按完整数字发音。例如,"237"将读作"Two hundred thirty seven"。单词表示依赖于语言。

A.11 表格的音频呈现

当表格由语音生成器朗读时,数据单元格与标题单元格之间的关系必须通过不同于水平和垂直对齐的方式来表达。一些语音浏览器可能允许用户在二维空间中移动,从而使他们有机会映射出空间表示的关系。当这种方法不可行时,样式表必须指定在何处朗读标题。

A.11.1 朗读标题: 'speak-header' 属性

名称: speak-header
值: once | always | inherit
初始值: once
应用于: 具有表格标题信息的元素
是否继承:
百分比: 不适用
媒体: aural
计算值: 按指定计算

此属性指定是否在每个单元格之前朗读表格标题,或仅在当前单元格与前一个单元格关联不同标题时才朗读。值的含义如下:

once
标题在一系列单元格之前朗读一次。
always
在每个相关的单元格之前朗读标题。

每种文档语言可能都有不同的机制允许作者指定标题。例如,在 HTML 4 ([HTML4]) 中,可以使用三种不同的属性("headers"、"scope" 和 "axis")来指定标题信息,并且该规范提供了在未指定这些属性时确定标题信息的算法。

用 MS Word 创建的表格图像   [D]

表格图像,标题单元格("San Jose" 和 "Seattle")不在与其数据相关的同一列或行。

此 HTML 示例展示了在两个地点(San Jose 和 Seattle)连续几天内在餐饮、酒店和交通上的花费。概念上,你可以将表格视为 n 维空间。此空间的标题为:地点、日期、类别和小计。一些单元格定义了轴上的标记,而其他单元格则给出了在此空间内的具体花费。此表格的标记如下:

<TABLE>
<CAPTION>旅行费用报告</CAPTION>
<TR>
  <TH></TH>
  <TH>餐饮</TH>
  <TH>酒店</TH>
  <TH>交通</TH>
  <TH>小计</TH>
</TR>
<TR>
  <TH id="san-jose" axis="san-jose">San Jose</TH>
</TR>
<TR>
  <TH headers="san-jose">1997年8月25日</TH>
  <TD>37.74</TD>
  <TD>112.00</TD>
  <TD>45.00</TD>
  <TD></TD>
</TR>
<TR>
  <TH headers="san-jose">1997年8月26日</TH>
  <TD>27.28</TD>
  <TD>112.00</TD>
  <TD>45.00</TD>
  <TD></TD>
</TR>
<TR>
  <TH headers="san-jose">小计</TH>
  <TD>65.02</TD>
  <TD>224.00</TD>
  <TD>90.00</TD>
  <TD>379.02</TD>
</TR>
<TR>
  <TH id="seattle" axis="seattle">Seattle</TH>
</TR>
<TR>
  <TH headers="seattle">1997年8月27日</TH>
  <TD>96.25</TD>
  <TD>109.00</TD>
  <TD>36.00</TD>
  <TD></TD>
</TR>
<TR>
  <TH headers="seattle">1997年8月28日</TH>
  <TD>35.00</TD>
  <TD>109.00</TD>
  <TD>36.00</TD>
  <TD></TD>
</TR>
<TR>
  <TH headers="seattle">小计</TH>
  <TD>131.25</TD>
  <TD>218.00</TD>
  <TD>72.00</TD>
  <TD>421.25</TD>
</TR>
<TR>
  <TH>总计</TH>
  <TD>196.27</TD>
  <TD>442.00</TD>
  <TD>162.00</TD>
  <TD>800.27</TD>
</TR>
</TABLE>

通过这种方式提供数据模型,使语音浏览器可以以丰富的方式浏览表格,例如,每个单元格都可以作为一个列表朗读,在每个数据单元格之前重复朗读适用的标题:

  San Jose,1997年8月25日,餐饮: 37.74
  San Jose,1997年8月25日,酒店: 112.00
  San Jose,1997年8月25日,交通: 45.00
 ...

浏览器也可以在标题发生变化时才朗读标题:

San Jose,1997年8月25日,餐饮: 37.74
    酒店: 112.00
    交通: 45.00
  1997年8月26日,餐饮: 27.28
    酒店: 112.00
...

A.12 HTML 示例样式表

此样式表描述了 HTML 4 的可能渲染方式:

@media aural {
h1, h2, h3, 
h4, h5, h6    { voice-family: paul, male; stress: 20; richness: 90 }
h1            { pitch: x-low; pitch-range: 90 }
h2            { pitch: x-low; pitch-range: 80 }
h3            { pitch: low; pitch-range: 70 }
h4            { pitch: medium; pitch-range: 60 }
h5            { pitch: medium; pitch-range: 50 }
h6            { pitch: medium; pitch-range: 40 }
li, dt, dd    { pitch: medium; richness: 60 }
dt            { stress: 80 }
pre, code, tt { pitch: medium; pitch-range: 0; stress: 0; richness: 80 }
em            { pitch: medium; pitch-range: 60; stress: 60; richness: 50 }
strong        { pitch: medium; pitch-range: 60; stress: 90; richness: 90 }
dfn           { pitch: high; pitch-range: 60; stress: 60 }
s, strike     { richness: 0 }
i             { pitch: medium; pitch-range: 60; stress: 60; richness: 50 }
b             { pitch: medium; pitch-range: 60; stress: 90; richness: 90 }
u             { richness: 0 }
a:link        { voice-family: harry, male }
a:visited     { voice-family: betty, female }
a:active      { voice-family: betty, female; pitch-range: 80; pitch: x-high }
}

A.13 Emacspeak

供参考,以下是 Emacspeak(Emacs 编辑器的语音子系统)实现的属性列表:

(感谢 T. V. Raman 提供有关音频属性实现状态的信息。)