Web Speech APIによりブラウザ上で動作する音声認識・音声合成のアプリを作成します。

音声認識・音声合成アプリの作成

音声認識・音声合成アプリを次に示します。「音声認識」ボタンを押すと、音声認識が開始され、発話された音声がコンソールログに表示されます。発話された音声に「開始」もしくは「終了」が含まれているかを判断します。「音声合成」ボタンを押すと「まわります」が発話されます。

  • 10行目で「音声合成」ボタン、11行目で「音声認識」ボタンをそれぞれ作成します。
  • 15行目で「音声合成」ボタンを押したときに処理を記述します。18行目で「まわります」が発話されます。
  • 20行目で「音声認識」ボタンを押したときに処理を記述します。30行目で発話に「開始」が含まれているかを判断し、33行目で発話に「終了」が含まれているかを判断します。
  • 音声認識が終了すると42行目に制御が移され、再度音声認識を開始します。
  • 46行目で音声認識を開始します。

speech.html

<html>

  <meta charset="utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1" />
  <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"  />
  <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>

  <body>
    <h3>音声合成・音声認識デモ</h3>
    <button class="btn btn-primary" id="Synthesis">音声合成</button>
    <button class="btn btn-primary" id="Recognition">音声認識</button>

    <script>

      $("#Synthesis").click(function () {
        const uttr = new SpeechSynthesisUtterance("まわります");
        // 発言を再生 (発言キューに発言を追加)
        speechSynthesis.speak(uttr);
      });
      $("#Recognition").click(function () {

        const recognition = new webkitSpeechRecognition();
        recognition.lang = "ja-JP";
        recognition.continuous = true;
        recognition.onresult = function (event) {
          // omit
          console.log("onresult3! " + event.resultIndex);
          console.log("onresult2! " + event.results[event.resultIndex][0]
                  .transcript);
          if (event.results[event.resultIndex][0].transcript.includes(
                  '開始')) {
            console.log("start! ");
          } else if (event.results[event.resultIndex][0].transcript.includes(
                  '終了')) {
            console.log("stop! ");
          }

        };
        recognition.onspeechend = function (event) {
          console.log("onspeechend! " + event);
        };
        recognition.onend = function (event) {
          console.log("onend! " + event);
          recognition.start();
        };
        recognition.start();
      });

    </script>
  </body>

</html>

音声認識・音声合成アプリの実行

ブラウザから音声認識・音声合成アプリ「speech.html」をアクセスすると次のように表示されます。「音声合成」ボタンを押すと「まわります」が発話されます。「音声認識」ボタンを押して「開始して」や「終了して」を発話すると、コンソールログに表示されます。

音声合成時に次のエラーメッセージが発生する場合があります。
「 [Deprecation] speechSynthesis.speak() without user activation is no longer allowed since M71, around December 2018. See https://www.chromestatus.com/feature/5687444770914304 for more details」
これはユーザーのアクティブ化なしのspeechSynthesis.speak()は許可されないということで、ボタンのクリック操作が必要になります。

音声合成アプリの作成

音声合成アプリを次に示します。「テキスト読み上げ」をチェックして、マウスをテキスト上に移動させるとアンダラインが表示されます。同時に対応するテキストが発話されます。

  • 20-34行目で、テキスト上にマウスが置かれたときの処理を行い、35-41行目でテキスト上からマウスが移動したときの処理を行います。
  • 22行目や36行目で「テキスト読み上げ」がチェックされているかを判断します。
  • 27行目で「hover」クラスを追加し、6-7行目でアンダラインを表示します。

WebSpeech/index.html

<html>
<meta charset="utf-8" />
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>

<style>
  .speech.hover {
    text-decoration: underline !important;
  }
</style>

<body>
  テキスト読み上げ:
  <input class="switch__input" type="checkbox" id="js-speech-ctrl">ON

  <div class="speech"><br>TomoSoftでございます。</div>

  <div class="speech">ご連絡をいたします</div>

  <script>
    $('.speech').on('click mouseenter', function () {
      console.log('mouseenterされました!');
      if ($("#js-speech-ctrl").prop('checked')) {
        if (!window.speechSynthesis) {
          alert("このブラウザは音声合成に対応していません");
        }
        else {
          $(this).addClass("hover");
          n = new SpeechSynthesisUtterance;
          n.text = $(this).text();
          n.lang = "ja-JP"
          speechSynthesis.speak(n)
        }
      }
    })
    $('.speech').on('click mouseleave', function () {
      if ($("#js-speech-ctrl").prop('checked')) {
        console.log('mouseleaveされました!');
        $(this).removeClass("hover")
        speechSynthesis.cancel()
      }
    })
  </script>
</body>

</html>

音声合成アプリの実行

ブラウザから音声合成アプリ「indexhtml」をアクセスすると次のように表示されます。「テキスト読み上げ」をチェックし、マウスをテキスト上に置くとアンダラインが表示され、テキストの内容が発話されます。