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

  • ¿Cómo ejecutar un servicio singleton (compartido) en una biblioteca para múltiples aplicaciones?
  • ¿Está garantizado un servicio android para llamar a onDestroy ()?
  • Servicio que no se está creando (o que se conecta) después de bindService ()
  • Cómo agregar un servicio de sistema a Android Framework
  • Espera en startService antes de bindService
  • Lanzar el servicio desde el inicio de la aplicación, sin actividad
  • ¿Cómo puedo guardar datos del servicio de Android?
  • ¿Cómo implementar funcionalidades como Facebook "New Story" característica?
  • Descargar varios archivos con una barra de progreso en ListView Android
  • Problemas con la vinculación al servicio en Android
  • Relación de actividad y servicio de Android: después de Pausa, después de Parar
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.