2012-03-08 8 views
2

사용자로부터 명령을 받아 실시간으로 작성하는 앱을 만들고 있습니다. 내가 취할 수있는 최선의 선택은 무엇인가? 스핑크스와 같은 타사 소프트웨어 또는 내장 (안드로이드 음성 인식)을 사용해야합니까?음성 인식 Android 앱

두 번째로 내가 말하는 순간에 쓰는 것처럼 실시간으로 작성하고 싶습니다.

답변

6

Android 음성 인식 기능을 사용해야합니다. 특히 팝업 대화 상자가 표시되지 않도록 SpeechRecognier API를 사용해야합니다.

또한 SpeechRecognizer가 onPartialResults() 내에있는 모든 것을 반환 할 것으로 기대하지 마십시오. 그것은 거의하지 않습니다.

스핑크스를 사용해 볼 수도 있지만 다른 개발자가 Android에서 실행하는 데 어려움이있는 것 같습니다. 즉, 인터넷 연결없이 앱을 실행하려는 경우 스핑크스 만 선택할 수 있습니다.

public void recognizeDirectly(Intent recognizerIntent) 
    { 
     // SpeechRecognizer requires EXTRA_CALLING_PACKAGE, so add if it's not 
     // here 
     if (!recognizerIntent.hasExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE)) 
     { 
      recognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, 
        "com.dummy"); 
     } 
     SpeechRecognizer recognizer = getSpeechRecognizer(); 
     recognizer.startListening(recognizerIntent); 
    } 

    @Override 
    public void onResults(Bundle results) 
    { 
     Log.d(TAG, "full results"); 
     receiveResults(results); 
    } 

    @Override 
    public void onPartialResults(Bundle partialResults) 
    { 
     Log.d(TAG, "partial results"); 
     receiveResults(partialResults); 
    } 

    /** 
    * common method to process any results bundle from {@link SpeechRecognizer} 
    */ 
    private void receiveResults(Bundle results) 
    { 
     if ((results != null) 
       && results.containsKey(SpeechRecognizer.RESULTS_RECOGNITION)) 
     { 
      List<String> heard = 
        results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); 
      float[] scores = 
        results.getFloatArray(SpeechRecognizer.CONFIDENCE_SCORES); 
      receiveWhatWasHeard(heard, scores); 
     } 
    } 

    @Override 
    public void onError(int errorCode) 
    { 
     recognitionFailure(errorCode); 
    } 

    /** 
    * stop the speech recognizer 
    */ 
    @Override 
    protected void onPause() 
    { 
     if (getSpeechRecognizer() != null) 
     { 
      getSpeechRecognizer().stopListening(); 
      getSpeechRecognizer().cancel(); 
      getSpeechRecognizer().destroy(); 
     } 
     super.onPause(); 
    } 

    /** 
    * lazy initialize the speech recognizer 
    */ 
    private SpeechRecognizer getSpeechRecognizer() 
    { 
     if (recognizer == null) 
     { 
      recognizer = SpeechRecognizer.createSpeechRecognizer(this); 
      recognizer.setRecognitionListener(this); 
     } 
     return recognizer; 
    } 

    // other unused methods from RecognitionListener... 

    @Override 
    public void onReadyForSpeech(Bundle params) 
    { 
     Log.d(TAG, "ready for speech " + params); 
    } 

    @Override 
    public void onEndOfSpeech() 
    { 
    } 
+0

고맙습니다.하지만 안드로이드 프로그래밍에 능숙하지 않습니다. 설명해주십시오.이 코드를 구현하는 방법은 무엇입니까? 대화가 나타나는 음성 인식을위한 일반 코드를 구현했습니다.이 코드로 바꾸는 방법은 무엇입니까? 미리 감사드립니다. – Shah

+0

대화 버전에 사용한 의도와 동일한 인 텐트를 사용하고 대신 내 recognDirectly 메서드를 호출하십시오. 음성 인식의 결과를 처리하려면 receiveWhatWasHeard() 및 recognitionFailure()도 구현해야합니다. – gregm

+0

고마워요. 선생님 .. 그 말을 듣고 기뻐요. 나는 쓰기 방향으로 일하고있었습니다. 내 앱의 첫 번째 작업은 지금 완료되었습니다. 당신 덕분에 :) – Shah

4

gregm 잘하지만 질문의 주 "실시간으로 쓰기"부분은 대답하지 않은 : 여기

는 SpeechRecognizer를 사용해야합니다 코드의 잘린입니다. 나

intent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true); 

경고 작동

의도에 여분의 추가 : 당신은 당신이 다시 결과를 얻는 부분에 관심을 나타 내기 위해 여분을 추가하기 만하면 새로운 물건을 반환하지 않는 부분 만 또한 이전의 것. 그래서 당신은 스스로 차이점에 대한 점검을 구현해야합니다 ...