N2 TTS を試して見る

N2とは?

 KDDI研究所作の日本語音声合成エンジン。超軽量が売りで、ネットにつながなくても使える!こりゃ使うしかねぇ!アプリがしゃべると何かと楽しそうw
インストールから設定については androidマーケット を参照してください。

アプリに組み込む

 アプリに組み込むにはどうするかというと、上記設定後、普通に TextToSpeechクラスを使えばいいっぽい。SetLanguage メソッドは Japanese に設定すべし。あとは setPitch メソッドでピッチを変えて声色を変えます。


 ただ、KDDI研究所作のN2を使ったウィジェット「ささやくヤーツ」のキャラの声を再現するにはピッチ調整だけだとおそらく無理なので、何かしらのパラメータが存在しているのだと思われます。
speak メソッドの引数として何かパラメータを与えられるんでしょうか?誰か教えてー(´Д`)

アプリ作成

 音声合成が出来るということで対話型アプリを作りたいところですがわざわざ返答とか考えるのがメンドクセー…ということでとりあえず、音声認識で聞き取った言葉をキャラがそのまま発するという、結構無意味なものを作ってみるw


何かかわいいキャラが欲しいところですが残念ながら絵心ゼロの私。
ということで maku puppet を使わせていただきす!マクパペットは無料で使えてなんと商用利用もOKなかわゆいキャラクター(flash製)。パラメータを与えるだけで装備を変更したりアニメーションを付けたりを簡単にでき、AS3から簡単に操作できたりする優れもの。
ただしネットにつながってないと使えない…

これを使ったflashandroidのWebViewで表示すればなんとなくいけそうな気がする…
いろいろ頑張ればキリがないと思うけどもとりあえず元のmaku.swfをassetsフォルダに置いてそれにパラメータをつけて毎回ロードするようにすればなんとなくそれっぽく動くはず。ポイントはWebViewの設定でプラグインを有効にすることと(これをしないとflash見れない)スクロールバーを消すことでしょうか。

String makuurl="file:///android_asset/maku.swf";
wv=(WebView)findViewById(R.id.wv);
WebSettings settings = wv.getSettings();
settings.setPluginsEnabled(true);
wv.setScrollBarStyle(WebView.SCROLLBARS_INSIDE_OVERLAY);
wv.loadUrl(makuurl);  


次は音声認識のところですがこれもまあネット見ればゴロゴロとやり方は載ってますな…。ただ、毎回ダイアログを表示するのもなんなのでダイアログを表示しないやり方でやるべき。イベントリスナーを設定するとちゃんと話し始めとか終わりとか検知してくれて、すごいぞ!SpeechRecognizer
後は認識が完了したところでその文字列をTTSに渡して、適当にアニメーションを付けてswfをロードし直せばそれなりに動くはず!


ただ問題として、ひたすら音声認識しっぱなしだと…
ユーザがしゃべる→認識→アプリがしゃべる→アプリ自らしゃべった音声を認識→アプリがしゃべる→認識→アプリがしゃべる→…
という無限ループに陥ってしまうので(笑)アプリがしゃべり終わったあとに認識を開始しないといけない。
TextToSpeechクラスにはしゃべり終わった事を知らせてくれるイベントリスナー(setOnUtteranceCompletedListener)が用意されているのでありがたく使いましょう!
注意点としてあらかじめUTTERANCE_ID(識別するための番号?多分適当で問題なし!)というのをパラメータで与えておかないとイベントを補足できない点と、イベントリスナーをセットするタイミングが早すぎるとこれまたイベントが発生しないらしい点です(onInitメソッド中で定義するのが吉)。あと処理はhandler経由にしないとバグるっぽい?

//CompleteEvent
tts.setOnUtteranceCompletedListener(new OnUtteranceCompletedListener() {
    public void onUtteranceCompleted(String utteranceId) {
        handler.post(new Runnable(){
	    public void run(){
                rec.startListening(RecognizerIntent.getVoiceDetailsIntent(getApplicationContext()));
	    }
	});
    }
});
//SET UTTERANCE_ID
ttsparam = new HashMap<String, String>();
ttsparam.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, UTTERANCE_ID);
tts.speak(text, TextToSpeech.QUEUE_FLUSH, ttsparam);

スクリーンショット



ということで簡単ですが作成したアプリ MakuTalk のプロジェクトzipとapkは以下のサイトに…
mukacho's informal android apps!
※当然ながらN2TTSが無いと動きません…