音声認識と音声合成API
ホーム > 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);
}