音声認識機能の実装
まずは、追加ボタンをクリックした時に音声認識を起動するために
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
で結果リストを取得
.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, "音声を入力してください。");
というようにしたほうがすっきりする