2012-04-03 9 views
7

Creé un servicio de reconocimiento de voz simple: para este propósito creé una subclase de android.speech.RecognitionService y creé una actividad para iniciar y detener este servicio.¿Cómo registrar un servicio de reconocimiento de voz personalizado?

Mi servicio de reconocimiento de voz personalizado usa trivialmente el reconocedor de voz predeterminado, porque mi objetivo es simplemente comprender cómo funcionan las clases RecognitionService y RecognitionService.Callback.

public class SimpleVoiceService extends RecognitionService { 

    private SpeechRecognizer m_EngineSR; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     Log.i("SimpleVoiceService", "Service started"); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     Log.i("SimpleVoiceService", "Service stopped"); 
    } 

    @Override 
    protected void onCancel(Callback listener) { 
     m_EngineSR.cancel(); 
    } 

    @Override 
    protected void onStartListening(Intent recognizerIntent, Callback listener) { 
     m_EngineSR.setRecognitionListener(new VoiceResultsListener(listener)); 
     m_EngineSR.startListening(recognizerIntent); 
    } 

    @Override 
    protected void onStopListening(Callback listener) { 
     m_EngineSR.stopListening(); 
    } 


    /** 
    * 
    */ 
    private class VoiceResultsListener implements RecognitionListener { 

     private Callback m_UserSpecifiedListener; 

     /** 
     * 
     * @param userSpecifiedListener 
     */ 
     public VoiceResultsListener(Callback userSpecifiedListener) { 
      m_UserSpecifiedListener = userSpecifiedListener; 
     } 

     @Override 
     public void onBeginningOfSpeech() { 
      try { 
       m_UserSpecifiedListener.beginningOfSpeech(); 
      } catch (RemoteException e) { 
       e.printStackTrace(); 
      } 
     } 

     @Override 
     public void onBufferReceived(byte[] buffer) { 
      try { 
       m_UserSpecifiedListener.bufferReceived(buffer); 
      } catch (RemoteException e) { 
       e.printStackTrace(); 
      } 
     } 

     @Override 
     public void onEndOfSpeech() { 
      try { 
       m_UserSpecifiedListener.endOfSpeech(); 
      } catch (RemoteException e) { 
       e.printStackTrace(); 
      } 
     } 

     @Override 
     public void onError(int error) { 
      try { 
       m_UserSpecifiedListener.error(error); 
      } catch (RemoteException e) { 
       e.printStackTrace(); 
      } 
     } 

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

     @Override 
     public void onPartialResults(Bundle partialResults) { 
      try { 
       m_UserSpecifiedListener.partialResults(partialResults); 
      } catch (RemoteException e) { 
       e.printStackTrace(); 
      } 
     } 

     @Override 
     public void onReadyForSpeech(Bundle params) { 
      try { 
       m_UserSpecifiedListener.readyForSpeech(params); 
      } catch (RemoteException e) { 
       e.printStackTrace(); 
      } 
     } 

     @Override 
     public void onResults(Bundle results) { 
      try { 
       m_UserSpecifiedListener.results(results); 
      } catch (RemoteException e) { 
       e.printStackTrace(); 
      } 
     } 

     @Override 
     public void onRmsChanged(float rmsdB) { 
      try { 
       m_UserSpecifiedListener.rmsChanged(rmsdB); 
      } catch (RemoteException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

} 

Comienzo y paro el servicio con la siguiente actividad.

public class VoiceServiceStarterActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Button startButton = new Button(this); 
     startButton.setText("Start the service"); 
     startButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { startVoiceService(); } 
     }); 
     Button stopButton = new Button(this); 
     stopButton.setText("Stop the service"); 
     stopButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { stopVoiceService(); } 
     }); 
     LinearLayout layout = new LinearLayout(this); 
     layout.setOrientation(LinearLayout.VERTICAL); 
     layout.addView(startButton); 
     layout.addView(stopButton); 
     setContentView(layout); 
    } 

    private void startVoiceService() { 
     startService(new Intent(this, SimpleVoiceService.class)); 
    } 

    private void stopVoiceService() { 
     stopService(new Intent(this, SimpleVoiceService.class)); 
    } 
} 

