package com.integreight.onesheeld.shields.controller.utils;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.speech.RecognitionListener;
import android.speech.RecognizerIntent;
import android.speech.SpeechRecognizer;
import com.integreight.onesheeld.utils.CrashlyticsUtils;
import com.integreight.onesheeld.utils.Log;
import java.util.List;
public class SpeechRecognition implements RecognitionListener {
@SuppressWarnings("unused")
private static final String TAG = SpeechRecognition.class.getSimpleName();
private SpeechRecognizer mSpeechRecognizer;
public interface RecognitionEventHandler {
public void onResult(List<String> result);
public void onError(String error, int errorCode);
public void onReadyForSpeach(Bundle params);
public void onBeginingOfSpeech();
public void onEndOfSpeech();
public void onRmsChanged(float rmsdB);
}
private RecognitionEventHandler mResultCallback;
public SpeechRecognition(Context context) {
mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(context);
mSpeechRecognizer.setRecognitionListener(this);
}
public synchronized void stop() {
try {
if (mSpeechRecognizer != null) {
mSpeechRecognizer.stopListening();
mSpeechRecognizer.cancel();
mSpeechRecognizer.destroy();
mSpeechRecognizer = null;
}
} catch (IllegalStateException ignored) {
CrashlyticsUtils.logException(ignored);
}
}
public void start(RecognitionEventHandler callback) {
mResultCallback = callback;
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,
"com.integreight.onesheeld");
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE, "en-US");
mSpeechRecognizer.startListening(intent);
}
@Override
public void onBeginningOfSpeech() {
mResultCallback.onBeginingOfSpeech();
}
@Override
public void onBufferReceived(byte[] arg0) {
// TODO Auto-generated method stub
}
@Override
public void onEndOfSpeech() {
mResultCallback.onEndOfSpeech();
}
@Override
public void onError(int error) {
String reason = "";
if (mResultCallback != null) {
switch (error) {
case SpeechRecognizer.ERROR_AUDIO:
reason = "SpeechRecognizer.ERROR_AUDIO";
break;
case SpeechRecognizer.ERROR_CLIENT:
reason = "SpeechRecognizer.ERROR_CLIENT";
break;
case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS:
reason = "SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS";
break;
case SpeechRecognizer.ERROR_NETWORK:
reason = "SpeechRecognizer.ERROR_NETWORK";
break;
case SpeechRecognizer.ERROR_NETWORK_TIMEOUT:
reason = "SpeechRecognizer.ERROR_NETWORK_TIMEOUT";
break;
case SpeechRecognizer.ERROR_NO_MATCH:
reason = "SpeechRecognizer.ERROR_NO_MATCH";
break;
case SpeechRecognizer.ERROR_RECOGNIZER_BUSY:
reason = "SpeechRecognizer.ERROR_RECOGNIZER_BUSY";
break;
case SpeechRecognizer.ERROR_SERVER:
reason = "SpeechRecognizer.ERROR_SERVER";
break;
case SpeechRecognizer.ERROR_SPEECH_TIMEOUT:
reason = "SpeechRecognizer.ERROR_SPEECH_TIMEOUT";
break;
}
mResultCallback.onError(reason, error);
}
}
@Override
public void onEvent(int eventType, Bundle params) {
// TODO Auto-generated method stub
Log.d("VR", eventType + "");
}
@Override
public void onPartialResults(Bundle partialResults) {
// If you feel like it, you can use the partial result.
// receiveResults(partialResults);
}
@Override
public void onReadyForSpeech(Bundle params) {
mResultCallback.onReadyForSpeach(params);
}
@Override
public void onResults(Bundle results) {
receiveResults(results);
}
@Override
public void onRmsChanged(float rmsdB) {
mResultCallback.onRmsChanged(rmsdB);
}
private void receiveResults(Bundle results) {
if ((results != null)
&& results.containsKey(SpeechRecognizer.RESULTS_RECOGNITION)) {
List<String> res = results
.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
if (mResultCallback != null)
mResultCallback.onResult(res);
}
}
}