Chromeで日本語音声認識して、しゃべらせてみる
http://blog.goo.ne.jp/xmldtp/e/0480f55d4ad3e6df568eae8336bc4d7c
では、chromeの機能を使ってしゃべらせたけど、AI Talk Web APIを使って
しゃべらせることを考える。
AI Talk Web APIは
https://www.ai-j.jp/cloud/webapi/
にあるけど、POST/GETで音声にしたい言葉をUTF-8エンコードで送ると、
音声のoggファイル等(wav,mp3とかもOK)がバイナリで返ってくるというもの。
なので、このデータをaudioタグで読み込めばよい。
具体的には、以下のかんじ
(赤字以外は、上記「Chromeで日本語音声認識して、しゃべらせてみる」のソースと同じ)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<title>Web Speech API</title>
<script>
//==============================//
// 変数宣言 //
//==============================//
var recognition; // 音声認識オブジェクト
var flag_speech; // 認識中フラグ 1 認識中
//==============================//
// 音声変換設定 //
//==============================//
function vr_function()
{
// 音声認識の設定
window.SpeechRecognition = window.SpeechRecognition || webkitSpeechRecognition;
recognition = new webkitSpeechRecognition();
recognition.lang = 'ja';
recognition.interimResults = true;
recognition.continuous = true;
//==============================//
// 認識開始 //
//==============================//
recognition.onsoundstart = function()
{
$("#status").text("認識中");
flag_speech = 1;
};
//==============================//
// エラー時 //
//==============================//
recognition.onerror = function()
{
$("#status").text("エラー");
// 再開する
vr_function();
};
//==============================//
// 音が終わった //
// 停止中または //
// 認識中でTimeout //
//==============================//
recognition.onsoundend = function()
{
// 認識データを取ってくる
var buf = $("#result_text").text();
// 今、表示しているだけだけど
// 本来は、ここに処理を書く
alert(buf);
// 今、読み込んだ内容を
// 単純に音声出力している
url = "http://webapi.aitalk.jp/webapi/v2/ttsget.php"
url = url + "?username=ここにユーザー名が入る";
url = url + "&password=ここにパスワードが入る";
url = url + "&speaker_name=reina";
url = url + "&text=" + encodeURIComponent(buf);
$("#voice").attr("src",url);
// もう一度はじめから
vr_function();
};
//==============================//
// 結果 //
//==============================//
recognition.onresult = function(event)
{
var buf = "";
// 結果データ入手
var results = event.results;
// 認識中のとき表示
if ( flag_speech == 1)
{
// 変換中に大幅に文字列が変わることがあるので
// はじめから作り直している
for (var i = event.resultIndex; i < results.length; i++)
{
buf = buf + results[i][0].transcript;
}
// 表示
$("#result_text").text(buf);
}
};
// 初期設定
$("#status").text("start");
flag_speech = 0;
$("#result_text").text(" ");
// 音声認識開始
recognition.start();
}
//==============================//
// 音声変換中断・終了 //
// 1回目で中断 //
// なにも話さず2回目で終了//
// 音認開始で再開 //
//==============================//
function vr_end()
{
recognition.stop();
$("#status").text("停止中");
flag_speech = 0;
}
//==============================//
// 初期設定 //
//==============================//
$(function()
{
$("#status").text("停止中");
$("#result_text").text(" ");
flag_speech = 0;
});
</script>
</head>
<body>
認識文字:<BR/>
<div id="result_text" style="width:400px;border:#A6523F solid 3px;"> </div>
<br/>
<input type="button" onClick="vr_function();" value="音認開始" />
<input type="button" onClick="vr_end()" value="停止" />
<BR/>
<div id="status"></div><BR/>
<audio id="voice" autoplay/>
</body>
</html>
|
赤字が今回のところ。音声を受け付けたらエンコーディングして、
URLをaudioのsrcにセットすると、結果が返ってきたとことでautoplayしてくれる。
getにしたら、同じことばを入れたら、キャッシュが返ってきてしまうけど、
同じ言葉なら同じ音声でOKのはずなので、問題ない。
ユーザー名、パスワードは、契約のものに入れ替える。
マッシュアップアワードやっている人は、それを入れる。
契約する人は、契約方法が上記ページに書いてある。