2009-11-09 54 views
6

我想在android中使用語音文本API,但我不想被這些對話框放慢速度。有沒有可能使用這些功能?是否可以使用android的語音識別而不顯示對話框?

+0

可能重複[我怎樣可以使用語音識別沒有惱人的對話框在Android手機](http://stackoverflow.com/questions/6316937/how-can-i-use-speech-recognition-without-the-annoying-dialog-in-android-phones) – 2015-06-18 08:43:15

回答

-1

的語音識別號

The Intent顯示的對話框,並沒有選項來禁用顯示它。

您還應該知道語音識別功能需要互聯網連接才能將聲音上傳到Google以供識別。

+0

谷歌API呢?它是否存在爲將音頻轉換爲文本的web服務?如果是這樣,Android的意圖是什麼? – mobibob 2011-03-05 08:07:56

+1

http://stackoverflow.com/a/10200568/679180 – srf 2012-12-20 03:03:57

+0

我很確定需要連接到互聯網的事情是錯誤的。我把我的設備上的無線設備關掉,並把它放到wifi模式,它仍然工作。如果您使用FREE_FORM進行RecognitionIntent,則不需要互聯網。 – FateNuller 2014-05-17 19:21:27

20

是的,這是可能的:

您可以使用API​​中的SpeechRecognizer類。 確保它在主線程中使用 - 根據API要求 - 並且您的類實現了RecognitionListener。

private SpeechRecognizer speech; 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    speech = SpeechRecognizer.createSpeechRecognizer(this); 
    speech.setRecognitionListener(this); 

    Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE, "en"); 
    intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, 
     this.getPackageName()); 

    speech.startListening(intent); 
} 

@Override 
public void onBeginningOfSpeech() 
{ 
} 

@Override 
public void onBufferReceived(byte[] arg0) 
{ 
} 

@Override 
public void onEndOfSpeech() 
{ 
} 

@Override 
public void onError(int e) 
{ 
} 

@Override 
public void onEvent(int arg0, Bundle arg1) 
{ 
} 

@Override 
public void onPartialResults(Bundle arg0) 
{ 
} 

@Override 
public void onReadyForSpeech(Bundle arg0) 
{ 
} 

@Override 
public void onResults(Bundle data) 
{ 
    ArrayList<String> matches = data.getStringArrayList(
     SpeechRecognizer.RESULTS_RECOGNITION); 

    // Do something useful with the matches =) 
    // ... 
} 

@Override 
public void onRmsChanged(float arg0) 
{ 
} 
+0

這將只識別第一次講話,如何連續識別講話...... – 2014-03-31 06:48:24

+0

@PradeepSodhi你知道嗎pradeep?請告訴我! – 2016-01-11 01:38:17

+0

如果您定義了在類中提供的意圖和SpeechRecognizer,而不是onCreate方法,則可以再次調用speech.startListening(...)。 (我不再使用語音,所以這只是一個猜測。) – Knots 2016-01-13 09:29:19

7

試試這個代碼

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_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>