初級 JavaScript Web Speech API 音声合成

ブラウザに文章を読み上げさせる

入力した文章を、ブラウザの音声合成機能(Web Speech API)で読み上げます。たった数行で、言語や速さを変えて声を出せます。

このサンプルは2017〜2018年ごろに作成したものです。PHPのバージョンが上がり、そのままでは動かなくなっていたため、2026年に PHP 8.3 で動くように書き直し、解説も新しくしました。

DEMO 実際に動かしてみよう

文章を入力して「読み上げる」を押すと、ブラウザが声に出して読みます。音が出るので音量に注意してください。

解説コードを読んでみよう

このサンプルでわかること

  • ブラウザの音声合成機能(Web Speech API の speechSynthesis)の使い方
  • 読み上げる文章・言語・速さを指定する方法
  • ブラウザがその機能に対応しているかを確かめる方法

使っているファイル

  • index.phpデモのページ(HTML・JavaScript がすべてこの中)

1. いちばん短い読み上げプログラム

書き直す前のサンプルは、ページを開くと「こんにちは」と話すだけの、次の数行でした。音声合成の基本はこれで全部です。

いちばん短い例 JavaScript
var synthes = new SpeechSynthesisUtterance("こんにちは");  // 読み上げる内容
synthes.lang = "ja-JP";                                     // 日本語で
speechSynthesis.speak(synthes);                             // 読み上げる
  • SpeechSynthesisUtterance(発話)は「何を・どう読むか」をまとめた入れ物です。
  • speechSynthesis.speak() にその入れ物を渡すと、ブラウザが読み上げます。

今のブラウザは、ユーザーがボタンを押すなどの操作をする前に勝手に音を出すことを制限しています。ページを開いただけで話させるのではなく、このデモのようにボタンを押したときに読み上げる作りにしましょう。

2. 画面を作る

文章を入れる欄、言語の選択、速さのスライダー、読み上げ・停止ボタンを用意します。

index.php(13〜30行目) HTML
<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 という機能があるか」を調べる式です。ない場合はメッセージを出して、それ以上は何もしません。

index.php(32〜37行目) JavaScript
(function() {
    // 読み上げ機能があるか確認する
    if (!('speechSynthesis' in window)) {
        document.getElementById('speech-msg').hidden = false;
        return;
    }

4. ボタンが押されたら読み上げる

入力欄の文章で発話を作り、言語(lang)と速さ(rate)を設定してから読み上げます。前の読み上げが続いていると順番待ちになるので、先に cancel() で止めています。

index.php(39〜57行目) JavaScript
    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; を追加して、声の高さを変えてみましょう。

↑