19 音声スタイルシート

目次

  1. 音声スタイルシート概論
  2. 音量調節のプロパティ: 'volume'
  3. 読み上げ方式を指定するプロパティ: 'speak'
  4. 一時停止のプロパティ: 'pause-before'、'pause-after'、'pause'
  5. 合図を入れるプロパティ: 'cue-before'、'cue-after'、'cue'
  6. ミキシングのプロパティ: 'play-during'
  7. 音源の方向を変えるプロパティ: 'azimuth'、'elevation'
  8. 声の特性を指定するプロパティ: 'speech-rate'、'voice-family'、'pitch'、'pitch-range'、'stress'、'richness'
  9. 特別な読み方を指定するプロパティ: 'speak-punctuation'、'speak-numeral'

19.1 音声スタイルシート概論(Introduction to aural style sheets)

文書の音声出力とは、合成音声と音声アイコン(auditory icons)を組み合わせたものであり、目が不自由な人々や、視覚媒体への出力に問題がある人々の間ではすでに日常化している。 こういった音声出力の多くは、文書をプレーンテキストに変換し、それを画面読み上げ機(screen reader)--単に画面上の文字を読み上げるだけのソフトウェアもしくはハードウェア--に食わせることで実現している。 しかし、このやり方は文書構造がきちんと保持される場合に比べると表現力に欠けるところがある。 音声出力を制御するスタイルプロパティは、マルチメディア環境での1表現形式として、あるいは視覚表現が使えない場合の備えとして、視覚系プロパティと併用することができる。

明らかなアクセシビリティの向上が得られる場合以外でも、情報の音声出力には大きな需要がある。 たとえば、車内利用、工業や医療現場での文書システム(イントラネット)、家庭内娯楽、などに需要が見られる他、読みの学習をしたいユーザや通常の閲覧に何らかの不都合があるユーザにとっても音声出力は大変役に立つ。

音声関連のプロパティが使うキャンバスには通常の物理三次元空間(サラウンド)に加えて時間軸が存在し、複数の音声の時間的前後関係を指定することができる。 また、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の声(いわゆる「声フォント」の1種)で見出しを読み上げるよう指示している。 また、見出しを読み上げる前にURL指定先の音が再生される。 クラス「heidi」に属する段落は左前から、クラス「peter」に属する段落は右側から聞こえてくることになる(もちろんステレオ環境が整っていればの話だが)。 クラス「goat」に属する段落は非常に静かな出力になる。

19.2 音量調節のプロパティ(Volume properties: 'volume')

'volume'
Value: <number> | <percentage> | silent | x-soft | soft | medium | loud | x-loud | inherit
Initial: medium
Applies to: all elements
Inherited: yes
Percentages: refer to inherited value
Media: 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'と等価。

UAは'0'と'100'に対応する実音量をユーザが設定できるようにすべきである。 なぜなら、あらゆる状況で適切な音量設定などあり得ないからである。 利用する出力装置(読み上げ機、ヘッドホン)、その場の状況(車内、家内上映、図書館)、個人の好みなど様々な要因が絡んでくる。 いくつか例を挙げよう:

同じ1枚のスタイルシートでも、クライアント側で'0'と'100'の設定を適切に変更するだけであらゆる場面に使い回しがきく。

19.3 読み上げ方式を指定するプロパティ(Speaking properties: 'speak')

'speak'
Value:  normal | none | spell-out | inherit
Initial:  normal
Applies to:  all elements
Inherited:  yes
Percentages:  N/A
Media:  aural

このプロパティは、テキストを音声出力するのか、もしするのならどういう方式なのか、を指定する(幾分'display'プロパティと似たようなところがある)。 使用可能な値は以下の通り:

none
音声出力をせず、時間もとらない。 ただし、子孫要素で値を上書きしてもよく、その場合上書きされた要素は出力される。 (子孫要素の出力をも確実に抑止するには'display'プロパティを利用するとよい)
normal
言語ごとの発音に従って当該要素とその子供要素を出力する。
spell-out
テキストのスペルを1文字ずつ発音する。 (頭字語や略語の再生に役立つ)

'volume'の値が'silent'となる場合と'speak'の値が'none'となる場合の相違に注意されたい。 前者は無音でも一時停止なども含めて通常と同じ時間量を喰うのに対し、後者は無音に加えて時間もとらない。(ただし子孫要素も飛ばされるとは限らない)

19.4 一時停止のプロパティ(Pause properties: 'pause-before', 'pause-after', and 'pause')

