2014-02-11 5 views
1

나는 서비스에서 음성 인식을 시도하고 구현하기 위해 Android Speech Recognition as a service on Android 4.1 & 4.2 게시물을 참조하고 있습니다.텍스트로 음성 받기 Android

내가 맞다고 생각합니다. 내 장치에서 실행 중일 때 onReadyForSpeech() 함수 내에서 선언 한 "준비가 된 음성"토스트 메시지가 나타납니다.

Hoan Nguyen 위의 게시물에 대한 ans를 제공 한 사람에 따르면 onReadyForSpeech() 함수가 호출 되 자마자 말할 수 있습니다.

내 문제는 말하고있는 말을 어떻게 텍스트로 변환하고 어디에서 처리해야 하는지를 모르는 것입니다.

아무도 그 방법을 알고 있습니까? 내가 묻는 것은 매우 불충분 한 질문이지만 음성 인식으로 작업 한 것은 처음입니다. 그러니 나와 함께 견뎌주십시오.

이 문제에 대한 도움은 매우 감사하겠습니다.

public class MyService 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 final int MSG_RECOGNIZER_START_LISTENING = 1; 
     static final int MSG_RECOGNIZER_CANCEL = 2; 

    @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); 
     //Toast.makeText(this, "onCreate", Toast.LENGTH_SHORT).show(); 
     Log.d("onCreate","Entered"); 
    } 


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

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

      Log.d("IncomingHandler","Entered"); 
     } 


     @Override 
     public void handleMessage(Message msg) 
     { 
      Log.d("handleMessage","Entered"); 

      final MyService target = mtarget.get(); 

      switch (msg.what) 
      { 
       case MSG_RECOGNIZER_START_LISTENING: 

        if (Build.VERSION.SDK_INT >= 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 
      Log.d("onTick","Entered"); 
     } 

     @Override 
     public void onFinish() 
     { 
      Log.d("onFinish","Entered"); 

      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) { 
     // TODO Auto-generated method stub 
     //mSpeechRecognizer.startListening(mSpeechRecognizerIntent); 

     try 
     { 
      Message msg = new Message(); 
      msg.what = MSG_RECOGNIZER_START_LISTENING; 
      mServerMessenger.send(msg); 
     } 
     catch (RemoteException e) 
     { 
      Log.d("msg",""+e); 
     } 
     return START_NOT_STICKY; 
     //return super.onStartCommand(intent, flags, startId); 
    } 

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

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

     Log.d("onDestroy","Entered"); 
    } 

    protected class SpeechRecognitionListener implements RecognitionListener 
    { 

     private static final String TAG = "Sppech---->"; 

     @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$ 
      Log.d("onBeginningOfSpeech","Entered"); 
     } 

     @Override 
     public void onBufferReceived(byte[] buffer) 
     { 
      String sTest = ""; 
      Log.d("onBufferReceived","Entered"); 
     } 

     @Override 
     public void onEndOfSpeech() 
     { 
      //Log.d(TAG, "onEndOfSpeech"); //$NON-NLS-1$ 
      Log.d("onEndOfSpeech","Entered"); 
     } 

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

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

     @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 >= Build.VERSION_CODES.JELLY_BEAN) 
      { 
       mIsCountDownOn = true; 
       mNoSpeechCountDown.start(); 
       mAudioManager.setStreamMute(AudioManager.STREAM_SYSTEM, false); 
      } 
      //Log.d("TAG", "onReadyForSpeech"); 
      Toast.makeText(getApplicationContext(), "Ready for Speech", Toast.LENGTH_SHORT).show(); 
      Log.d("onReadyForSpeech","Entered");//$NON-NLS-1$ 
     } 

     @Override 
     public void onResults(Bundle results) 
     { 
      //Log.d(TAG, "onResults"); //$NON-NLS-1$ 

     } 

     @Override 
     public void onRmsChanged(float rmsdB) 
     { 

     } 



    } 

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

답변

1

:) 미리 감사드립니다 당신은 당신이 다음 사용자가 ArrayList에로

ArrayList<String> matches = result.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); 
+0

그 작업 감사 많은 말 것을 얻을 수있는 onResult(Bundle result)에 그것을 얻을. 나는 방금이 질문에 대답 할 사람이 될 것을 알았다. 비록 그것을 볼 수는 없지만 지금 당장 내 얼굴에 커다란 미소가 있습니다 : P – ik024

+0

지금 당장 저는 U가 한 모든 것을 정말로 이해하고 싶습니다. 내가 그것을 이해할 수 있도록 링크를 제공함으로써 pls가 나를 도울 수 있습니까? – ik024

+0

단지 RecognitionListener, RecognizerIntent 및 SpeechRecognizer를 으로 읽으십시오. http://developer.android.com/reference/android/speech/package-summary.html –