1. 소개 및 설계 목표
이 절은 비규범적입니다.
음성으로 정보를 제공하는 방식은 시각장애인, 저시력자, 또는 인쇄물 접근에 제약이 있는 사람들이 흔히 사용하는 방법입니다. 예를 들어, "스크린 리더"는 사용자가 평소에는 접근할 수 없는 시각적 인터페이스와 상호작용할 수 있게 해줍니다. 또한 듣는 것이 (읽는 것과 달리) 선호되거나, 때로는 반드시 요구되는 상황도 있습니다. 이는 정보 접근 능력과 관계없이 마찬가지입니다. 예시: 운전 중 전자책을 재생할 때, 산업·의료 장비 조작을 학습할 때, 가정용 엔터테인먼트 시스템과 상호작용할 때, 어린 아이들에게 읽기를 가르칠 때 등입니다.
이 Speech 모듈에서 정의한 CSS 속성들은 작성자가 문서의 음성 표현을 선언적으로 제어할 수 있게 해줍니다. 문서의 오럴 렌더링에는 음성 합성 ("TTS", 즉 "Text to Speech"의 약어로도 불림) 과 오디오 아이콘 (이 명세에서는 "오디오 신호"라고 함)이 결합됩니다. CSS Speech 속성을 통해 음성의 높낮이와 속도, 볼륨, TTS 음성 등 다양한 요소를 제어할 수 있습니다. 이러한 스타일 시트 속성들은 시각적 속성과 함께(혼합 미디어로) 사용할 수도 있고, 시각적 표현의 완전한 오럴 대안으로도 사용할 수 있습니다.
2. 배경 정보, CSS 2.1
이 절은 비규범적입니다.
CSS Speech 모듈은 설명용 CSS2.1 오럴 부록을 재구성한 것입니다. 이 부록에서는 aural 미디어 타입이 설명되어 있었지만, (현재는 speech 미디어 타입이 권장됨에 따라) 폐기되었습니다. 다만 [CSS2] 명세에서 speech 미디어 타입을 예약해두었으나 실제로 해당 속성들은 정의하지 않았습니다. Speech 모듈은 음성 출력에 적용되는 CSS 속성을 설명하며, 오럴 차원을 위한 새로운 “박스” 모델도 정의합니다.
콘텐츠 제작자는 텍스트 음성 변환 기능이 있는 사용자 에이전트를 위해 어떤 미디어 타입에든 CSS 속성을 포함시킬 수 있습니다. 하지만 일반적으로 all 및 screen에만 의미가 있습니다. Speech 모듈을 지원하지 않는 사용자 에이전트는 이러한 스타일을 무시합니다.
3. SSML과의 관계
이 절은 비규범적입니다.
이 명세의 일부 기능은 Speech Synthesis Markup Language (SSML) Version 1.1 [SSML]에서 설명된 기능과 개념적으로 유사합니다. 하지만 CSS 모델의 특성상 구문 및/또는 의미론적 측면에서 SSML과의 호환성은 부분적으로만 달성할 수 있습니다. Speech 모듈의 각 속성 정의에는 필요할 경우 SSML의 유사 기능과의 관계를 명확히 하기 위한 설명이 포함되어 있습니다.
3.1. 값 정의
이 명세는 CSS 속성 정의 관례를 따르며, [CSS2]와 값 정의 문법을 [CSS-VALUES-3]에서 가져옵니다. 이 명세에서 정의하지 않은 값 타입은 CSS Values & Units [CSS-VALUES-3]에서 정의됩니다. 다른 CSS 모듈과의 결합을 통해 이러한 값 타입의 정의가 확장될 수 있습니다.
각 속성 정의에 명시된 속성별 값 외에도, 이 명세에서 정의한 모든 속성은 CSS-전체 키워드도 속성 값으로 허용합니다. 가독성을 위해 명시적으로 반복하지 않았습니다.
4. 예시
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 포맷팅 모델은 시각적 박스 모델과 유사한 중첩 맥락 안에서 일어나는 일련의 소리와 정적(침묵) 시퀀스를 기반으로 합니다. 이를 오럴 “박스” 모델이라고 부릅니다. 오럴 “캔버스”는 2채널(스테레오) 공간과 시간적 차원으로 구성되며, 이 안에서 합성 음성과 오디오 신호가 함께 존재합니다. 선택된 요소는 rest, cue, pause 속성(가장 안쪽부터 바깥쪽 순서)으로 둘러싸여 있습니다. 이는 각각 padding, border, margin의 오럴 대응물로 볼 수 있습니다. ::before 및 ::after 의사 요소([CSS2])는 요소의 콘텐츠와 rest 사이에 삽입됩니다.
다음 다이어그램은 선택된 <element>에 적용되는 시각적 박스 모델과 오럴 박스 모델의 속성 간의 대응 관계를 보여줍니다:
6. 믹싱 속성
6.1. voice-volume 속성
이름: | voice-volume |
---|---|
값: | silent | [[x-soft | soft | medium | loud | x-loud] || <decibel>] |
초기값: | medium |
적용 대상: | 모든 요소 |
상속: | yes |
백분율: | N/A |
계산값: | silent, 또는 키워드 값(필요시 decibel 오프셋 포함, 0이 아닐 경우) |
표준 순서: | 문법 순서대로 |
voice-volume 속성은 작성자가 음성 합성기가 생성하는 오디오 파형의 진폭을 제어할 수 있게 하며, 오디오 신호의 상대적 볼륨 레벨을 선택한 요소의 오럴 박스 모델 내에서 조정할 때에도 사용됩니다.
참고: 이 속성의 기능은 SSML 마크업 언어의 prosody
요소의
volume
속성과 유사하지만,
몇 가지 중요한 차이점이 있습니다.
예를 들어 CSS Speech의 볼륨 키워드와 decibel 단위는 상호 배타적이지 않습니다. 이는 값이 상속 및 결합되는 방식에 기인합니다.
- silent
-
사운드가 생성되지 않음을 지정합니다(텍스트가 "조용히" 읽힙니다).
참고: 이는 음성 볼륨을 음의 무한대 데시벨로 지정한 것과 동일한 효과를 가집니다. 또한 voice-volume 속성 값이 silent인 요소와, speak 속성 값이 none인 요소는 차이가 있습니다. 전자의 경우, 선택한 요소는 실제로 소리가 나지는 않지만, 발화에 소요되는 시간 및 전후 일시정지가 그대로 유지됩니다. (그리고 선택한 요소의 오럴 박스 모델 내의 하위 요소는 voice-volume 값을 재정의할 수 있으므로 오디오 출력이 발생할 수 있습니다.) 후자의 경우, 선택 요소는 오럴 차원에서 렌더링되지 않으며, 재생을 위한 시간이 배정되지 않습니다. (하위 요소가 오럴 박스 모델 내에서 speak 값을 재정의하여 오디오 출력을 생성할 수 있습니다.)
- x-soft, soft, medium, loud, x-loud
- 이 키워드들은 점진적으로 커지는 볼륨 레벨에 해당하며, 청취자의 인지적 음량 요구에 맞는 구현 의존적 값에 매핑됩니다. 이러한 오디오 레벨은 사용자가 청각 환경에 맞게 사운드 옵션을 보정할 수 있도록 보통 환경설정 메커니즘을 통해 제공합니다. x-soft는 사용자의 최소 청취 가능 볼륨에, x-loud는 최대 허용 볼륨에, medium은 선호 볼륨에, soft와 loud는 중간값에 매핑됩니다.
- <decibel>
-
이는 위의 키워드 값, 또는 루트 요소의 기본값, 또는 상속된 볼륨 레벨(키워드 값과 decibel 오프셋의 조합일 수도 있으며, 이 경우 decibel 값은 누적됨) 대비 상대적인
(양/음) 변화를 의미합니다.
상속된 볼륨 레벨이 silent이면,
이 voice-volume도 지정된 <decibel> 값과 무관하게 silent로 해석됩니다.
<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 |
적용 대상: | 모든 요소 |
상속: | yes |
백분율: | N/A |
계산값: | 지정값이 -100 ~ 100 사이의 <number>로 해석됨 |
표준 순서: | 문법 순서대로 |
voice-balance 속성은 오디오 출력을 좌우 사운드 스테이지에 따라 공간적으로 분배합니다. 한 쪽 끝은 왼쪽, 다른 쪽 끝은 청취자의 위치를 기준으로 오른쪽입니다. 작성자는 좌/우 극단 사이의 중간 단계를 지정하여 좌우 축을 따라 오디오 분리도를 표현할 수 있습니다.
참고: 이 속성의 기능은 SSML 마크업 언어 [SSML]에는 해당하는 기능이 없습니다.
- <number>
- -100에서 100까지(포함) 숫자. -100 미만은 -100으로, 100 초과는 100으로 고정됩니다. -100은 왼쪽, 100은 오른쪽을 의미합니다. 0은 중앙값으로, 좌우의 오디오 분리도가 없는 상태입니다. (스테레오 시스템에서는 좌/우 스피커에 동일하게 신호가 분배됨)
- left
- -100과 동일.
- center
- 0과 동일.
- right
- 100과 동일.
- leftwards
- 상속된 voice-balance 값에서 20을 빼서(결과가 -100 미만이면 -100으로 고정) 소리를 왼쪽으로 이동시킴.
- rightwards
- 상속된 voice-balance 값에 20을 더해서(결과가 100 초과면 100으로 고정) 소리를 오른쪽으로 이동시킴.
사용자 에이전트는 다양한 오디오 믹싱 능력을 가진 여러 종류의 사운드 시스템에 연결될 수 있습니다. 모노, 스테레오, 서라운드 시스템에서의 동작은 다음과 같이 정의됩니다:
-
사용자 에이전트가 모노 사운드 시스템(스피커 1개)에서 오디오를 출력할 때, voice-balance 속성은 효과가 없습니다.
-
사용자 에이전트가 스테레오 사운드 시스템(예: 2개의 스피커, 헤드폰 등)에서 오디오를 출력할 때, 좌우 오디오 신호 분배는 voice-balance 속성에 지정된 값과 정밀하게 일치시킬 수 있습니다.
-
사용자 에이전트가 2개 이상의 채널(예: 5채널 서라운드, 중앙 채널 포함)로 오디오 신호를 믹싱할 수 있을 때, voice-balance 적용 결과의 물리적 분배는 기본 스테레오 레이아웃에서 소리가 들리는 것처럼 사용자가 인지하도록 이루어져야 합니다. 예를 들어 중앙 채널 및 좌/우 스피커를 모두 사용하여 center 값의 동작을 모방할 수 있습니다.
CSS Speech 모듈의 향후 개정에서는 3차원 오디오 지원이 포함될 수 있습니다. 이 경우 작성자는 “방위각(azimuth)” 및 “고도(elevation)” 값을 지정할 수 있게 됩니다. 즉, 현재 명세로 작성된 콘텐츠도 3차원 오디오를 지원하는 CSS Speech 버전과 호환될 수 있습니다. 이를 위해 현재 voice-balance 속성의 값은 “방위각” 각도와 호환되도록 설계되어 있습니다. 구체적으로, 현재 좌우 오디오 축(측면 사운드 스테이지)과 청취자 위치를 중심으로 한 360도 평면은 다음과 같이 매핑됩니다:
-
0 값은 0도(center)에 매핑됩니다. 이는 청취자의 "앞"에서 들리는 것으로, "뒤"가 아닙니다.
-
-100 값은 -40도(left)에 매핑됩니다. 음수 각도는 반시계 방향(위에서 볼 때)입니다.
-
100 값은 40도(right)에 매핑됩니다. 양수 각도는 시계 방향(위에서 볼 때)입니다.
-
-100 ~ 100 사이의 중간값들은 -40도 ~ 40도의 각도에 수치적으로 선형 비율로 매핑됩니다. 예를 들어 -50은 -20도에 해당합니다.
참고: 사운드 시스템이 사용자에 의해 구성되어 문서 작성자가 지정한 좌우 오디오 분배에 영향을 줄 수 있습니다. 현대 사운드 시스템의 다양한 “서라운드” 모드(기본 스테레오 포함)는 오디오 신호의 공간적 배열을 크게 바꿔놓는 경우가 많습니다. 3차원 사운드 스테이지의 환상은 일반적으로 위상 이동, 디지털 딜레이, 볼륨 조절(채널 믹싱) 등 여러 기술의 조합으로 달성됩니다. 일부 사용자는 모든 사운드를 단일 모노 채널로 강제하는 경우도 있는데, 이 경우 voice-balance 속성의 효과는 전혀 느껴지지 않습니다. 따라서 실제 렌더링의 충실도는 이러한 사용자 맞춤 설정에 따라 달라지며, voice-balance 속성은 원하는 결과만을 명시할 뿐입니다.
참고: 많은 음성 합성기는 모노 사운드만 생성하므로 voice-balance 속성을 본질적으로 지원하지 않습니다. 좌우 축의 사운드 분배는 합성 이후(음성 지원 사용자 에이전트가 문서 내 여러 오디오 소스를 믹싱할 때) 발생합니다.
7. 발화 속성
7.1. speak 속성
이름: | speak |
---|---|
값: | auto | never | always |
초기값: | auto |
적용 대상: | 모든 요소 |
상속: | yes |
백분율: | N/A |
계산값: | 지정된 값 |
표준 순서: | 문법 순서 |
speak 속성은 텍스트를 음성으로 렌더링할지 여부를 결정합니다.
참고: 이 속성의 기능은 SSML 마크업 언어 [SSML]에는 해당 기능이 없습니다.
- auto
-
display가 none일 때 계산값이 never가 되고,
그렇지 않으면 계산값이 auto가 됩니다.
계산된 auto의 사용값은 always와
동일하며, visibility가 visible일 때만 그렇고, 그렇지 않으면 never이 됩니다.
참고: none 값의 display 속성은 선택한 요소의 하위 요소에서 재정의할 수 없지만, auto 값의 speak 속성은 never 또는 always로 재정의할 수 있습니다.
- never
-
이 값은 요소(일시정지, 신호, 휴지, 실제 콘텐츠 포함)를 렌더링하지 않게 만듭니다(즉, 오럴 차원에서 아무 효과도 없음).
참고: 이 값이 적용된 요소의 하위 요소는 재정의가 가능하므로, 하위 요소는 display: none과 달리 오럴 렌더링에 참여할 수 있습니다. 단, 상위 요소의 일시정지, 신호, 휴지 속성은 오럴 차원에서 "비활성화"되며, 일시정지 축소나 인접 휴지의 누적 동작에 기여하지 않습니다.
- always
-
요소가 오럴로 렌더링됩니다
(display 값,
또는 상위 요소의 display 및 speak 값과 상관없음).
참고: 이 값을 사용하면 요소가 시각적 캔버스에는 렌더링되지 않아도 오럴에서는 렌더링될 수 있습니다.
7.2. speak-as 속성
이름: | speak-as |
---|---|
값: | normal | spell-out || digits || [ literal-punctuation | no-punctuation ] |
초기값: | normal |
적용 대상: | 모든 요소 |
상속: | yes |
백분율: | N/A |
계산값: | 지정된 값 |
표준 순서: | 문법 순서 |
speak-as 속성은 미리 정의된 가능성 목록을 기반으로 텍스트를 어떤 방식으로 오럴로 렌더링할지 결정합니다.
참고: 이 속성의 기능은 SSML 마크업 언어의 say-as
요소와 개념적으로 유사하며(가능한
값은 [SSML-SAYAS] W3C Note에 설명됨),
설계 목표는 비슷하지만 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-before 및 pause-after 속성
이름: | pause-before, pause-after |
---|---|
값: | <time> | none | x-weak | weak | medium | strong | x-strong |
초기값: | none |
적용 대상: | 모든 요소 |
상속: | no |
백분율: | N/A |
계산값: | 지정된 값 |
표준 순서: | 문법 순서 |
pause-before 및 pause-after 속성은 운율 경계를 지정합니다 (특정 길이의 정적(침묵)), 즉, 요소의 음성 합성 렌더링 전(또는 후)에 발생하거나, cue-before(또는 cue-after)가 지정된 경우에는 오럴 박스 모델(aural box model) 내에서 신호음 전/후에 발생합니다.
참고: 이 속성의 기능은 SSML 마크업 언어의 break
요소와 유사하지만,
CSS Speech의 pause 운율 경계 적용은 aural box model 내에서 별도의 고려사항(예: "축소된
일시정지")이 필요합니다.
- <time>
- 일시정지를 절대 시간 단위(초, 밀리초 등)로 지정합니다(예: "+3s", "250ms"). 0 이상 값만 허용됩니다.
- 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 (각 속성 참조) |
적용 대상: | 모든 요소 |
상속: | no |
백분율: | 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. 일시정지 축소
pause는 오럴 "박스"와 그 앞뒤 오럴 "박스" 사이의 최소 거리를 정의합니다. 인접한 pause는 가장 강한 명명된 단절과 가장 긴 절대 시간 구간을 선택하여 병합됩니다. 예를 들어, "strong"과 "weak"을 병합하면 "strong"이 선택되고, "1s"와 "250ms"를 병합하면 "1s"가 선택되며, "strong"과 "250ms"를 병합하면 두 값이 모두 적용됩니다.
다음의 pause들은 인접한 것으로 간주됩니다:
- 오럴 "박스"의 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 중 하나라도 다른 pause와 인접하면, 해당 pause와 인접한 것으로 간주됩니다.
참고: 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 |
적용 대상: | 모든 요소 |
상속: | no |
백분율: | N/A |
계산값: | 지정된 값 |
표준 순서: | 문법 순서 |
rest-before 및 rest-after 속성은 오럴 박스 모델 내에서 요소의 음성 합성 렌더링 전(또는 후)에 발생하는 운율 경계(특정 길이의 정적(침묵))를 지정합니다.
참고: 이 속성의 기능은 SSML 마크업 언어의 break
요소와 유사하지만,
CSS Speech의 rest 운율 경계 적용은 오럴 박스 모델 내에서 별도의 고려사항(예: 중간에 삽입된 오디오 신호, 인접 휴지의 누적 동작)이 필요합니다.
- <time>
- 휴지를 절대 시간 단위(초, 밀리초 등)로 지정합니다(예: "+3s", "250ms"). 0 이상 값만 허용됩니다.
- none
- 0ms와 동일. (음성 프로세서가 운율 경계를 생성하지 않음.)
- x-weak, weak, medium, strong, 그리고 x-strong
- 음성 출력에서 운율 경계의 강도로 휴지를 표현합니다. 정확한 시간은 구현에 따라 다릅니다. 값은 요소 간에 점진적으로(개념적으로 증가하는) 경계 강도를 나타냅니다.
일시정지 속성과 달리, 휴지는 요소의 콘텐츠와 cue-before, cue-after 내용 사이에 삽입됩니다. 인접 휴지는 누적 처리되며, 축소되지 않습니다.
9.2. rest 단축 속성
이름: | rest |
---|---|
값: | <'rest-before'> <'rest-after'>? |
초기값: | N/A (각 속성 참조) |
적용 대상: | 모든 요소 |
상속: | no |
백분율: | N/A |
계산값: | N/A (각 속성 참조) |
표준 순서: | 문법 순서 |
rest 속성은 rest-before 및 rest-after의 단축 속성입니다. 값이 두 개 주어지면 첫 번째 값은 rest-before, 두 번째 값은 rest-after에 적용됩니다. 값이 하나만 주어지면 두 속성 모두에 적용됩니다.
10. 신호음(cue) 속성
10.1. cue-before 및 cue-after 속성
이름: | cue-before, cue-after |
---|---|
값: | <uri> <decibel>? | none |
초기값: | none |
적용 대상: | 모든 요소 |
상속: | no |
백분율: | 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 값에 이미 dB 오프셋이 있는 경우, 오디오 신호에 대한 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 계산값이 voice-volume 속성에 적용되면 오디오 신호도 "강제로" 음소거됩니다 (즉, 오디오 신호 <decibel> 값과 무관하게).
voice-volume 속성의 볼륨 키워드는 저작 시점에 알 수 없는 요구사항(예: 청취 환경, 개인 선호도)에 맞춰 사용자가 조정합니다. 따라서 오디오 신호와 음성 합성의 음량 정렬을 달성하려면, 오디오 신호의 볼륨 레벨이(평균적으로, 음성 스트림의 변화로 인해 체감 음량이 달라질 수 있음) 해당 voice-family 기준 "일반적인" 청취 조건(기본 시스템 볼륨, 주파수 대역 균등화 기준)에서의 음성 합성 출력과 일치해야 합니다. 음성 프로세서는 합성된 TTS 오디오의 파형 진폭을 직접 제어할 수 있고, 사용자 에이전트도 오디오 신호의 볼륨 출력을 조정할 수 있으므로(즉, 디지털 사운드 클립의 내재적 파형 진폭에 따라 증폭/감쇠), 이를 통해 구현체는 오럴 박스 모델 내에서 TTS와 신호음 오디오 스트림의 음량을 사용자 조정 볼륨 레벨에 따라 관리할 수 있습니다 (정의된 키워드 참조).
지각된 오디오 특성(예: 음량)과 디지털 오디오 신호에 적용된 처리(예: 신호 압축) 간의 복잡한 관계로 인해, 감쇠는 일반적으로 데시벨 단위(0dB(최대 입력, 클리핑 임계치 근처)~ -60dB(완전 무음) 범위)로 표시되는 단순 시나리오를 가정합니다. 이 맥락에서 "표준" 오디오 클립은 이 값 사이에서 진폭이 오가며, 최고 피크는 왜곡을 피하기 위해 -3dB에 가깝고, 관련 청취 구간의 평균(RMS) 볼륨은 가능한 한 높게 설정합니다(너무 작으면 증폭 과정에서 배경 소음이 커짐). 이렇게 하면 사전 녹음 오디오와 TTS 출력이 자연스럽게 결합되어 전환 시 음량 차이를 느낄 수 없게 됩니다. 업계 표준이 존재하는 것은 아니지만, 서로 다른 TTS 엔진은 증폭/감쇠가 없을 때 비슷한 음량 신호를 생성하는 경향이 있습니다. 음성 및 부드러운 음악의 경우 -15dB RMS가 표준에 가깝습니다.
10.3. cue 단축 속성
이름: | cue |
---|---|
값: | <'cue-before'> <'cue-after'>? |
초기값: | N/A (각 속성 참조) |
적용 대상: | 모든 요소 |
상속: | no |
백분율: | 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 |
초기값: | 구현 의존 |
적용 대상: | 모든 요소 |
상속: | yes |
백분율: | N/A |
계산값: | 지정된 값 |
표준 순서: | 문법 순서 |
voice-family 속성은 콤마로 구분된 우선순위별 음성 구성 값 목록을 지정합니다. (이는 시각 스타일시트의 font-family와 유사합니다.) 각 구성 값은 일치 기준을 명시하여 음성 합성기 음성 인스턴스를 지정할 수 있습니다. 자세한 내용은 음성 선택 섹션을 참고하세요.
<generic-voice> = [<age>? <gender> <integer>?]
참고: 이 속성의 기능은 SSML 마크업 언어의 voice
요소와 유사하지만,
CSS Speech는 SSML의 정교한 음성 언어 선택과 동등한 기능을 제공하지 않습니다.
이 기술적 한계는 향후 Speech 모듈의 개정에서 해소될 수 있습니다.
- <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>
- 선호하는 음성 변형(예: "두 번째 남자 아이 음성")을 나타내는 정수입니다. 0을 제외한 양의 정수만 허용됩니다. 1 값은 모든 일치 음성 중 첫 번째를 의미합니다.
- preserve
- voice-family 값이 콘텐츠 마크업 내 언어가 바뀌더라도 상속 및 사용됨을 의미합니다. (아래 음성 선택 및 언어 처리 섹션 참고) 루트 요소에 적용할 경우 inherit와 동일하게 동작합니다. 참고: 해당 요소의 하위 요소는 preserve 값을 자동으로 상속받으며, 명시적으로 다른 voice-family 값(예: 이름, 성별, 연령)으로 재정의하지 않는 한 계속 유지됩니다.
잘못된 선언 예시:
voice-family: john/doe; /* 슬래시 문자는 이스케이프해야 함 */ voice-family: john "doe"; /* 식별자 시퀀스에 문자열을 포함할 수 없음 */ voice-family: john!; /* 느낌표는 이스케이프해야 함 */ voice-family: john@doe; /* "@" 문자는 이스케이프해야 함 */ voice-family: #john; /* 식별자는 해시 문자로 시작할 수 없음 */ voice-family: john 1st; /* 식별자는 숫자로 시작할 수 없음 */
11.1.1. 음성 선택, 콘텐츠 언어
voice-family 속성은 음성 합성기 음성 인스턴스 선택 지침으로 사용됩니다. 이 과정에서 음성 지원 사용자 에이전트는 선택한 요소의 마크업 콘텐츠 내 언어도 반드시 고려해야 합니다. "name", "gender", "age", 선호 "variant"(인덱스)는 콘텐츠 계층 구조를 따라 하위 요소로 상속되는 음성 선택 힌트입니다. 콘텐츠 구조 내 어느 시점이든 언어는 명시된 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"> 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 |
적용 대상: | 모든 요소 |
상속: | yes |
백분율: | 기본값 참조 |
계산값: | 키워드 값, 필요시(100%가 아니면) 키워드 기준 백분율도 포함 |
표준 순서: | 문법 순서 |
voice-rate 속성은 합성된 음성의 생성 속도를(분당 단어 수 기준) 조절합니다.
참고: 이 속성의 기능은 SSML 마크업 언어의 prosody
요소의 rate
속성과 유사하지만,
CSS Speech의 rate 키워드와 백분율 조정자는 상속 및 결합 방식 때문에 상호 배타적이지 않습니다.
- normal
- 현재 활성 음성의 음성 합성기가 생성하는 기본 속도입니다. 구현체 및 언어, 방언, 음성의 "성격"에 따라 달라집니다.
- x-slow, slow, medium, fast 및 x-fast
- 구현체별, 음성별로 정의되는 점진적으로 빨라지는 발화 속도 시퀀스입니다. 예를 들어 영어의 경우 보통 값(분당 단어 수)은 x-slow=80, slow=120, medium=180~200, fast=500 등입니다.
- <percentage>
-
0 이상의 백분율 값만 허용됩니다. 이는 위의 키워드 값, 루트 요소의 기본값, 또는 상속된 발화 속도(키워드와 백분율 조합일 수 있음, 이 경우 백분율은 곱셈으로 누적) 대비 변화량을 의미합니다. 예를 들어 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"와 다를 수 있음 (계산값은 동일해도 실제 값은 음성별로 다름) */
11.3. voice-pitch 속성
이름: | voice-pitch |
---|---|
값: | <frequency> && absolute | [[x-low | low | medium | high | x-high] || [<frequency> | <semitones> | <percentage>]] |
초기값: | medium |
적용 대상: | 모든 요소 |
상속: | yes |
백분율: | 상속값 참조 |
계산값: | 키워드만 지정된 경우 미리 정의된 피치 키워드 중 하나, 그 외에는 현재 voice-family 기반의 고정 주파수에 지정된 상대 오프셋(있는 경우)을 적용하여 계산된 절대 주파수 |
표준 순서: | 문법 순서 |
voice-pitch 속성은 생성된 음성 출력의 "기준선" 피치를 지정합니다. 이는 사용된 voice-family 인스턴스에 따라 달라지며, 음성 합성기마다 다를 수 있습니다 (출력의 평균 피치에 대략 해당). 예를 들어, 남성 음성의 일반적인 피치는 약 120Hz, 여성 음성은 약 210Hz입니다.
참고: 이 속성의 기능은 SSML 마크업 언어의 prosody
요소의
pitch
속성과 유사하지만,
몇 가지 중요한 차이점이 있습니다.
예를 들어 CSS Speech 피치 키워드와 상대 변화(주파수, 세미톤, 백분율)는 값이 상속 및 결합되는 방식 때문에 상호 배타적이지 않습니다.
- <frequency>
- 주파수 단위 값(헤르츠 또는 킬로헤르츠, 예: 100Hz, +2kHz). absolute 키워드가 지정된 경우 양수만 허용됩니다. 그렇지 않으면(absolute 키워드 미지정 시), 음수는 감소, 양수는 증가(상속값 기준)를 의미합니다. 예: 2kHz는 양의 오프셋(+2kHz와 동일), +2kHz absolute는 절대 주파수(2kHz absolute와 동일).
- absolute
- 지정 시 주파수 값이 절대값임을 나타냅니다. 음수 주파수를 지정하면 계산값은 0이 됩니다.
- <semitones>
- 상속값에 대한 상대 변화(감소 또는 증가)를 지정합니다. <semitones> 값은 단위 식별자 st (세미톤)가 붙은 차원이어야 함. 세미톤은 12평균율 크로매틱 스케일의 각 음 사이 간격에 해당. 세미톤은 연속된 두 피치 주파수 간의 차이로 정량화할 수 있습니다. 정확히 한 세미톤만큼 떨어진 두 주파수의 비율은 2의 12제곱근(약 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로 고정됩니다. 음성 지원 사용자 에이전트는 가능한 모든 주파수 값 대신 특정 범위만 지원할 가능성이 높습니다. 실제 값은 구현체별 최소/최대값으로 고정될 수 있습니다. 예: 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%; } /* "상속값의 1/4을 상속값에 더한다"와 동일 */ h6 { voice-pitch: +25%; } /* 위와 동일 */
11.4. voice-range 속성
이름: | voice-range |
---|---|
값: | <frequency> && absolute | [[x-low | low | medium | high | x-high] || [<frequency> | <semitones> | <percentage>]] |
초기값: | medium |
적용 대상: | 모든 요소 |
상속: | yes |
백분율: | 상속값 참조 |
계산값: | 키워드만 지정된 경우 미리 정의된 피치 키워드 중 하나, 그 외에는 현재 voice-family 기반의 고정 주파수에 지정된 상대 오프셋(있는 경우)을 적용하여 계산된 절대 주파수 |
표준 순서: | 문법 순서 |
voice-range 속성은 "기준선" 피치의 가변성, 즉 기본 주파수가 음성 출력의 평균 피치에서 얼마나 벗어날 수 있는지를 지정합니다. 생성된 음성의 동적 피치 범위는 감정이 풍부한 목소리(예: 억양 변화로 의미 강조)를 사용할수록 일반적으로 증가합니다. 보통, 낮은 범위는 평평하고 단조로운 목소리를, 높은 범위는 생동감 있는 목소리를 만듭니다.
참고: 이 속성의 기능은 SSML 마크업 언어의 prosody
요소의
range
속성과 유사하지만,
몇 가지 중요한 차이점이 있습니다.
예를 들어 CSS Speech 피치 범위 키워드와 상대 변화(주파수, 세미톤, 백분율)는 값이 상속 및 결합되는 방식 때문에 상호 배타적이지 않습니다.
- <frequency>
- 주파수 단위 값(헤르츠 또는 킬로헤르츠, 예: 100Hz, +2kHz). absolute 키워드가 지정된 경우 양수만 허용됩니다. 그렇지 않으면(absolute 키워드 미지정 시), 음수는 감소, 양수는 증가(상속값 기준)를 의미합니다. 예: 2kHz는 양의 오프셋(+2kHz와 동일), +2kHz absolute는 절대 주파수(2kHz absolute와 동일).
- absolute
- 지정 시, 주파수 값이 절대값임을 나타냅니다. 음수 주파수를 지정하면 계산값은 0이 됩니다.
- <semitones>
- 상속값에 대한 상대 변화(감소/증가, 단위: 세미톤)를 지정합니다.
- <percentage>
- 양수, 음수 백분율 값은 상속값 대비 증가(양수), 감소(음수)를 의미합니다.
계산값은 상속값에 지정된 비율만큼 더하거나 빼서 산출됩니다.
예: 상속값 200Hz에 50%(+50%)를 적용하면
200 + (200*0.5)
= 300Hz. -50%라면200-(200*0.5)
= 100Hz. - x-low, low, medium, high, x-high
- 구현 및 음성별로 정의되는 점진적으로 증가하는 피치 레벨 시퀀스. 해당 요소의 계산값이 키워드만 있는 경우(상대 오프셋 없음), 음성 변경 시 해당 절대 주파수도 재평가됨. 반대로 상대 오프셋이 적용되면 오프셋 지정 시점의 현재 음성을 기준으로 결과 주파수를 계산하므로, 계산 주파수는 스타일 계단식에서 이후 음성 변경에도 절대적으로 상속됨. 따라서, 음성 변경 시 키워드→실제 주파수 변환이 재평가되길 원할 때만 키워드 값을 사용하는 것이 좋음.
계산된 절대 주파수가 음수면 0Hz로 고정됩니다. 음성 지원 사용자 에이전트는 가능한 모든 주파수 값 대신 특정 범위만 지원할 가능성이 높습니다. 실제 값은 구현체별 최소/최대값으로 고정될 수 있습니다. 예: 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배 */ 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 |
적용 대상: | 모든 요소 |
상속: | yes |
백분율: | N/A |
계산값: | 지정된 값 |
표준 순서: | 문법 순서 |
voice-stress 속성은 강조의 강도를 조절합니다. 이 강조는 일반적으로 피치 변화, 타이밍 변화, 음량, 기타 음향적 차이의 조합으로 적용됩니다. 각 값의 정확한 의미는 발화 언어에 따라 달라집니다.
참고: 이 속성의 기능은 SSML 마크업 언어의 emphasis
요소와 유사합니다.
- 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 |
적용 대상: | 모든 요소 |
상속: | no |
백분율: | N/A |
계산값: | 지정된 값 |
표준 순서: | 문법 순서 |
voice-duration 속성은 선택한 요소의 콘텐츠가 렌더링되는 데 걸리는 시간을 지정합니다 (오디오 신호, 일시정지, 휴지는 포함하지 않음). auto 값이 지정되지 않는 한, 이 속성이 voice-rate 속성보다 우선하며, 음성에 적합한 발화 속도를 결정할 때 사용됩니다. voice-duration 속성이 auto가 아닌 값으로 지정된 요소는 하위에 voice-duration 및 voice-rate 속성이 지정되어 있어도 무시해야 합니다. 즉, 선택한 요소의 voice-duration에 <time>이 지정되면 해당 요소의 전체 하위 트리에 적용되며(자식이 속성을 재정의할 수 없음) 적용됩니다.
참고: 이 속성이 제공하는 기능은 SSML 마크업 언어의 prosody
요소의
duration
속성과 유사합니다 [SSML].
- auto
- 상속된 voice-rate로 발화 시 합성 음성의 지속 시간에 해당하는 사용값으로 해석됩니다.
- <time>
- 절대 시간 단위(초, 밀리초 등)로 값을 지정합니다(예: "+3s", "250ms"). 0 이상 값만 허용됩니다.
13. 목록 항목 및 카운터 스타일
list-style-type 속성은 [CSS2]에서 세 가지 유형의 리스트 항목 마커(글리프, 숫자 시스템, 알파벳 시스템)를 지정합니다. 이 속성에 허용되는 값들은 content 속성의 counter() 함수에도 사용됩니다. CSS Speech 모듈은 이러한 스타일을 음성 합성을 통해 오럴 차원에서 어떻게 렌더링할지 정의합니다. list-style-image 속성([CSS2])은 무시되며, 대신 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 마크업 언어의 sub
요소의
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 Generated and Replaced Content 모듈 [CSS3GENCON]에서 확인할 수 있습니다.
15. 발음, 음소
이 절은 비규범적입니다.
CSS는 마크업 문서 내 특정 텍스트의 발음(명확하게 정의된 음운 알파벳으로 표현됨)을 정의하는 방법을 명시하지 않습니다. 본 명세의 이전 초안에서는 "phonemes" 속성이 설명된 바 있으나, 이는 내용과 표현의 분리 원칙을 깨뜨린다는 이유로 반대 의견이 제기되었습니다. ("phonemes"를 오럴 CSS 스타일시트 내에 작성하면, 마크업 문서 내 텍스트가 바뀔 때마다 이를 업데이트해야 했음) 따라서 "phonemes" 기능은 CSS(표현 레이어) 범위 밖으로 간주되며, 마크업/콘텐츠 레이어에서 다뤄야 합니다.
"pronunciation" rel
값은
link
요소를 사용하여 HTML 문서에 발음 사전을 포함할 수 있게 해줍니다
(CSS 스타일시트 포함 방식과 유사).
W3C PLS(발음 사전 명세, Pronunciation Lexicon Specification) [PRONUNCIATION-LEXICON]은
이러한 사전을 기술하는 데 사용할 수 있는 포맷 중 하나입니다.
또한, 마크업 내에서 속성 기반 메커니즘을 사용해 텍스트-발음 연계를 작성할 수도 있습니다. 작성 시점 기준, 이런 메커니즘은 W3C HTML 표준에 공식적으로 정의되어 있지 않습니다. 하지만 EPUB 3.0 명세는 (x)HTML5 문서가 [SSML] 명세에서 파생된 속성을 포함하여, 특정 음운 알파벳 기반으로 텍스트 발음을 설명할 수 있도록 허용합니다.
용어집
이 모듈에서 사용된 용어와 약어는 다음과 같습니다.
- UA
- user agent
-
사용자를 대신하여 CSS 스타일시트를 읽거나 쓸 수 있는 프로그램으로, 다음 두 범주 중 하나 또는 모두에 해당함: 문서(documents, 예: 브라우저)를 렌더링하는 프로그램, 스타일시트를 작성하는 프로그램(예: 에디터). UA는 둘 모두에 해당할 수도 있음. (스타일시트를 읽거나 쓰는 다른 프로그램도 있으나, 이 모듈은 그에 대한 규칙을 제공하지 않음.)
- document
-
요소와 속성으로 이루어진 트리 구조의 문서. 예: SGML, XML 문서 [XML11].
- style sheet
부록 D — 감사의 글
편집자들은 본 명세 준비에 도움을 준 W3C Voice Browser 및 CSS 작업 그룹의 모든 멤버에게 감사를 표합니다. 특히, Ellen Eide(IBM)의 상세한 의견과 Elika Etemad(Fantasai)의 꼼꼼한 리뷰에 특별히 감사드립니다.
부록 E — 변경 이력
다음 변경 사항은 2012년 후보 권고안 이후 이루어졌습니다:
- speak의 none 및 normal 값을 더 명확히 하기 위해 각각 never와 always로 이름을 변경함. Issue 510 참조.
- speak의 auto 값이 visibility에 반응하도록 변경함. Issue 511 참조.
이 외에도 몇몇 사소한 편집상의 수정이 있었으며, 소스가 Bikeshed 형식으로 변환되었습니다.