'pause-before'
Value: <time> | <percentage> | inherit
Initial: depends on user agent
Applies to: all elements
Inherited: no
Percentages: see prose
Media: aural
'pause-after'
Value: <time> | <percentage> | inherit
Initial: depends on user agent
Applies to: all elements
Inherited: no
Percentages: see prose
Media: aural

上記のプロパティは、要素の内容を再生する前後の一時停止を指定する。 各値は以下の様な意味を持つ:

<time>
絶対単位(秒やミリ秒)で一時停止の時間を表現する。
<percentage>
'speech-rate'の逆数に対する相対値。 たとえば、'speech-rate'の指定が毎分120語(1語につき半秒もしくは500ms)だとすると、100%の'pause-before'は500msの一時停止、20%の'pause-before'は100msの一時停止を意味することになる。

一時停止は要素の内容と'cue-before'もしくは'cue-after'の間に挿入される。

読み上げ速度の大幅な変化にも耐え得る強力なスタイルシートを作成したければ相対単位を利用すべきである。

'pause'
Value:  [ [<time> | <percentage>]{1,2} ] | inherit
Initial:  depends on user agent
Applies to:  all elements
Inherited:  no
Percentages:  see descriptions of 'pause-before' and 'pause-after'
Media:  aural

'pause'は簡略化プロパティで、'pause-before''pause-after'の値を1箇所で設定できる。 値が2つ与えらた場合、1つめの値が'pause-before'、2つめの値が'pause-after'に対応する。 値が1つだけの場合はそれが両方に適用される。

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 */

19.5 合図を入れるプロパティ(Cue properties: 'cue-before', 'cue-after', and 'cue')

'cue-before'
Value: <uri> | none | inherit
Initial: none
Applies to: all elements
Inherited: no
Percentages: N/A
Media: aural
'cue-after'
Value: <uri> | none | inherit
Initial: none
Applies to: all elements
Inherited: no
Percentages: N/A
Media: aural

要素の意味内容を区別するもう1つの方法として「音声アイコン」がある。 要素同士を区切るために、指定した要素の前後で音を再生することができるのである。 各値は以下の様な意味を持つ:

<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'
Value: [ <'cue-before'> || <'cue-after'> ] | inherit
Initial: not defined for shorthand properties
Applies to: all elements
Inherited: no
Percentages: N/A
Media: aural

'cue'は簡略化プロパティで、'cue-before''cue-after'の値を1箇所で設定できる。 値が2つ与えらた場合、1つめの値が'cue-before'、2つめの値が'cue-after'に対応する。 値が1つだけの場合はそれが両方に適用される。

以下の両規則は等価である:

H1 {cue-before: url("pop.au"); cue-after: url("pop.au") }
H1 {cue: url("pop.au") }

UAが(たとえばユーザの環境に何らかの原因があるために)音声アイコンを再生できない場合、別の手段で何らかの合図を送ることを推奨する。 (たとえば、警告メッセージをポップアップ表示するとか、警告音を鳴らしてみるなど)

内容を自動生成する別の方法については[12.1 :before及び:after疑似要素]を参照せよ。

19.6 ミキシングのプロパティ(Mixing properties: 'play-during')

'play-during'
Value: <uri> mix? repeat? | auto | none | inherit
Initial: auto
Applies to: all elements
Inherited: no
Percentages: N/A
Media: aural

'cue-before''cue-after'と同じ要領で、要素を再生している背後に流す音声を指定する。 各値は以下の様な意味を持つ:

<uri>
要素を再生している背後に<uri>で指定された先の音声を流す。
mix
このキーワードを指定すると、親要素の'play-during'から継承した音は流し続けたままにして、その上から<uri>で指定された音を重ねる。 このキーワードが指定されない場合、親要素の背景音は置き換えられる。
repeat
このキーワードを指定すると、要素の内容よりも背景音が先に終わってしまった場合に背景音を繰り返す。 このキーワードが存在しない場合、背景音は1度だけ再生されて止まる。 'background-repeat'と似たようなものである。 背景音が要素の内容に対して長すぎる場合、内容の再生が終了した時点で背景音の残りは切り落とされる。
auto
親要素の背景音を引き続き鳴らし続ける。 (値を継承した時のように頭から再生しなおすのではない)
none
背景音を使わない。 親要素に背景音が指定されている場合はそれも停止し、要素を通り過ぎたら再開するようにする。
BLOCKQUOTE.sad { play-during: url("violins.aiff") }
BLOCKQUOTE Q   { play-during: url("harp.wav") mix }
SPAN.quiet     { play-during: none }

19.7 音源の方向を調整するプロパティ(Spatial properties: 'azimuth' and 'elevation')

