구글 음성인식(SpeechRecognizer) API를 이용하여 서비스 형태로 구현하기

구글의 음성인식 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. 결론
결론적으로 서비스로 구현가능함으로 확인하였으나, 음성을 인식하게 하기 위해
항상 대기상태로 만들어 놓았더니, 배터리 소모량이 많음을 확인하였다.

SC20150110-135825