¿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
.
- ¿Por qué otro servicio encima de IMarketBillingService?
- PeekService () devuelve null aunque el servicio se está ejecutando, si el servicio es reiniciado por el sistema después de matar OOM
- No se puede activar la aplicación desde el fondo en dispositivos Xiaomi hasta que "Autostart" se habilite manualmente
- Uso de Job Scheduler en la API de Android <21
- ¿Es posible simular servicios de android bajo pruebas de unidad?
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?
- ¿Cómo ejecuto un método de servicio periódicamente?
- ¿Cómo comprobar es la aplicación en primer plano de servicio?
- ¿Cuál es la forma preferida de volver a llamar a una actividad de Android desde un subproceso de servicio
- Buscador de reproductores multimedia Android
- Android: ¿Cuándo usar Service vs Singleton?
- Servicio de detector de balizas de estimación en segundo plano
- Aclaración de setUpdateCurrent en OneOffTask
- ¿Cómo puedo compartir un servicio entre actividades sin que se reinicie?
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)
- ¿Tengo que cerrar el dominio en una base por hilo, o por uso / clase-base?
- MediaPlayer de Android setNextMediaPlayer () alternativa