音源の方向というものは、音の表現力を考える上で非常に重要な要素である。 実生活においても、複数の声を区別するために、その声が聞こえてくる方向を利用するのはごく自然なことである(1室の同じ場所に皆が立っているなどどいうことは滅多にない)。 ステレオスピーカがあれば横からの音場を作り出せるし、両耳に装着するヘッドホンや徐々に普及してきた5スピーカの家内上映装置などは完全なサラウンド音を提供してくれる。 また、マルチスピーカ装置なら本物の3次元音場を作り出せる。 VRML2.0にも音源位置に関する事項が盛り込まれているので、遠からずこういった調整に対応したハードウェアが適当な価格で広く手に入るようになるだろう。

'azimuth'
Value: <angle> | [[ left-side | far-left | left | center-left | center | center-right | right | far-right | right-side ] || behind ] | leftwards | rightwards | inherit
Initial: center
Applies to: all elements
Inherited: yes
Percentages: N/A
Media: 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'の場合と同じ計算処理をする。

このプロパティは、同じ信号を複数のチャンネルに別音量で配分することにより実装される可能性が高いと思われる。 また、音場を錯覚させるために、音源のシフトやデジタル遅延、その他似たような技術を使うこともあるだろう。 しかし結局のところ、この効果を実現するための厳密な方法や、必要とされるスピーカの数などはUA依存である。 このプロパティは単に期待する最終結果を示しているにすぎない。

H1   { azimuth: 30deg }
TD.a { azimuth: far-right }          /*  60deg */
#12  { azimuth: behind far-right }   /* 120deg */
P.comment { azimuth: behind }        /* 180deg */

もし、音源の方向が指定されているにも関わらず出力装置が背後からの音を作り出せない場合、UAは後ろ半分の値を前半分の値に変換すべきである。 1つの例として次のようなやり方がある:

'elevation'
Value: <angle> | below | level | above | higher | lower | inherit
Initial: level
Applies to: all elements
Inherited: yes
Percentages: N/A
Media: aural

各値は以下の様な意味を持つ:

<angle>
音源の仰角を'-90deg'以上'90deg'以下の角度で指定する。 '0deg'は前方に水平な位置を表し、だいたいにおいて聞き手と音源が同じ高さであることを意味する。 '90deg'は真上を、'-90deg'は真下を意味する。
below
'-90deg'と等価。
level
'0deg'と等価。
above
'90deg'と等価。
higher
現在の仰角に10度加える。
lower
現在の仰角から10度差し引く。

この効果を実現するための厳密な方法や、必要とされるスピーカの数などはUA依存である。 このプロパティは単に期待する最終結果を示しているにすぎない。

H1   { elevation: above }
TR.a { elevation: 60deg }
TR.b { elevation: 30deg }
TR.c { elevation: level }

19.8 声の特性を指定するプロパティ(Voice characteristic properties: 'speech-rate', 'voice-family', 'pitch', 'pitch-range', 'stress', and 'richness')

'speech-rate'
Value: <number> | x-slow | slow | medium | fast | x-fast | faster | slower | inherit
Initial: medium
Applies to: all elements
Inherited: yes
Percentages: N/A
Media: aural

このプロパティは読み上げる速度を指定する。 絶対指定と相対指定のキーワードが両者とも使えることに注意しておくこと('font-size'と比較)。 各値は以下の様な意味を持つ:

<number>
読み上げる速度を1分あたりの単語数で指定する。 この基準は、言語ごとに幾分かの相違があるにも関わらず多くのスピーチシンセサイザが対応している。
x-slow
'80'と等価。
slow
'120'と等価。
medium
'180'から'200'程度までと等価。
fast
'300'と等価。
x-fast
'500'と等価。
faster
現在の速度に40加える。
slower
現在の速度から40差し引く。
'voice-family'
Value: [[<specific-voice> | <generic-voice> ],]* [<specific-voice> | <generic-voice> ] | inherit
Initial: depends on user agent
Applies to: all elements
Inherited: yes
Percentages: N/A
Media: aural

値はボイスファミリを優先順にコンマで区切ったリストである('font-family'と比較)。 各値は以下の様な意味を持つ:

<generic-voice>
ボイスファミリを指定する。 利用可能な値は'male'、'female'、'child'の3つ。
<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 }

声の具体名は引用符で括ってもよい。 と言うより実際は、その名前を構成する単語が識別子の構文規則に適合しない場合に、名前を引用符で括らなければならない。 また、ファミリ名が複数の単語から成る場合にも引用符で括ることを推奨する。 引用符を省略した場合、ファミリ名の先頭と末尾にある空白類文字は無視され、複数の連続する空白類文字は1つにまとめられる。