Finalmente declaró mi servicio en el AndroidManifest.xml (ver ejemplo VoiceRecognition dentro de la carpeta Android SDK).

<service android:name="SimpleVoiceService" 
     android:label="@string/service_name" > 

    <intent-filter> 
     <action android:name="android.speech.RecognitionService" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
    </intent-filter> 
</service> 

Luego instalado esta aplicación en un dispositivo Android y lo comienzo: - cuando inicio el servicio, se inicia correctamente; - cuando lo detengo, se detiene correctamente.

Pero si ejecuto el siguiente código en otra actividad, el activitiesList contiene solo un elemento, que es el reconocedor de voz predeterminado.

PackageManager pm = getPackageManager(); 
List<ResolveInfo> activities = pm.queryIntentActivities(
      new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0); 

¿Por qué mi reconocedor de voz no regresaron entre los presentes en el sistema?

+1

¿Esto nos permitirá anular 'Google Now' default RecognitionService? Quiero decir, ¿puedo conectar mi propio servicio de reconocimiento extendido para google ahora? –

+1

¿Funcionó onStartListening Started cuando inició el servicio SimpleVoiceSearch? @ enzom83 –

Respuesta

7

Si desea queryIntentActivities(new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0) para recoger a su actividad (VoiceServiceStarterActivity) entonces usted tiene que declarar en el manifiesto de la aplicación que esta actividad se encarga RecognizerIntent.ACTION_RECOGNIZE_SPEECH, como este

<activity android:name="VoiceServiceStarterActivity"> 
    <intent-filter> 
    <action android:name="android.speech.action.RECOGNIZE_SPEECH" /> 
    <category android:name="android.intent.category.DEFAULT" /> 
    </intent-filter> 
    ... 
</activity> 

Para el código más concreta a echar un vistazo en el proyecto Kõnele (source code) que es esencialmente una implementación de código abierto de las interfaces a través de los que se proporciona el reconocimiento de voz en Android, es decir, abarca:

  • ACTION_RECOGNIZE_ DISCURSO
  • ACTION_WEB_SEARCH
  • RecognitionService

y utiliza los servidores de reconocimiento de voz de código abierto.

+1

No entiendo por qué debería crear una nueva actividad. Actualmente tengo una actividad ('VoiceDemoActivity') que maneja el reconocedor de voz predeterminado a través de un objeto' SpeechRecognizer'. Para usar un servicio personalizado de reconocimiento de voz, tengo que crear un nuevo objeto 'SpeechRecognizer' que especifique un objeto' ComponentName' en el método 'createSpeechRecognizer': supongo que este' ComponentName' debe referirse al servicio personalizado de reconocimiento de voz, por lo que Creé una nueva clase 'RecognitionService'.¿Por qué tengo que implementar otra actividad que pueda manejar el intento 'ACTION_RECOGNIZE_SPEECH'? – enzom83

+2

Mejoré un poco mi respuesta, tal vez lo hizo un poco más claro. – Kaarel

+0

@Kaarel Me gusta mucho lo que hiciste en Kõnele (aunque no conozco el idioma estonio). Descargué el código fuente de github para aprender, por ejemplo, cómo implementar el mío (solo en inglés), pero no se compilará de la caja y la aplicación lanzada (descargada de Google Play) se queda en * Transcripción. .. "*. ¿Dónde puedo obtener más información sobre la estructura de su código (3 paquetes diferentes) y * por qué * se implementa tal como es? ¡Gracias! – ripopenid

0

Sí, es necesario utilizar createSpeechRecognizer (contexto Contexto, ComponentName ServiceComponent)

Cuestiones relacionadas