2012-08-03 13 views
38

Hay muchos tutoriales en línea para agregar reconocimiento de voz a una aplicación de Android. A menudo son confusos y los editores de la codificación nunca están disponibles para preguntas. Necesito un tutorial simple con una codificación completa para agregar reconocimiento de voz a mi aplicación.Cómo hacer: comandos de voz en una aplicación de Android

Respuesta

74

Si desea agregar el reconocimiento de voz a la aplicación de Android de su grupo, es muy simple.

A lo largo de este tutorial, deberá agregar las importaciones a medida que pegue el código.

  1. cree un archivo xml o utilice uno existente y asegúrese de agregar un botón y una vista de lista.
  2. en una clase de Java necesita extender la actividad e implementar OnClickListener Aparecerá un error que indica que tiene métodos no implementados. Desplázate sobre ella y agrega los métodos no implementados. Añadiremos a esto más tarde.
  3. A continuación, configure el botón y la vista de lista en su java.

    public ListView mList; 
    public Button speakButton; 
    

    también añadir:

    public static final int VOICE_RECOGNITION_REQUEST_CODE = 1234; 
    
  4. A continuación, crea un método OnCreate y configurar el botón y el oyente.

    speakButton = (Button) findViewById(R.id.btn_speak); 
    speakButton.setOnClickListener(this); 
    

    también añadir este método (vamos a configurarlo siguiente)

    voiceinputbuttons(); 
    

    Recuerde setContentView para el XML que están mostrando.

  5. Fuera de su oncreate, haga un nuevo método que se vea así.

    public void voiceinputbuttons() { 
        speakButton = (Button) findViewById(R.id.btn_speak); 
        mList = (ListView) findViewById(R.id.list); 
    } 
    
  6. Ahora tendrá que configurar su actividad de reconocimiento de voz utilizando el siguiente código.

    public void startVoiceRecognitionActivity() { 
        Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
        intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, 
         RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
        intent.putExtra(RecognizerIntent.EXTRA_PROMPT, 
         "Speech recognition demo"); 
        startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE); 
    } 
    
  7. A continuación, dentro de su método onclick del paso 2 añadir la actividad desde el paso 6.

    startVoiceRecognitionActivity(); 
    
  8. A continuación vamos a tener que establecer otro método. Copie y pegue el siguiente código.

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
        if (requestCode == VOICE_RECOGNITION_REQUEST_CODE && resultCode == RESULT_OK) { 
         ArrayList<String> matches = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); 
         mList.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, matches)); 
    

    coincidencias es el resultado de la entrada de voz. Es una lista de lo que posiblemente dijo el usuario. El uso de una declaración if para la palabra clave que desea usar permite el uso de cualquier actividad si las palabras clave coinciden, es posible configurar varias palabras clave para usar la misma actividad, de modo que más de una palabra permitirá al usuario Usar la actividad (lo hace tan el usuario no tiene que memorizar palabras de una lista) Para usar una actividad de la información de entrada de voz simplemente use el siguiente formato;

    if (matches.contains("information")) { 
        informationmenu(); 
    } 
    

    NOTA: puede formatear el código en cualquier momento presionando ctrl + shift + F en eclipse.

  9. Ahora vamos a configurar nuestro método utilizado por el código en el paso 8.Este código crea un intento de dirigir al usuario a un nuevo menú. Necesitarás otra clase xml y java para esto. Además, recuerde agregar una actividad a su manifiesto.

    public void informationMenu() { 
        startActivity(new Intent("android.intent.action.INFOSCREEN")); 
    } 
    
  10. Finalmente, será necesario establecer algún código que le permiten al usuario saber si el micrófono está en funcionamiento. Pegue este código dentro del método OnCreate al final.

    // Check to see if a recognition activity is present 
    // if running on AVD virtual device it will give this message. The mic 
    // required only works on an actual android device 
    PackageManager pm = getPackageManager(); 
    List activities = pm.queryIntentActivities(new Intent(
    RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0); 
    if (activities.size() != 0) { 
        voiceButton.setOnClickListener(this); 
    } else { 
        voiceButton.setEnabled(false); 
        voiceButton.setText("Recognizer not present"); 
    } 
    

NOTA FINAL: reconocimiento de voz no funciona en un emulador virtual porque no pueden acceder al micrófono en su computadora. El reconocimiento de voz solo funcionará con una conexión a Internet.

Esto es aprox. cómo debería ser tu código final en tu java.

package com.example.com.tutorialthread; 

import java.util.ArrayList; 

import android.os.Bundle; 
import android.app.Activity; 
import android.content.Intent; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.ListView; 
import android.speech.RecognizerIntent; 
import android.support.v4.app.NavUtils; 

public class main extends Activity implements OnClickListener { 

public ListView mList; 
public Button speakButton; 

public static final int VOICE_RECOGNITION_REQUEST_CODE = 1234; 

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

    speakButton = (Button) findViewById(R.id.btn_speak); 
    speakButton.setOnClickListener(this); 

    voiceinputbuttons(); 
} 

public void informationMenu() { 
    startActivity(new Intent("android.intent.action.INFOSCREEN")); 
} 

public void voiceinputbuttons() { 
    speakButton = (Button) findViewById(R.id.btn_speak); 
    mList = (ListView) findViewById(R.id.list); 
} 

public void startVoiceRecognitionActivity() { 
    Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, 
     RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
    intent.putExtra(RecognizerIntent.EXTRA_PROMPT, 
     "Speech recognition demo"); 
    startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE); 
} 

public void onClick(View v) { 
    // TODO Auto-generated method stub 
    startVoiceRecognitionActivity(); 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if (requestCode == VOICE_RECOGNITION_REQUEST_CODE && resultCode == RESULT_OK) { 
     // Fill the list view with the strings the recognizer thought it 
     // could have heard 
     ArrayList matches = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); 
     mList.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, matches)); 
     // matches is the result of voice input. It is a list of what the 
     // user possibly said. 
     // Using an if statement for the keyword you want to use allows the 
     // use of any activity if keywords match 
     // it is possible to set up multiple keywords to use the same 
     // activity so more than one word will allow the user 
     // to use the activity (makes it so the user doesn't have to 
     // memorize words from a list) 
     // to use an activity from the voice input information simply use 
     // the following format; 
     // if (matches.contains("keyword here") { startActivity(new 
     // Intent("name.of.manifest.ACTIVITY") 

     if (matches.contains("information")) { 
      informationMenu(); 
     } 
    } 
} 
+1

Eres increíble ... buen tutorial – Pragnani

+5

@Sam Es bueno para la conexión a Internet. pero, ¿hay algo así como el suyo sin conexión a Internet? Lo quiero para comandos simples como: abrir el cuadro de mensaje '' abrir navegador '' abrir el teclado 'etc. – stack

+0

@stack ¿Usar la integración con Google Now? – milosmns

5

Muy buen tutorial. Bien hecho.

para completar un poco más:

es necesario agregar el permiso para su manifiestan como sigue

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

Además voz no funciona si tiene

launchMode="singleInstance" o launchMode="singleTask" que parece debería ser "estándar"

Cuestiones relacionadas