N2 TTS で日本語読み上げ
まず
N2 TTS のパッケージ名を使うので
これを定数に格納する
private static final String N2TTS =”jp.kddilabs.n2tts”;
同様に
TextToSpeechオブジェクトを格納する変数
private TextToSpeech tts;
TextToSpeech エンジン初期化完了フラグ
private boolean ttsInit;
次に、onCreate() の中へ
TextToSpeechオブジェクトを作成
tts = new TextToSpeech(this, this, N2TTS);
とする
引数の意味は
最初の this が
オブジェクトを利用するときの context
通常は this
次の this が
オブジェクトの初期化が完了したことを示す
OnInitListener オブジェクト
N2TTS
が使用するスピーチエンジン
これは、先に定数で指定したもの
そのときのソースが
private static final String N2TTS =”jp.kddilabs.n2tts”;
そして SpeechEngineが完了したときに呼ばれるメソッドは
onInit()
これを使うには
implements OnInitListener する必要があるので
implements OnClickListener
を
implements OnClickListener,OnInitListener {
とする
これで 右クリックで
source > override /implements
で
onInit() を追記できるので
ここに処理を書く
ここへは
読み上げ実行処理の有効化を書く
今回、判定を入れてあるのは
リスト項目をタップしたら
という条件があるから
この判定にフラグを使っている
if(status == TextToSpeech.SUCCESS){
は初期化が正しく成功したかの判定
処理が正しく成功したのなら
TextToSpeech.SUCCESS
となる
これで後はフラグである ttsinit を true にするだけ
次に
音声読み上げ処理の実装
音声読み上げで内部では
キュー構造が用意されていて
読み上げ処理は
そのキューに投入された順に実行される
キューを操作する場合
TextToSpeechクラスに定義された2つの定数を使う
定数は
QUEUE_ADD
新しく読み上げリクエスト追加
QUEUE_DELETE
現在のキュー内容を破棄し
直ちに読み上げリクエストを実行
この定数は
TextToSpeecオブジェクトで
何らかの読み上げリクエストを使うすべてのメソッドで使える
今回は リスト項目のクリック時にスピーチ実行する
このActivity はActivity クラスに
ListView オブジェクトの機能が統合された
ListActivity クラスをベースにしているので
onListItemClick() を
overrideするだけでList をクリックした時の動作を実装できる
中の処理には
if(ttsInit){
tts.speak(listAdapter.getItem(position), TextToSpeech.QUEUE_ADD, null);
}
を追加
onListItemClick() のパラメータの説明は
ListView l,
クリックされたlistview オブジェクト
View v,
クリックされたリストの項目ビューオブジェクト
int position,
クリックされたリスト項目のインデックス
long id
クリックされたリスト項目のID
となる
今回はAdapter Object のgetItem() から文字列を取得して
speack() に設定している
tts.speak(listAdapter.getItem(positi on), TextToSpeech.QUEUE_ADD, null);
で音声の読み上げ
この speak() のパラメータは
listAdapter.getItem(position)
が読み上げたい文字列
TextToSpeech.QUEUE_ADD
が処理をキューに追加する方法の指定
今回は QUEUE_ADD
null
は
読み上げ処理の追加パラメータ
今回は使わないので null
ここでは読み上げIDとかステレオ設定などをする
ここでキューに登録された文字列は
キューに格納され
読み上げ可能なタイミングになると読み上げられる
これで、アプリを起動してリストをタップすると
音声で文字列が読み上げられる
これを応用すれば twitter とかルート案内とかでもできる
とりあえず日本語読み上げはできたので
今後は Edit Text で入力し
それを喋らせるようにしてみよう
さすがに音声入力だと精度があまりよくないようだ