音声認識をつかってみる。
Androidの音声認識、最近のSiriとかしゃべってコンシェルとか、
はやりを見てると使った事無いのはまずいなーと。
高齢化社会にはもってこいなAPIだと思う。
あと、ちっこい頃にみてた近未来的な映画の1シーンとかでも、
音声操作がポロポロあったなーと思うと、時代はもうすぐそこまで来てるのかと。
そんな訳で、サンプルを作ってみた。
サンプルの内容は、
1.音声認識
2.あらかじめ登録していたStringデータと参照
3.結果をログに出力
といった感じにまとめました。
1.音声認識について
音声認識はAPIといった物があるわけでは無く、
RecognizerIntentというActivityに全てを任せているみたい。
こんなイメージになる。
戻りのArrayListには、音声認識結果の全てが入っている様子。
例えば、「てすと」と音声入力した時に帰ってきたデータは、
てすと/test/テスト/ted
といった感じだった。
2.サンプルコード
ざっくりとサンプルを貼り付ける。
AsyncTaskに音声認識の戻りと、登録していたStringデータの比較処理を入れている。
AsyncTaskのコンストラクタで登録するStringデータを流し込んでる。
public class RecognizerSampleActivity extends Activity implements OnClickListener { static final String DEBUG_TAG = "RECOGNIZER_SAMPLE"; static final int CODE_RESULT = 0x01; static ArrayList<String> recognizeWord = null; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ((Button)findViewById(R.id.button1)).setOnClickListener(this); // create words recognizeWord = new ArrayList<String>(); recognizeWord.add("てすと"); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if ((CODE_RESULT == requestCode) && (RESULT_OK == resultCode)) { ArrayList<String> results = data .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); StringParseTask task = new StringParseTask(recognizeWord); task.execute(results); } super.onActivityResult(requestCode, resultCode, data); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.button1: // 音声認識Activityを呼び出す Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); startActivityForResult(intent, CODE_RESULT); break; default: break; } } private class StringParseTask extends AsyncTask<ArrayList<String>, Integer, Boolean> { ArrayList<String> regex = null; StringParseTask(ArrayList<String> rgx){ regex = rgx; } @Override protected Boolean doInBackground(ArrayList<String>... params) { Boolean ret = false; for(String s : params[0]){ for(String rgx : regex){ if(s.equals(rgx)){ ret = true; } } if(ret){ break; } } return ret; } @Override protected void onPostExecute(Boolean result) { if(result){ Log.v(DEBUG_TAG,"-------------------- hit words!!!!"); }else{ Log.v(DEBUG_TAG,"-------------------- No hit words..."); } } } }
ざっくりしてるけれど、今日はこれぐらいで。