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