解説コードを読んでみよう
このサンプルでわかること
- ブラウザの音声合成機能(Web Speech API の
speechSynthesis)の使い方 - 読み上げる文章・言語・速さを指定する方法
- ブラウザがその機能に対応しているかを確かめる方法
使っているファイル
- index.phpデモのページ(HTML・JavaScript がすべてこの中)
1. いちばん短い読み上げプログラム
書き直す前のサンプルは、ページを開くと「こんにちは」と話すだけの、次の数行でした。音声合成の基本はこれで全部です。
var synthes = new SpeechSynthesisUtterance("こんにちは"); // 読み上げる内容
synthes.lang = "ja-JP"; // 日本語で
speechSynthesis.speak(synthes); // 読み上げる
SpeechSynthesisUtterance(発話)は「何を・どう読むか」をまとめた入れ物です。speechSynthesis.speak()にその入れ物を渡すと、ブラウザが読み上げます。
今のブラウザは、ユーザーがボタンを押すなどの操作をする前に勝手に音を出すことを制限しています。ページを開いただけで話させるのではなく、このデモのようにボタンを押したときに読み上げる作りにしましょう。
2. 画面を作る
文章を入れる欄、言語の選択、速さのスライダー、読み上げ・停止ボタンを用意します。
<div class="well">
<textarea id="text" rows="3" style="width:100%">こんにちは。今日もプログラミングを楽しみましょう。</textarea>
<p>
<label>言語:
<select id="lang">
<option value="ja-JP">日本語</option>
<option value="en-US">英語</option>
<option value="ko-KR">韓国語</option>
<option value="zh-TW">中国語(繁体字)</option>
</select>
</label>
<label>速さ:<input type="range" id="rate" min="0.5" max="2" step="0.1" value="1"> <span id="rate-val">1.0</span></label>
</p>
<button type="button" id="speak" class="btn-primary">読み上げる</button>
<button type="button" id="stop">止める</button>
</div>
<p id="speech-msg" class="alert alert-warning" hidden>このブラウザは音声の読み上げに対応していません。</p>
3. 対応しているブラウザか確かめる
'speechSynthesis' in window は「ブラウザに speechSynthesis という機能があるか」を調べる式です。ない場合はメッセージを出して、それ以上は何もしません。
(function() {
// 読み上げ機能があるか確認する
if (!('speechSynthesis' in window)) {
document.getElementById('speech-msg').hidden = false;
return;
}
4. ボタンが押されたら読み上げる
入力欄の文章で発話を作り、言語(lang)と速さ(rate)を設定してから読み上げます。前の読み上げが続いていると順番待ちになるので、先に cancel() で止めています。
var rate = document.getElementById('rate');
rate.addEventListener('input', function() {
document.getElementById('rate-val').textContent = Number(rate.value).toFixed(1);
});
document.getElementById('speak').addEventListener('click', function() {
// 読み上げる内容と設定をまとめた「発話」を作る
var synthes = new SpeechSynthesisUtterance(document.getElementById('text').value);
synthes.lang = document.getElementById('lang').value; // 言語
synthes.rate = Number(rate.value); // 速さ(1 が普通)
speechSynthesis.cancel(); // 読み上げ中なら止めてから
speechSynthesis.speak(synthes); // 読み上げる
});
document.getElementById('stop').addEventListener('click', function() {
speechSynthesis.cancel();
});
})();
| 設定 | 意味 | 値の例 |
|---|---|---|
lang | 読み上げる言語 | ja-JP 日本語、en-US 英語 |
rate | 速さ(1 が普通) | 0.5〜2 |
pitch | 声の高さ(1 が普通) | 0〜2 |
volume | 音量 | 0〜1 |
このサイトの「タイピング練習ゲーム」でも、お題を表示するときにこの機能で読み上げています。synthes.pitch = 1.5; を追加して、声の高さを変えてみましょう。