現状、Androidで使える音声認識といえば「RecognizerIntent(SpeechRecognizer)」、「Julius」。
SATCHとこの3つを使ってインターラクティブ性のあるアプリを作ってみます。
まずは、「RecognizerIntent」です。
サンプルでは、起動の前後のAR認識や、意味解釈の部分は端折って、音声認識のみやってます。
サンプルに簡単な意味解釈機能を入れてみました。現在地を教えてくれます。
まだそんなに賢くないので、あんまり難しくしゃべりかけると分かってくれませんが(^^).
機能は順次追加していきます。
キャラクターとして初音ミクさんを使ってみます。表情はただの2Dです。3Dの表情作成やリップシンクのよさげなエンジンが出てきたら切り替えます。
モーションは入れていません。モーションを2Dで入れるとRecognizerIntentからSATCHに復帰する際にどえらく時間がかかるので...。
音声はoggで都度出しています。
N2などの音声合成エンジンだと、ちと味気ないですし。
N2 TTSは現在地住所読み上げで使ってみました。
追加
音声認識の結果をダイアログボックス内でリスト表示して選択できるようにしました。
変更
形態素解析器「sanmoku」を実装して、選択した文章を品詞分解してみました。
解析エンジンをsanmokuから、yahooの係り受け解析APIに変更しました。意味解釈をしやすい気がしまして...。
追加
一応
2 3つの反応に対応。メールを開くのとブラウザーを開く、マップを開くという3つのこと
しかできませんけど...。
RecognizerIntentを使ってみる
SATCH側では顔検出をトリガーにする予定ですが、今回は手軽にタップをトリガーにします。ワンフィンガーだと誤動作しやすいのでツーフィンガータップで起動させます。
初音ミクさんが、「なになに?」と聞いてきて、RecognizerIntentが起動します。
voiceRecognitionの画面でなんかしゃべってみます。
サンプルアプリでは、反応パターンは3つです。
反応1
音声の内容が認識できた場合。
「かしこまりました」と言ってくれます。
もっとも、その後は何もしてくれませんが(^^)。
Yahooの係り受け解析の結果はこんな感じ。
現状、3つの意味解釈をします。
「メールの起動」と「ブラウザーの起動」、「マップの起動」です(単純ですけど)。
こんな感じ。
直前に閲覧していたWebページを開きます。
とりあえず、Google Mapsを開きます。
現在地名を表示してます(時々失敗しますが....)。
「地図を開く」をタップすると、現在地でMapsをオープンします。
また、「地図」や「マップ」、「map」という単語の場合は、地図を表示するだけです(大阪府中心)。
「読み上げ」をタップすると、ドロイド君が出てきて現在地の住所を読み上げます。
読み上げはKDDIの「N2 TTS」に対応しています。インストールしておいてください。
アンドロイドで日本語音声出力(TextToSpeech):音声読み上げ
を参照。
ドロイド君を出すのはN2の声が平板なので、こっちのほうがよろしかろう..という判断です。
読み上げの終了を検知すると、引っ込みます。
反応2
音声の内容がわからなかった場合。
「きこえないよお」と言って、しらばっくれてくれます。
ばっくれるのは止めて、今バージョンでは、素直に「むずかしいです」と言ってもらうことにしました。
反応3
キャンセルがタップされた場合。
「またね」と言って消えます。
コード(Java)
RecognizerIntentを使用する部分です。
import java.util.ArrayList;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.speech.RecognizerIntent;
・
・
・
・
private static final int REQUEST_CODE = 0;//0は変更してね
・
・
・
・
private void voice_recognition(){
//
try {
Intent intent = new Intent(
RecognizerIntent.ACTION_RECOGNIZE_SPEECH); // ACTION_WEB_SEARCH
intent.putExtra(
RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(
RecognizerIntent.EXTRA_PROMPT,
"VoiceRecognition");
startActivityForResult(intent, REQUEST_CODE);
} catch (ActivityNotFoundException e) {
//ActivityNotFoundExceptionエラー
}
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
String results = "";
//
ArrayList<String> results = data.getStringArrayListExtra(
RecognizerIntent.EXTRA_RESULTS);
for (int i = 0; i< results.size(); i++) {
results += results.get(i) + "\n";
}
String[] temp_args = new String[1];
int kekka = 0;
//ここで意味解釈、今回は省略
if (kekka == 0){
temp_args[0] = "X";
}else{
temp_args[0] = "OK";
}
_kddiComponent.enqueueCommand("voice", temp_args);
}else{
String[] args = new String[1];
args[0] = "CANCEL";
_kddiComponent.enqueueCommand("voice", args);
}
super.onActivityResult(requestCode, resultCode, data);
}
コード(Lua)
下のapkを解凍すればassetsフォルダーに入っています。
インストール
動作確認実機:Xperia acro(docomo),target Android 2.3.4
アプリをQRコードからインストールする方法はコチラを参照
Juliusを使ってみる
Juliusについてはコチラを参照
工事中