2012-03-08 234 views
2

我正在製作一個應用程序,它可以從用戶處獲取命令並實時寫入。什麼是我最好的選擇?第三方軟件如獅身人面像還是應該使用內置的(android語音識別)?語音識別Android應用程序

其次,我希望它能夠實時寫入,就像我說它開始寫入時一樣?

回答

6

您應該使用內置的Android語音識別功能。具體來說,您將需要操作SpeechRecognier API,以便沒有彈出對話框。

此外,不要期望SpeechRecognizer在onPartialResults()內返回任何內容。它很少。

你可以嘗試使用獅身人面像,但似乎其他開發者很難讓它在Android上運行。也就是說,如果您希望您的應用在沒有互聯網連接的情況下運行,獅身人面像將成爲您唯一的選擇。

這裏是一個代碼文檔片斷,您將需要使用SpeechRecognizer:

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

謝謝先生..但我不是很好的android編程..你能解釋一下如何實現這個代碼?我已經實現了對話出現的語音識別的正常代碼。如何用此代碼替換它? 在此先感謝:) – Shah 2012-03-10 07:15:29

+0

使用您爲對話框版本所做的相同意圖,而是調用我的recognitionDirectly方法。您還需要實現receiveWhatWasHeard()和recognitionFailure()以處理語音識別的結果。 – gregm 2012-03-10 16:01:54

+0

謝謝先生..我很高興聽到..我正在寫作方向..我的應用程序的第一個任務是現在完成..感謝你:) – Shah 2012-03-10 19:08:48

4

gregm是正確的,但問題的主要「實時寫」的部分沒有得到回答。您需要添加一個額外的,表明你有興趣在結果後面的越來越部分:

添加額外的意圖對我的作品

intent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true); 

警告:部分不返回唯一的新東西,但也是前一個。所以你需要自己執行差異檢查...