구글의 음성인식 API를 서비스 형태로 구현하여, 항상 명령어를 내리면 실행할수 있는지 테스트하기로 하였다.
1. 서비스 구현
– 구글의 SpeechRecognizer API는 한번 음성을 인식한 후, 끝나버리기 때문에 계속
재시작을 해주는 식으로 구현해야 한다.
– 따라서 다음과 같이 onResults에서 음성인식 결과를 출력하고 난후, 핸들러 메시지를
MSG_VOICE_RECO_END 상태로 보낸다.
그렇게되면 핸들러의 handleMessage() 에서는 1초후에 다시 SpeechRecognizer를
재시작한다.
public class VoiceRecoService extends Service { @Override public void onCreate() { super.onCreate(); startListening(); ..... (중 략)..... } ..... (중 략)..... private Handler mHdrVoiceRecoState = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case MSG_VOICE_RECO_READY : break; case MSG_VOICE_RECO_END : { stopListening(); sendEmptyMessageDelayed(MSG_VOICE_RECO_RESTART, 1000); break; } case MSG_VOICE_RECO_RESTART : startListening(); break; default: super.handleMessage(msg); } } }; public void startListening() { if(mBoolVoiceRecoStarted == false) { if(mSrRecognizer == null) { mSrRecognizer = SpeechRecognizer.createSpeechRecognizer(mCtxContext); mSrRecognizer.setRecognitionListener(mClsRecoListener); } if(mSrRecognizer.isRecognitionAvailable(mCtxContext)) { Intent itItent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); itItent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, this.getPackageName()); itItent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.KOREAN.toString()); itItent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 50); mSrRecognizer.startListening(itItent); } } mBoolVoiceRecoStarted = true; } public void stopListening() { try { if (mSrRecognizer != null && mBoolVoiceRecoStarted == true) { mSrRecognizer.stopListening(); } } catch(Exception ex) { Logger.e("Stop 예외:"+ StrUtil.trace(ex)); } mBoolVoiceRecoStarted = false; } private RecognitionListener mClsRecoListener = new RecognitionListener() { @Override public void onRmsChanged(float rmsdB) { } @Override public void onResults(Bundle results) { mHdrVoiceRecoState.sendEmptyMessage(MSG_VOICE_RECO_END); Intent itBroadcast = new Intent(); itBroadcast.setAction(Constants.INTENT_ACTION_VOICE_RECO); itBroadcast.putExtras(results); mCtxContext.sendBroadcast(itBroadcast); } @Override public void onReadyForSpeech(Bundle params) { } @Override public void onEndOfSpeech() { } @Override public void onError(int intError) { mHdrVoiceRecoState.sendEmptyMessage(MSG_VOICE_RECO_END); } @Override public void onBeginningOfSpeech() { } @Override public void onBufferReceived(byte[] buffer) { } @Override public void onEvent(int eventType, Bundle params) { } @Override public void onPartialResults(Bundle partialResults) { } }; }
2. 결론
결론적으로 서비스로 구현가능함으로 확인하였으나, 음성을 인식하게 하기 위해
항상 대기상태로 만들어 놓았더니, 배터리 소모량이 많음을 확인하였다.