2009-11-09 15 views
6

Quiero usar la API de texto a api en Android, pero no quiero que me frenen esos cuadros de diálogo. ¿Es posible usar la funcionalidad sin ellos?¿Es posible utilizar el reconocimiento de voz de Android sin mostrar el cuadro de diálogo?

+0

posible duplicado de [¿Cómo puedo utilizar el reconocimiento de voz sin la molestia de diálogo en teléfonos Android ] (http://stackoverflow.com/questions/6316937/how-can-i-use-speech-recognition-without-the-annoying-dialog-in-android-phones) –

Respuesta

-1

The Intent para el reconocimiento de voz muestra el diálogo y no hay opciones para desactivar mostrarlo.

También debe saber que la función de reconocimiento de voz requiere una conexión a Internet para que el sonido pueda cargarse en Google para su reconocimiento.

+0

¿Qué hay de la API de Google? ¿Existe como un servicio web para convertir audio a texto? Si es así, ¿es eso lo que usa el intento de Android? – mobibob

+1

http://stackoverflow.com/a/10200568/679180 – srf

+0

Estoy bastante seguro de que la cosa sobre la necesidad de conectarse a Internet es incorrecta. Apagué el wifi de mi dispositivo y lo puse en modo wifi, y aún así funcionó. Si usa FREE_FORM para RecognitionIntent, no debería requerir internet. – FateNuller

20

sí es posible:

Usted puede utilizar la clase SpeechRecognizer de la API. Asegúrate de que se usa en el hilo principal, según se requiera de acuerdo con la API, y que tu clase implemente el 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

esto reconocerá el habla solo la primera vez, cómo continuar reconociendo el habla .... –

+0

@PradeepSodhi ¿Lo descubriste pradeep? ¡Por favor hagamelo saber! –

+0

Podría volver a llamar a speech.startListening (...) si definió la intención de proporcionarse y el SpeechRecognizer dentro de la clase, en lugar del método onCreate. (Ya no estoy usando el habla, así que es solo una suposición.) – Knots

7

tratar este código

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> 
Cuestiones relacionadas