2014-03-26 7 views
0

제목이 분명하지 않다고 생각합니다. 내 프로젝트에서 나는 백그라운드에서 실행되는 서비스를 원하고 사용자가 "hello phone"또는 일부 단어/문구를 말할 때 내 앱이 음성을 인식하기 시작합니다. 실제로 그것은 작동하지만 옳은 길은 아닙니다 ... 나는 서비스를 가지고 있으며이 서비스는 음성을 감지합니다.SpeechRecognitionService (단어 인식 포함)

public class SpeechActivationService extends Service 
    { 
protected AudioManager mAudioManager; 
protected SpeechRecognizer mSpeechRecognizer; 
protected Intent mSpeechRecognizerIntent; 
protected final Messenger mServerMessenger = new Messenger(new IncomingHandler(this)); 
protected boolean mIsListening; 
protected volatile boolean mIsCountDownOn; 

static String TAG = "Icaro"; 

static final int MSG_RECOGNIZER_START_LISTENING = 1; 
static final int MSG_RECOGNIZER_CANCEL = 2; 

private int mBindFlag; 
private Messenger mServiceMessenger; 

@Override 
public void onCreate() 
{ 
    super.onCreate(); 
    mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 
    mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(this); 
    mSpeechRecognizer.setRecognitionListener(new SpeechRecognitionListener()); 
    mSpeechRecognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
    mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, 
            RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
    mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, 
            this.getPackageName()); 

    //mSpeechRecognizer.startListening(mSpeechRecognizerIntent); 
} 

protected static class IncomingHandler extends Handler 
{ 
    private WeakReference<SpeechActivationService> mtarget; 

    IncomingHandler(SpeechActivationService target) 
    { 
     mtarget = new WeakReference<SpeechActivationService>(target); 
    } 


    @Override 
    public void handleMessage(Message msg) 
    { 
     final SpeechActivationService target = mtarget.get(); 

     switch (msg.what) 
     { 
      case MSG_RECOGNIZER_START_LISTENING: 

       if (Build.VERSION.SDK_INT >= 16);//Build.VERSION_CODES.JELLY_BEAN) 
       { 
        // turn off beep sound 
        target.mAudioManager.setStreamMute(AudioManager.STREAM_SYSTEM, true); 
       } 
       if (!target.mIsListening) 
       { 
        target.mSpeechRecognizer.startListening(target.mSpeechRecognizerIntent); 
        target.mIsListening = true; 
        Log.d(TAG, "message start listening"); //$NON-NLS-1$ 
       } 
       break; 

      case MSG_RECOGNIZER_CANCEL: 
        target.mSpeechRecognizer.cancel(); 
        target.mIsListening = false; 
        Log.d(TAG, "message canceled recognizer"); //$NON-NLS-1$ 
        break; 
     } 
    } 
} 

