2013-11-01 215 views
4

我將嘗試使用谷歌沒有對話框中的語音識別與RecognitionListener 但不啓動時的application.I只能發出蜂鳴聲已添加權限音頻記錄和互聯網進入清單file.I希望你告訴我,幫我找錯了......我還沒有錯誤日誌上的貓......我想打一個循環,當用戶問好舉杯顯示了mesage Regognition OK和列表視圖中顯示結果。語音識別

public class MainActivity extends Activity implements RecognitionListener 
{ 

private ListView wordsList; 

private SpeechRecognizer mSpeechRecognizer; 
private Intent mSpeechRecognizerIntent; 


protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(this); 
    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()); 

    wordsList = (ListView) findViewById(R.id.listView1); 

    mSpeechRecognizer.startListening(mSpeechRecognizerIntent); 

} 


    public void onBeginningOfSpeech(){ } 

     public void onBufferReceived(byte[] buffer){ } 

     public void onEndOfSpeech(){ } 

     public void onError(int error){ 

      //mSpeechRecognizer.startListening(mSpeechRecognizerIntent); 

    } 

    public void onEvent(int eventType, Bundle params){ } 


    public void onPartialResults(Bundle partialResults){ } 


    public void onReadyForSpeech(Bundle params){ 


     Toast.makeText(getBaseContext(), "Voice recording starts", Toast.LENGTH_SHORT).show(); 

    } 

    public void onResults(Bundle results) 
    { 

     ArrayList<String> matches = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); 


     wordsList.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, matches)); 


     if (matches.contains("hello") { 

      Toast.makeText(getBaseContext(), "Recognision OK!!!", Toast.LENGTH_SHORT).show(); 

      } 

    } 

    public void onRmsChanged(float rmsdB) { } 

    } 
+0

嘗試在onResult中使用matches.get(0) – Meenal

+0

我不認爲這是問題...因爲在演講開始時不顯示Toast「錄音開始」......我使用Samsung S4。 .. – user2342687

+0

請參見教程:http://www.truiton.com/2014/06/android-speech-recognition-without-dialog-custom-activity/在Truiton – kenorb

回答

3

你已經錯過了:

mSpeechRecognizer.setRecognitionListener(); 

的參數將是要麼是其實現監聽,或你所創建的自定義偵聽範圍內。

目前你的代碼沒有設置監聽器,你只需要監聽的代碼。

編輯:如果你不執行RecognitionListener,那麼你可以這樣來做:

mSpeechRecognizer.setRecognitionListener(new RecognitionListener() { 

           @Override 
           public void onBeginningOfSpeech() { 
            // TODO Auto-generated method stub 

           } 

           @Override 
           public void onBufferReceived(byte[] arg0) { 
            // TODO Auto-generated method stub 

           } 

           @Override 
           public void onEndOfSpeech() { 
            // TODO Auto-generated method stub 

           } 

           @Override 
           public void onError(int arg0) { 
            // TODO Auto-generated method stub 

           } 

           @Override 
           public void onEvent(int arg0, Bundle arg1) { 
            // TODO Auto-generated method stub 

           } 

           @Override 
           public void onPartialResults(Bundle partialResults) { 
            // TODO Auto-generated method stub 

           } 

           @Override 
           public void onReadyForSpeech(Bundle params) { 
            // TODO Auto-generated method stub 

           } 

           @Override 
           public void onResults(Bundle results) { 
            // TODO Auto-generated method stub 

           } 

           @Override 
           public void onRmsChanged(float rmsdB) { 
            // TODO Auto-generated method stub 

           } 

          }); 
+0

好mSpeechRecognizer.setRecognitionListener(聽者);我必須爲聽衆提供什麼? – user2342687

+1

由於您的代碼'實現了RecognitionListener',我認爲'this'將是正確的用法。我會編輯我的答案以另一種方式顯示。 – brandall

+0

Ok works mSpeechRecognizer.setRecognitionListener(this);非常感謝你!!!!!!!!!!! – user2342687

8

試試這個代碼

import java.util.ArrayList; 

import android.speech.RecognitionListener; 
import android.speech.RecognizerIntent; 
import android.speech.SpeechRecognizer; 
import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.CompoundButton; 
import android.widget.CompoundButton.OnCheckedChangeListener; 
import android.widget.ProgressBar; 
import android.widget.TextView; 
import android.widget.ToggleButton; 

public class VoiceRecognitionActivity extends Activity implements RecognitionListener { 

    private TextView returnedText; 
    private ToggleButton toggleButton; 
    private ProgressBar progressBar; 
    private SpeechRecognizer speech = null; 
    private Intent recognizerIntent; 
    private String LOG_TAG = "VoiceRecognitionActivity"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_voice_recognition); 
     returnedText = (TextView) findViewById(R.id.textView1); 
     progressBar = (ProgressBar) findViewById(R.id.progressBar1); 
     toggleButton = (ToggleButton) findViewById(R.id.toggleButton1); 

     progressBar.setVisibility(View.INVISIBLE); 
     speech = SpeechRecognizer.createSpeechRecognizer(this); 
     speech.setRecognitionListener(this); 
     recognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
     recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE,"en"); 
     recognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,this.getPackageName()); 
     recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH); 
recognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,this.getPackageName()); 

recognizerIntent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 3); 

     toggleButton.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(CompoundButton buttonView, 
        boolean isChecked) { 
       if (isChecked) { 
        progressBar.setVisibility(View.VISIBLE); 
        progressBar.setIndeterminate(true); 
        speech.startListening(recognizerIntent); 
       } else { 
        progressBar.setIndeterminate(false); 
        progressBar.setVisibility(View.INVISIBLE); 
        speech.stopListening(); 
       } 
      } 
     }); 

    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     if (speech != null) { 
      speech.destroy(); 
      Log.i(LOG_TAG, "destroy"); 
     } 

    } 

    @Override 
    public void onBeginningOfSpeech() { 
     Log.i(LOG_TAG, "onBeginningOfSpeech"); 
     progressBar.setIndeterminate(false); 
     progressBar.setMax(10); 
    } 

    @Override 
    public void onBufferReceived(byte[] buffer) { 
     Log.i(LOG_TAG, "onBufferReceived: " + buffer); 
    } 

    @Override 
    public void onEndOfSpeech() { 
     Log.i(LOG_TAG, "onEndOfSpeech"); 
     progressBar.setIndeterminate(true); 
     toggleButton.setChecked(false); 
    } 

    @Override 
    public void onError(int errorCode) { 
     String errorMessage = getErrorText(errorCode); 
     Log.d(LOG_TAG, "FAILED " + errorMessage); 
     returnedText.setText(errorMessage); 
     toggleButton.setChecked(false); 
    } 

    @Override 
    public void onEvent(int arg0, Bundle arg1) { 
     Log.i(LOG_TAG, "onEvent"); 
    } 

    @Override 
    public void onPartialResults(Bundle arg0) { 
     Log.i(LOG_TAG, "onPartialResults"); 
    } 

    @Override 
    public void onReadyForSpeech(Bundle arg0) { 
     Log.i(LOG_TAG, "onReadyForSpeech"); 
    } 

    @Override 
    public void onResults(Bundle results) { 
     Log.i(LOG_TAG, "onResults"); 
     ArrayList<String> matches = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); 
     String text = ""; 
     for (String result : matches) 
      text += result + "\n"; 

     returnedText.setText(text); 
    } 

    @Override 
    public void onRmsChanged(float rmsdB) { 
     Log.i(LOG_TAG, "onRmsChanged: " + rmsdB); 
     progressBar.setProgress((int) rmsdB); 
    } 

    public static String getErrorText(int errorCode) { 
     String message; 
     switch (errorCode) { 
     case SpeechRecognizer.ERROR_AUDIO: 
      message = "Audio recording error"; 
      break; 
     case SpeechRecognizer.ERROR_CLIENT: 
      message = "Client side error"; 
      break; 
     case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS: 
      message = "Insufficient permissions"; 
      break; 
     case SpeechRecognizer.ERROR_NETWORK: 
      message = "Network error"; 
      break; 
     case SpeechRecognizer.ERROR_NETWORK_TIMEOUT: 
      message = "Network timeout"; 
      break; 
     case SpeechRecognizer.ERROR_NO_MATCH: 
      message = "No match"; 
      break; 
     case SpeechRecognizer.ERROR_RECOGNIZER_BUSY: 
      message = "RecognitionService busy"; 
      break; 
     case SpeechRecognizer.ERROR_SERVER: 
      message = "error from server"; 
      break; 
     case SpeechRecognizer.ERROR_SPEECH_TIMEOUT: 
      message = "No speech input"; 
      break; 
     default: 
      message = "Didn't understand, please try again."; 
      break; 
     } 
     return message; 
    } 

} 

activity_voice_recognition.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <ImageView 
     android:id="@+id/imageView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_centerHorizontal="true" 
     android:src="@drawable/ic_launcher" /> 

    <ProgressBar 
     android:id="@+id/progressBar1" 
     style="?android:attr/progressBarStyleHorizontal" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_below="@+id/toggleButton1" 
     android:layout_marginTop="28dp" 
     android:paddingLeft="10dp" 
     android:paddingRight="10dp" /> 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/progressBar1" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="47dp" /> 

    <ToggleButton 
     android:id="@+id/toggleButton1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="26dp" 
     android:text="ToggleButton" /> 

</RelativeLayout> 

AndroidManifest。 xml

<manifest 
xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.rakesh.voicerecognitionexample" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="15" /> 

<uses-permission android:name="android.permission.RECORD_AUDIO"/> 
<uses-permission android:name="android.permission.INTERNET" /> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 

     <activity 
      android:name=".VoiceRecognitionActivity" 
      android:label="@string/title_activity_voice_recognition" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 
+0

很棒的答案。在android 6中,在使用語音API之前,需要權限'Manifest.permission.RECORD_AUDIO' –