音声認識機能の実装

音声認識機能の実装

まずは、追加ボタンをクリックした時に音声認識を起動するために
Intent を使って音声認識機能を呼び出す

まず、音声認識機能を呼び出すIntent のREQUEST_IDは
あらかじめ定数で定義しておく

こっちは、最初のアダプター定義のあたりに書く
private static final int REQUEST_SPEECH =1;

次に、実際の処理
ちなみに、書く場所は
case R.id.add:
listAdapter.add(“追加”);
の下

Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
で音声認識 intent 作成

intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);

で機能を拡張
それぞれの意味は
RecognizerIntent.EXTRA_LANGUAGE_MODEL

言語モデルを設定

RecognizerIntent.LANGUAGE_MODEL_FREE_FORM

自由に音声を入力したいので
EXTRA_LANGUAGE_MODEL
にしている

次に、/音声認識画面に表示する文字列を設定
今回はthis.getTitle()で呼び出し元Activity の表題にする

intent.putExtra(RecognizerIntent.EXTRA_PROMPT, this.getTitle());
.EXTRA_PROMPT,

音声認識画面に表示する文字列を設定する
ちなみに

Extra() は
文字列をキーとして
値や数値などを格納するリスト
ハッシュとか JSON みたいなイメージ
これを使うことで
intent の詳細設定を追加していくことができる

なので、intent を定義したら
putExtra() で機能追加と考えるとわかりやすい

ここまでできたら
音声認識のダイアログを表示する
例外がでるので
try catch で行う
失敗の可能性のあるものは
try catch と考えるといいかもしれない

あらかじめ、strings.xml で
toast で表示する文字列をつくっておく
これはソースに書くよりも後で変更などのメンテがしやすいため

			//音声認識 dialog 表示
			try{
				startActivityForResult(intent, REQUEST_SPEECH);
			}catch (ActivityNotFoundException e) {
				// TODO: handle exception
				//音声認識が使えなかったら toast で知らせる
				Toast.makeText(this	,getString(R.string.word_disable), Toast.LENGTH_SHORT).show();
				e.printStackTrace();
			}

ここまでできたら
音声入力が正しく終了できたときの処理をつくる

これには
別Activity の処理結果を取得する
onActivityResult() を使う

右クリック > source >
override / implement methods

これはActivity の項目にある
onActivityResult
を選ぶとソースが追記される

ここで
正常処理である場合のみ処理できるように判定する
判定は
if(requestCode == REQUEST_SPEECH && resultCode == RESULT_OK){
でできる

REQUEST_SPEECH

private static final int REQUEST_SPEECH =1;
で設定した定数

ArrayList results = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
で結果リストを取得

.getStringArrayListExtra()
認識結果の配列を取得している

このあたりの流れは

http://wiki.livedoor.jp/moonlight_aska/d/%B2%BB%C0%BC%A4%C7%CA%B8%BB%FA%C6%FE%CE%CF%A4%B9%A4%EB
に載っていたのでこれを参考に

音声認識の結果は
data の Extra() に入っているのでこれを
定数の
RecognizerIntent.EXTRA_RESULTS
をキーにして取り出している

if(results.size() > 0){

で0以上、つまり認識結果があるなら
listAdapter.add(results.get(0));
でリストに追加する

ちなみに、
http://wiki.livedoor.jp/moonlight_aska/d/%B2%BB%C0%BC%A4%C7%CA%B8%BB%FA%C6%FE%CE%CF%A4%B9%A4%EB
では
EdutText へ追加するため

inpText.setText(input); 

で文字としてセットしている

private EditText inpText;
inpText = (EditText)findViewById(R.id.result_id);

となっているのが EditText の設定

これで音声入力はできるけど

//音声認識画面に表示する文字列
intent.putExtra(RecognizerIntent.EXTRA_PROMPT, this.getTitle());

になっているから
音声入力を促す画面文字がアプリ名なので微妙だ

intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "音声を入力してください。");

というようにしたほうがすっきりする

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です