¿Cómo registrar un servicio de reconocimiento de voz personalizado?

He creado un servicio de reconocimiento de voz simple: para este propósito he creado una subclase de android.speech.RecognitionService y he creado una actividad para iniciar y detener este servicio.

Mi servicio de reconocimiento de voz personalizado utiliza trivialmente el reconocedor de voz predeterminado, porque mi objetivo es simplemente entender 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 dejo el servicio usando la actividad siguiente.

 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 AndroidManifest.xml (véase el ejemplo de VoiceRecognition dentro de la carpeta SDK de Android).

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

Entonces instalé esta aplicación en un dispositivo androide y comienzo: – cuando comienzo el servicio, él comienza correctamente; – cuando lo detengo, se detiene correctamente.

Pero si lanzo el siguiente código en otra actividad, la List activities contiene sólo 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é no se devuelve mi identificador de voz entre los presentes en el sistema?

Si quieres queryIntentActivities(new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0) para recoger tu actividad ( VoiceServiceStarterActivity ), entonces tienes que declarar en el Manifiesto de tu aplicación que esta actividad maneja RecognizerIntent.ACTION_RECOGNIZE_SPEECH , así

 <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 obtener un código más concreto, eche un vistazo al proyecto Kõnele ( código fuente ) que es esencialmente una implementación de código abierto de las interfaces a través de las cuales se proporciona el reconocimiento de voz en Android, es decir, cubre:

  • ACTION_RECOGNIZE_SPEECH
  • ACTION_WEB_SEARCH
  • ReconocimientoServicio

Y utiliza servidores de reconocimiento de voz de código abierto.

Sí, necesitas usar createSpeechRecognizer (Contexto contextual, ComponentName serviceComponent)

  • Android: escucha los mensajes SMS entrantes
  • Uso de Service, TimerTask y BroadcastReceiver para comprobar si hay varias actualizaciones
  • Diferencia entre RTC y RTC_WAKEUP en android
  • Servicio enlazado de Android: ¿debo reconectar manualmente en onServiceDisconnected o intento reconectar automáticamente?
  • StopService () detendrá un servicio de primer plano?
  • ¿Está garantizado un servicio android para llamar a onDestroy ()?
  • Android - ¿Por qué se ejecutan varias instancias de este servicio
  • Establecer un Listener en una clase basada en servicio
  • ¿Cómo ejecutar el servicio no en el hilo principal?
  • Análisis BLE de Android en el servicio de fondo
  • Vibrar en la notificación push
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.