トピックを検索
ナレーションが途切れず、音声解説が入りきらない動画
冷ます時間と注ぎ方のカードが出ている間も焙煎店の店主が話し続けるため、音声解説版は最初のカードしか解説できず、動画も止まらない
問題
動画が見えない人には最初の分量しか伝わらず、冷ます時間も注ぐのを止めるタイミングも分からない
コーヒー焙煎店の淹れ方動画には音声解説版ができ、プレーヤーの下の「音声解説」ボタンで選べるようになりました。その後、店主が話しながら進める版が加わりました。最初のカード「豆15 g・お湯250 ml」が出ている間、店主は「このくらい量ります」と言って間を空け、その間に解説が分量を読み上げます。ところが次の2枚では、店主は話し続けます。「お湯は少し置きます。沸かしたてだと、粉が焦げてしまうんです」、続けて「ゆっくり注いで、ここで止めます。細く注いで、粉がふくらんで落ち着くのを待ちます」。カードには「沸騰後、30秒冷ます」「3回に分けて注ぐ・3:00で止める」と出ていますが、店主が一息つく前に消えてしまいます。解説を入れる間がないため、音声解説版はこの2枚について何も言いません。映像なしで聞く人には豆の量は伝わりますが、どれだけ待つのか、いつ止めるのかは伝わりません。
レベルAAAの達成基準1.2.7は、動画の話し声の間が短すぎて、音声解説では動画の内容を伝えきれない場合を扱います。そのときに求めるのが拡張音声解説です。解説の間は動画を一時停止するか映像を止めておき、解説が終わったら再生を続けます。この動画がまさにその場合です。最初のカードの後、ナレーションの間は1秒に満たず、カードの解説にはおよそ2秒から4秒かかります。解説を早口にしたり「ケトルがある」まで削ったりすれば、カードが伝えるはずの時間と分量が失われます。音声解説版は、間に入れるだけの解説としてはできる限りのことをしていますが、そこで尽きています。ページにも、時間を作る仕組みはありません。動画は止まらず、ほかの版もありません。ブラウザーにもその機能はありません。video 要素は一つの音声を動画と同じ速さで流すだけなので、映像を待たせるには、解説をファイルに書き込んでおくか、スクリプトで動画を一時停止して流す必要があります。
耳で動画を追う人は、誰でも同じ問題にぶつかります。ケトルから目を離せない人もそうです。話しながら進めるナレーションは聞きやすく、役立つ話も多いのですが、その分、解説が入る間がなくなります。
10グループ中3グループに影響
- 全盲 (影響あり)
- 弱視 (影響あり)
- 色覚 (影響なし)
- ろう (影響なし)
- 難聴 (影響なし)
- 発話 (影響なし)
- 手の操作 (影響なし)
- 筋力・可動域 (影響なし)
- 認知 (影響あり)
- 光過敏 (影響なし)
- 視覚を使わない 解説が入るのは「コーヒー豆15グラム、お湯250ミリリットル」の一度だけです。その後は店主が話し続けるため、冷ます時間、3回に分けて注ぐこと、3分で止めることは一度も言われません。
- 視覚が限られる カードは店主が話す間の5秒ほどしか表示されません。拡大鏡でゆっくり読む人や、小さなスマートフォンで見る人は、読み終わる前に消えてしまいます。拡張版で映像が止まる間は、読む時間にもなります。
- 言語・認知・学習の能力が限られる 手順を耳でも聞けると、文字より話し言葉のほうが分かりやすい人や、母語以外で見ている人の助けになります。音声解説版で読み上げられるのは分量だけで、冷ます時間と注ぎ方は、それぞれ5秒ほど画面に出るだけです。
axeには音声解説のチェックがありません。EaseWebの診断は、すべての動画を人が確認する項目として挙げ、そばに音声解説の操作やdescriptionsトラックがあるかも記録します。そのため、この例の音声解説版は見つかり、合格に見えます。解説が収まっているか、何が抜けているかは、聞いてみないと分かりません。自動チェックは映像と音声を比べることも、話し声の間とまだ言うべき内容を照らし合わせることもできません。AIツールは音声の無音部分を見つけたり、フレームから解説の下書きを作ったりできます。それでも、視聴者が何を聞き逃すか、どこで映像を待たせるかは、内容を知る人が決める必要があります。
試してみる
映像を隠し、音声解説をオンにして動画を再生してみましょう。お湯は何秒冷ましますか?
スイッチをオンにすると映像が隠れ、見えない人と同じ状態になります。プレーヤーの操作はそのまま使えます。「音声解説」ボタンはプレーヤーの下にあり、音声の内容は動画の下に書いてあります。
修正を適用すると、解説の間は映像を止めておく拡張版や、端末の声で解説を読み上げ、間に収まらないときに一時停止するプレーヤーを試せます。
問題あり 修正できますか?
ハウスブレンドの淹れ方
店主が話しながら説明します・待ち時間は短縮しています。
音声の内容
- ナレーション:当店のハウスブレンドの淹れ方です。
- ナレーション:このくらい量ります。
- ナレーション:お湯は少し置きます。沸かしたてだと、粉が焦げてしまうんです。
- ナレーション:ゆっくり注いで、ここで止めます。細く注いで、粉がふくらんで落ち着くのを待ちます。
- [キッチンタイマーの音]
修正方法
解説している間は、映像を止めておく
<video id="brew-video" controls preload="metadata" src="brew-talk.webm" poster="brew-talk.jpg" data-described="brew-talk.described.webm"> <track kind="captions" srclang="ja" label="日本語" src="brew-talk.ja.vtt" data-described="brew-talk.described.ja.vtt"></video><button type="button" id="describe" aria-pressed="false"> 音声解説</button> <script> const video = document.getElementById('brew-video'); const track = video.querySelector('track'); const plain = { video: video.getAttribute('src'), captions: track.getAttribute('src') }; document.getElementById('describe').addEventListener('click', (event) => { const button = event.currentTarget; const on = button.getAttribute('aria-pressed') !== 'true'; const { currentTime, paused, playbackRate } = video; const captions = track.track.mode; video.src = on ? video.dataset.described : plain.video; track.src = on ? track.dataset.described : plain.captions; // 同じ位置、同じ速度で、字幕も元の表示のまま続ける。 video.addEventListener('loadedmetadata', () => { video.currentTime = currentTime; video.playbackRate = playbackRate; track.track.mode = captions; if (!paused) video.play(); }, { once: true }); button.setAttribute('aria-pressed', String(on)); });</script>問題点3点
ボタンと切り替えは正しく、最初の解説も正しく入っています。どこで解説が尽きるかは、音声解説版の字幕ファイルに表れています。
- 最初のカードの後は、ナレーションが終わって0.5秒もしないうちに次のナレーションが始まり、解説を入れる間がありません。
- そのため音声解説版は、「沸騰後、30秒冷ます」も「3回に分けて注ぐ・3:00で止める」も言いません。
- 時間を作るために動画が止まることはなく、拡張版も用意されていません。
映像を止めておく拡張版
<video id="brew-video" controls preload="metadata" src="brew-talk.webm" poster="brew-talk.jpg" data-described="brew-talk.extended.webm" data-holds="[[15.22, 2.54], [21.06, 3.82]]"> <track kind="captions" srclang="ja" label="日本語" src="brew-talk.ja.vtt" data-described="brew-talk.extended.ja.vtt"></video><button type="button" id="describe" aria-pressed="false"> 音声解説</button> <script> const video = document.getElementById('brew-video'); const track = video.querySelector('track'); const plain = { video: video.getAttribute('src'), captions: track.getAttribute('src') }; // 拡張版が映像を止める位置:元の動画での時刻と、止める秒数。 const holds = JSON.parse(video.dataset.holds); const toExtended = (time) => time + holds .filter(([at]) => at < time) .reduce((sum, [, held]) => sum + held, 0); const toOriginal = (time) => { let shift = 0; for (const [at, held] of holds) { if (time < at + shift) break; // 止めている途中なら、止め始めた位置に戻す。 shift += Math.min(held, time - at - shift); } return time - shift; }; document.getElementById('describe').addEventListener('click', (event) => { const button = event.currentTarget; const on = button.getAttribute('aria-pressed') !== 'true'; const { currentTime, paused, playbackRate } = video; const captions = track.track.mode; video.src = on ? video.dataset.described : plain.video; track.src = on ? track.dataset.described : plain.captions; // 同じ位置、同じ速度で、字幕も元の表示のまま続ける。 video.addEventListener('loadedmetadata', () => { video.currentTime = on ? toExtended(currentTime) : toOriginal(currentTime); video.playbackRate = playbackRate; track.track.mode = captions; if (!paused) video.play(); }, { once: true }); button.setAttribute('aria-pressed', String(on)); });</script>修正の手順4ステップ
- 音声解説版を編集し直して、拡張版を作ります(W3Cの達成方法G8)。解説を入れる間がない所では、解説する内容がまだ映っているフレームで映像を止め、映像を止めたまま解説を流し、その後に動画を再開させます。この例では、2枚目と3枚目のカードで店主が話し終えた直後に、それぞれ2.54秒と3.82秒、映像を止めています。
- 専用の字幕ファイルを用意し、各解説を「解説」と示して、聞こえる時刻に入れます。
- 「音声解説」ボタンが切り替える先を、音声解説版から拡張版のファイルに替えます。
- 映像を止める位置を
videoのdata-holdsに書いておきます。拡張版は長いため、同じ場面でも時刻が後ろにずれます。スクリプトはこの一覧で、一方のファイルの再生位置をもう一方の同じ場面に換算します。
これで修正前の例は直り、1.2.7を満たします。解説は録音なので、どのブラウザーでも同じように聞こえます。ファイルはどのプレーヤーでも再生でき、音声解説の機能を持たない動画サービスにもそのまま上げられます。
どちらも1.2.7を満たします。選ぶなら拡張版です。どのブラウザーでも、ファイルを上げられるどの動画サービスでも働き、解説は解説者の録音された声で、字幕にも入ります。一時停止するプレーヤーは、解説が読まれるかどうかが視聴者の端末次第なので、それだけでは足りません。解説をよく書き換える場合や、拡張版のそばに置く軽い選択肢として加え、これだけに頼らないでください。
動画を再生する場所によって、拡張版の届け方が変わります。
- 自分の
<video>:上の例のように、拡張版のファイルとボタンを用意するか、テキストの解説を読み上げ、収まらないときに一時停止するボタンを用意する。ボタンは字幕の操作の隣に置き、音量と同じように押しやすくする。操作バーに字幕のボタンがない動画プレーヤーの修正と同じ。 - YouTubeやVimeoなどの動画サービス:サービスが音声解説の音声トラックを受け付ける場合も、そのトラックは動画と同じ速さで流れ、映像を止められない。拡張版を別の動画として上げ、埋め込みのすぐそばに、何かが分かる名前(「拡張音声解説付き」)でリンクする。
- アクセシブルなプレーヤー:Able Playerは
kind="descriptions"のトラックを読み上げ、その間は動画を一時停止でき(data-desc-pause-default="on"、または視聴者自身の設定)、音声合成が使えないときは文をライブリージョンに入れる。Kalturaのプレーヤーにも、WebVTTのファイルのキューごとに一時停止し、解説を音声、画面上の文、またはその両方で示すプラグインがある。使うプレーヤーが実際に何をするかを確かめてから頼る。
映像を止めるのは、ナレーションに間がない所だけにします。この例の最初のカードのように、間に収まる解説は間に入れ、動画は止めません。止めるたびに、視聴者はその分だけ待たされます。1.2.7の解説書も、拡張音声解説は、それがなければ動画の内容が伝わらない場合にだけ使うとしています。止めるのは、解説する内容がまだ映っているフレームにし、解説は止め始めた直後から流して、次のナレーションに重ならないようにします。
拡張版は元の動画より長いため、途中で切り替えた視聴者は、同じ秒数ではなく同じ場面に戻る必要があります。上のスクリプトは、止めた時間の分を換算しています。ほかの編集も加えた場合は、すべての時刻の対応表を持たせるか、最初から再生します。字幕ファイルにも、解説と新しい時刻が要ります。最初に止める位置より後は、すべての時刻がずれるからです。
一時停止するプレーヤーでは、音声合成の声とスクリーンリーダーは別々の声です。解説の途中で視聴者がページ内を移動すると、両方が同時に話します。プレーヤーの側には、スクリーンリーダーが話しているかを知る手段がありません。
最初のカードのように間が十分あるなら、通常の音声解説版で足ります。音声解説がなく、画面の情報が伝わらない動画で扱っています。
修正の確認
4項目、マウス不要
確認方法: 画面を見ずに視聴、キーボード、スクリーンリーダー
OS、ブラウザーと支援技術のバージョン、ビルド、実施日、各手順の実際の結果を記録してください。動画、ナレーション、解説を差し替えた際は、再度確認します。
制限
これは出発点となる実装例であり、すべてのアプリケーションでの適合を保証するものではありません。動画に拡張音声解説が必要か、各解説で何を言うべきかは動画によって決まり、このガイドが代わりに判断することはできません。拡張音声解説はレベルAAAのため、WCAGのレベルAAを基準とする多くの法令や方針では求められていません。それでも、映像なしで内容が伝わる方法がこれしかない動画もあります。実際に聞く人と一緒に、動画が実際に再生されるプレーヤーやサービスで、一連の流れ全体を試してください。
よくある問題を再現した学習用のサンプルです。実在のクライアントの診断結果ではありません。コードは出発点となる実装例のため、実際の製品でも確認してください。ここでは支援技術でのテスト結果は報告していません。
EaseWebのサービス
修正した問題を、次のリリースで再発させない
このガイドのような修正方法を、コーディングエージェントが従うルールと、CIのチェックに組み込みます。あわせて定期的に、キーボードとスクリーンリーダーで手動の再テストを行います。