temporaryなめも帳

だらだらと備忘録とか。誰かの為になることをねがって。

音声認識をつかってみる。

Android音声認識、最近のSiriとかしゃべってコンシェルとか、
はやりを見てると使った事無いのはまずいなーと。

高齢化社会にはもってこいなAPIだと思う。
あと、ちっこい頃にみてた近未来的な映画の1シーンとかでも、
音声操作がポロポロあったなーと思うと、時代はもうすぐそこまで来てるのかと。

そんな訳で、サンプルを作ってみた。
サンプルの内容は、

1.音声認識
2.あらかじめ登録していたStringデータと参照
3.結果をログに出力

といった感じにまとめました。

1.音声認識について

音声認識APIといった物があるわけでは無く、
RecognizerIntentというActivityに全てを任せているみたい。

こんなイメージになる。
f:id:kobashin__G:20120416232351j:plain

戻りの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...");
			}
		}
	}
}

ざっくりしてるけれど、今日はこれぐらいで。