音声認識と音声合成API

もくじ > Web開発ノート > リッチサイト+JavaScript

音声認識や音声合成を実現するAPIは色んな企業から様々なサービスが提供されていますが、基本的には有料で、商用や不特定多数の閲覧がある場での公開には、かなり厳しい条件がついてまわります。

しかし、標準的なブラウザが持っているWeb Speech APIという機能を使えば、追加のライブラリや有料APIを契約しなくても、JavaScriptだけで、音声合成や音声認識を実装できるようになっています。

この機能はまだ実験段階で、仕様がまだ確定ではなく、音声認識についてはほとんどGoogle Chromeでしか動きません。

音声合成については、主要なブラウザの最新バージョンでは殆どが対応しており、視覚障害のある方へのサポートや、発音勉強のためのレベルでの音声合成を考えているようでしたら、十分に使えるものだと思います。

公式仕様ページ
音声認識対応状況
音声合成の対応状況

Web Speech APIで音声合成を使う

音声を再生する

var synth = window.speechSynthesis;
var utterance = new SpeechSynthesisUtterance();

//話す内容をテキストで指定
utterance.text = 'I like playing with dogs on holidays';

//言語を指定
utterance.lang = 'en-US';

//話す速度(0.5 ~ 2.0)
utterance.rate = 1.0;

//話すピッチ(0 ~ 2.0)
utterance.pitch = 1.0;

//音声を再生
synth.speak(utterance);

選択できる言語などを確認する

指定できる言語はブラウザ環境に依存します。以下のようにgetVoice()で選択可能な設定を取得できます。

voices = synth.getVoices();
for(i = 0; i < voices.length ; i++) {
 console.log(voices[i].lang);//言語
 console.log(voices[i].name);//設定名
 console.log(voices[i].default);
 console.log(voices[i].localService);
 console.log(voices[i].voiceURI);
}

Web Speech APIで音声認識させる

マイクからの音声をテキストにして出力

//プレフィックスのない将来的なサポートへの対応
var SpeechRecognition = SpeechRecognition || webkitSpeechRecognition
var SpeechGrammarList = SpeechGrammarList || webkitSpeechGrammarList
var SpeechRecognitionEvent = SpeechRecognitionEvent || webkitSpeechRecognitionEvent

//認識する文法を定義
var fruits = ['apple','strawberry','orange','coconut','cherry','banana','peach','lemon'];
var grammar = '#JSGF V1.0; grammar fruits; public <fruits> = ' + fruits.join(' | ') + ' ;'

//文法をセットする
var recognition = new SpeechRecognition();
var speech_RecognitionList = new SpeechGrammarList();
speech_RecognitionList.addFromString(grammar, 1);

//プロパティの設定
recognition.grammars = speech_RecognitionList;
recognition.continuous = false;
recognition.lang = 'en-US';
recognition.interimResults = false;
recognition.maxAlternatives = 1;

//クリックイベントなどでマイクから音声入力開始
$("#start").click(function () {
 recognition.start();
}

//認識結果の受け取り
recognition.onresult = function(event) {
 var res = event.results[0][0].transcript;
 //resに音声が認識した単語が入ります。
 alert(res);
}

エラーチェックや判定など

//処理が終了した時
recognition.onspeechend = function() {
 recognition.stop();
}

//認識できなかった場合
recognition.onnomatch = function(event) {
 alert('認識できませんでした');
}

//エラーの受け取り
recognition.onerror = function(event) {
 alert(event.error);
}

文法形式について(JSpeech Grammar Format)
公式仕様ページ