'pitch'
Value: <frequency> | x-low | low | medium | high | x-high | inherit
Initial: medium
Applies to: all elements
Inherited: yes
Percentages: N/A
Media: aural

話し声の平均ピッチ(平均振動数・周波数)を指定する。 これはボイスファミリに依存して様々な値になる。 たとえば、普通の男声の平均ピッチは約120Hzだが、女声だと大体210Hz程度である。

各値は以下の様な意味を持つ:

<frequency>
話し声の平均ピッチをHz(ヘルツ)単位で指定する。
x-low, low, medium, high, x-high
これらの値の意味はボイスファミリによって変化するので、絶対ピッチとの決まった対応関係は存在しない。 UAは、ボイスファミリとユーザの環境に応じて、これらの値に適切なピッチを対応させるべきである。 ただし、値の順序関係はこの通りに維持すること。 (つまり'x-low'は'low'よりも低周波にしてやるなど)
'pitch-range'
Value: <number> | inherit
Initial: 50
Applies to: all elements
Inherited: yes
Percentages: N/A
Media: aural

平均ピッチを基準とした抑揚の範囲を指定する。 人声の知覚ピッチは基本振動数によって決まり、概ね男声で120Hz、女声で210Hzといったところである。 また、人間言語というものは抑揚やピッチが様々に変化するが、この変化には言外の意味があったり、話の要点を伝える働きがあったりする。 したがって、非常に動きがある声(つまり抑揚が激しい声)ほどこの値は大きくなる。 このプロパティは、抑揚が変化し得る最大範囲(すなわち基本振動数が平均ピッチから外れてもよい許容範囲)を指定するものである。

各値は以下の様な意味を持つ:

<number>
'0'以上'100'以下の数値指定。 値が'0'だと棒読みで単調な声になり、'50'だと普通に抑揚が付く。 '50'以上だと動きがある声になる。
'stress'
Value: <number> | inherit
Initial: 50
Applies to: all elements
Inherited: yes
Percentages: N/A
Media: aural

声の音調曲線における「局所的な頂点」の高さを指定する。 たとえば、英語はアクセントが重要な役割を果たす言語であって、文章の別々の箇所に第1、第2、第3アクセントがそれぞれ割り当てられている。 'stress'の値はこういったアクセントの部分に現れる抑揚の量を制御する。 このプロパティは'pitch-range'と同類であり、Web開発者がより高度な音声表現を利用できるようにする。

各値は以下の様な意味を盛つ:

<number>
'0'以上'100'以下の数値指定。 値の意味は用いる言語によって異なる。 たとえば同じ'50'でも、普通の英語を普通のイントネーションとアクセントで話す男の声と、イタリア人の声とでは値の意味が違ってくる。
'richness'
Value: <number> | inherit
Initial: 50
Applies to: all elements
Inherited: yes
Percentages: N/A
Media: aural

話し声の豊かさ、あざやかさを指定する。 豊かな声というのは広い部屋にも「よく通る」声のことであり、(波形が)平坦すぎる声というのは逆に通りが悪い声のことを言う。

各値は以下の様な意味を持つ:

<number>
'0'以上'100'以下の数値指定。 値が大きいほど声の通りが良くなり、値が小さいほど軽くて流麗な声になる。

19.9 読み方のプロパティ(Speech properties: 'speak-punctuation' and 'speak-numeral')

読み方を指定するプロパティにはここに挙げるもの以外にspeak-headerがあるが、これについては[17 表について]で述べた。

'speak-punctuation'
Value: code | none | inherit
Initial: none
Applies to: all elements
Inherited: yes
Percentages: N/A
Media: aural

このプロパティは区切り文字の読み方を指定する。 各値は以下の様な意味を持つ:

code
セミコロンやブレースなどの区切り文字を文字通り発音する。
none
区切り文字は発音しないが、代わりに適宜一時停止を入れる。
'speak-numeral'
Value: digits | continuous | inherit
Initial: continuous
Applies to: all elements
Inherited: yes
Percentages: N/A
Media: aural

このプロパティは数字の読み方を指定する。 各値は以下の様な意味を持つ:

digits
数字を1桁ずつ別々に発音する。 つまり「237」は「に・さん・なな」と発音する。
continuous
数字をそのまま発音する。 つまり「237」は「にひゃくさんじゅうなな」と発音する。 もちろん読み方は言語によって様々である。


Last modified January 12, 1999.
Translated by Kazuteru OKAHASHI.
mailto:okahashi@nets.ne.jp