SpeechToText 기능

 

기록에 남기고자 작성한다. 다음에 또 필요할지 모르니깐...

 

 

private SpeechRecognizer mRecognizer;  

 

 

private void startListening()
  {
   Intent i = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);   //음성인식 intent생성
   i.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, getPackageName()); //데이터 설정
   i.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "en_US"); // "ko-KR");
   
   mRecognizer = SpeechRecognizer.createSpeechRecognizer(MainActivity.this);    //음성인식 객체
   mRecognizer.setRecognitionListener(mSTTListener);          //음성인식 리스너 등록
   mRecognizer.startListening(i);
  }
  
  private void stopListening()
  {
   if(mRecognizer != null)
   {
    mRecognizer.stopListening();
   }
  }

 

  //음성인식 리스너
  public RecognitionListener mSTTListener = new RecognitionListener() {
   //입력 소리 변경 시
   @Override public void onRmsChanged(float rmsdB) {
    int step = (int)(rmsdB/7);  //소리 크기에 따라 step을 구함.
//    setVolumeImg(step);   //총 4단계 이미지 설정. 없음. 1단계, 2단계, 3단계
   }
   
   //음성 인식 결과 받음
   @Override public void onResults(Bundle results) {
//    mHandler.removeMessages(END);   //핸들러에 종료 메시지 삭제

    Log.e(TAG, "onResults : "+ results);
    
    mSTTData = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
    
    for(int i = 0; i < mSTTData.size() ; i++)
    {
     Log.e(TAG, "mSTTData : " + mSTTData.get(i));
    }
    
    
    View view = views.get(nCurrentPosition);
    TextView mResult = (TextView)view.findViewById(R.id.playing_text);
    mResult.setText(mSTTData.get(0)); //text로 인식된 data중 젤 처음 data를 textview에 set해줌.
    mResult.setVisibility(View.VISIBLE);
   }
   
   //음성 인식 준비가 되었으면 startplay 실행
   @Override public void onReadyForSpeech(Bundle params) {
//    mHandler.sendEmptyMessage(READY);  //핸들러에 메시지 보냄
    Log.e(TAG, "onReadyForSpeech : ");
    startPlay(); //이 부분은 녹음된 파일을 play하면서 그 소리를 인식하기 위해...
   }
   
   //음성 입력이 끝났으면 oncompletion 실행
   @Override public void onEndOfSpeech() {
    onCompletion(mPlayer);
    Log.e(TAG, "onEndOfSpeech : ");
//    mHandler.sendEmptyMessage(END);  //핸들러에 메시지 보냄
   }
   
   //에러가 발생하면
   @Override public void onError(int error) {
    String msg = "";
    
    Log.e(TAG, "onError : " +error);
    
    switch(error){
     case SpeechRecognizer.ERROR_AUDIO:
      msg = "오디오 입력 중 오류가 발생했습니다.";
      break;
     case SpeechRecognizer.ERROR_CLIENT:
      msg = "단말에서 오류가 발생했습니다.";
      break;
     case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS:
      msg = "권한이 없습니다.";
      break;
     case SpeechRecognizer.ERROR_NETWORK:
     case SpeechRecognizer.ERROR_NETWORK_TIMEOUT:
      msg = "네트워크 오류가 발생했습니다.";
      break;
     case SpeechRecognizer.ERROR_NO_MATCH:
      msg = "일치하는 항목이 없습니다.";
      break;
     case SpeechRecognizer.ERROR_RECOGNIZER_BUSY:
      msg = "음성인식 서비스가 과부하 되었습니다.";
      break;
     case SpeechRecognizer.ERROR_SERVER:
      msg = "서버에서 오류가 발생했습니다.";
      break;
     case SpeechRecognizer.ERROR_SPEECH_TIMEOUT:
      msg = "입력이 없습니다.";
      break;
    }
    
    if(msg.isEmpty() != true)
    {
     Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
    }
   }

   @Override public void onBeginningOfSpeech() //입력이 시작되면
   {
    Log.e(TAG, "onBeginningOfSpeech : ");
   }       
   
   @Override public void onPartialResults(Bundle partialResults) {}  //인식 결과의 일부가 유효할 때
   @Override public void onEvent(int eventType, Bundle params) {}  //미래의 이벤트를 추가하기 위해 미리 예약되어진 함수
   @Override public void onBufferReceived(byte[] buffer) {}    //더 많은 소리를 받을 때
  };

 

 

 

그리고 구글링해서 관련 소스를 얻었다.

출처가 어디였는지 기억이 안나서... 아무튼 너무나 큰 도움이었다.

 

 

 




블로그 이미지

미네르바98

안드로이드와 영화 리뷰, 생활정보에 관한 내용을 기재합니다.

,