// Count down timer for Jelly Bean work around 
protected CountDownTimer mNoSpeechCountDown = new CountDownTimer(5000, 5000) 
{ 

    @Override 
    public void onTick(long millisUntilFinished) 
    { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onFinish() 
    { 
     mIsCountDownOn = false; 
     Message message = Message.obtain(null, MSG_RECOGNIZER_CANCEL); 
     try 
     { 
      mServerMessenger.send(message); 
      message = Message.obtain(null, MSG_RECOGNIZER_START_LISTENING); 
      mServerMessenger.send(message); 
     } 
     catch (RemoteException e) 
     { 

     } 
    } 
}; 

@Override 
public int onStartCommand (Intent intent, int flags, int startId) 
{ 
    //mSpeechRecognizer.startListening(mSpeechRecognizerIntent); 
    try 
    { 
     Message msg = new Message(); 
     msg.what = MSG_RECOGNIZER_START_LISTENING; 
     mServerMessenger.send(msg); 
    } 
    catch (RemoteException e) 
    { 

    } 
    return START_NOT_STICKY; 
} 

@Override 
public void onDestroy() 
{ 
    super.onDestroy(); 

    if (mIsCountDownOn) 
    { 
     mNoSpeechCountDown.cancel(); 
    } 
    if (mSpeechRecognizer != null) 
    { 
     mSpeechRecognizer.destroy(); 
    } 
} 

protected class SpeechRecognitionListener implements RecognitionListener 
{ 

    @Override 
    public void onBeginningOfSpeech() 
    { 
     // speech input will be processed, so there is no need for count down anymore 
     if (mIsCountDownOn) 
     { 
      mIsCountDownOn = false; 
      mNoSpeechCountDown.cancel(); 
     }    
     Log.d(TAG, "onBeginingOfSpeech"); //$NON-NLS-1$ 
    } 

    @Override 
    public void onBufferReceived(byte[] buffer) 
    { 
     String sTest = ""; 
    } 

    @Override 
    public void onEndOfSpeech() 
    { 
     Log.d("TESTING: SPEECH SERVICE", "onEndOfSpeech"); //$NON-NLS-1$ 
    } 

    @Override 
    public void onError(int error) 
    { 
     if (mIsCountDownOn) 
     { 
      mIsCountDownOn = false; 
      mNoSpeechCountDown.cancel(); 
     } 
     Message message = Message.obtain(null, MSG_RECOGNIZER_START_LISTENING); 
     try 
     { 
      mIsListening = false; 
      mServerMessenger.send(message); 
     } 
     catch (RemoteException e) 
     { 

     } 
     Log.d(TAG, "error = " + error); //$NON-NLS-1$ 
    } 

    @Override 
    public void onEvent(int eventType, Bundle params) 
    { 

    } 

    @Override 
    public void onPartialResults(Bundle partialResults) 
    { 

    } 

    @Override 
    public void onReadyForSpeech(Bundle params) 
    { 
     if (Build.VERSION.SDK_INT >= 16);//Build.VERSION_CODES.JELLY_BEAN) 
     { 
      mIsCountDownOn = true; 
      mNoSpeechCountDown.start(); 
      mAudioManager.setStreamMute(AudioManager.STREAM_SYSTEM, false); 
     } 
     Log.d("TESTING: SPEECH SERVICE", "onReadyForSpeech"); //$NON-NLS-1$ 
    } 

    @Override 
    public void onResults(Bundle results) 
    { 
     ArrayList<String> data = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); 
     Log.d(TAG, (String) data.get(0)); 

     //mSpeechRecognizer.startListening(mSpeechRecognizerIntent); 

     mIsListening = false; 
     Message message = Message.obtain(null, MSG_RECOGNIZER_START_LISTENING); 
     try 
     { 
       mServerMessenger.send(message); 
     } 
     catch (RemoteException e) 
     { 

     } 

     Log.d(TAG, "onResults"); //$NON-NLS-1$ 
    } 

    @Override 
    public void onRmsChanged(float rmsdB) 
    { 

    } 
} 

@Override 
public IBinder onBind(Intent arg0) { 
    // TODO Auto-generated method stub 
    return null; 
} 
} 

그리고 난 내 MainActivity에서 서비스를 시작 단지 시도 :

Intent i = new Intent(context, SpeechActivationService.class); 
startService(i); 

이 너무 많이 음성 입력을 감지 ... 그리고! 그것이 무언가를 발견 할 때마다 그것은 "bipbip"입니다. 너무 많은 bips !! 실망 스럽습니다. 나는 "hello phone"이나 "start"또는 특정 단어를 말할 때만 시작하기를 원합니다 !! 이 https://github.com/gast-lib/gast-lib/blob/master/library/src/root/gast/speech/activation/WordActivator.java을 보려고하지만 실제로이 라이브러리를 어떻게 사용하는지 모르겠습니다. 나는이 질문을보십시오 onCreate of android service not called하지만 정확히 무엇을 해야할지 이해하지 못한다. 어쨌든, 나는 이미 gast 라이브러리를 가져온다. 나는 단지 그것을 사용하는 방법을 알 필요가있다. 누구든지 나를 도와 줄 수 있습니까? 감사합니다

답변

0

setStreamMute 대신 setStreamSolo (AudioManager.STREAM_VOICE_CALL, true)를 사용하십시오. MSG_RECOGNIZER_CANCEL의 경우 setStreamSolo (AudioManager.STREAM_VOICE_CALL, false)를 추가하는 것을 잊지 마십시오.