android speech-recognition android-5.0-lollipop

Ejemplo de AlwaysOnHotwordDetector en Android



speech-recognition android-5.0-lollipop (1)

A menos que tenga un punto ciego enorme, no creo que las aplicaciones de terceros puedan hacer uso de esta API. Es extraño que AlwaysOnHotwordDetector (y las clases relacionadas VoiceInteractionService, etc.) tengan acceso público.

Si está creando una aplicación privilegiada , examine estos proyectos de prueba desde AOSP:

Mientras trataba de hacer este trabajo, encontré esto:

Constructor AlwaysOnHotwordDetector''s :

/** * @param text The keyphrase text to get the detector for. * @param locale The java locale for the detector. * @param callback A non-null Callback for receiving the recognition events. * @param voiceInteractionService The current voice interaction service. * @param modelManagementService A service that allows management of sound models. * * @hide */ public AlwaysOnHotwordDetector(String text, Locale locale, Callback callback, KeyphraseEnrollmentInfo keyphraseEnrollmentInfo, IVoiceInteractionService voiceInteractionService, IVoiceInteractionManagerService modelManagementService) { mText = text; mLocale = locale; mKeyphraseEnrollmentInfo = keyphraseEnrollmentInfo; mKeyphraseMetadata = mKeyphraseEnrollmentInfo.getKeyphraseMetadata(text, locale); mExternalCallback = callback; mHandler = new MyHandler(); mInternalCallback = new SoundTriggerListener(mHandler); mVoiceInteractionService = voiceInteractionService; mModelManagementService = modelManagementService; new RefreshAvailabiltyTask().execute(); }

La declaración de interés aquí es:

mKeyphraseMetadata = mKeyphraseEnrollmentInfo.getKeyphraseMetadata(text, locale);

¿Qué hace KeyphraseEnrollmentInfo#getKeyphraseMetadata(String, Locale) ?

/** * Gets the {@link KeyphraseMetadata} for the given keyphrase and locale, null if any metadata * isn''t available for the given combination. * * @param keyphrase The keyphrase that the user needs to be enrolled to. * @param locale The locale for which the enrollment needs to be performed. * This is a Java locale, for example "en_US". * @return The metadata, if the enrollment client supports the given keyphrase * and locale, null otherwise. */ public KeyphraseMetadata getKeyphraseMetadata(String keyphrase, Locale locale) { if (mKeyphrases == null || mKeyphrases.length == 0) { Slog.w(TAG, "Enrollment application doesn''t support keyphrases"); return null; } for (KeyphraseMetadata keyphraseMetadata : mKeyphrases) { // Check if the given keyphrase is supported in the locale provided by // the enrollment application. if (keyphraseMetadata.supportsPhrase(keyphrase) && keyphraseMetadata.supportsLocale(locale)) { return keyphraseMetadata; } } Slog.w(TAG, "Enrollment application doesn''t support the given keyphrase/locale"); return null; }

En este punto, mi proyecto de ejemplo seguía diciéndome: Enrollment application doesn''t support keyphrases . Por lo tanto, profundizando un poco más: para admitir frases clave, debemos proporcionar metadatos adicionales:

// Taken from class KeyphraseEnrollmentInfo /** * Name under which a Hotword enrollment component publishes information about itself. * This meta-data should reference an XML resource containing a * <code>&lt;{@link * android.R.styleable#VoiceEnrollmentApplication * voice-enrollment-application}&gt;</code> tag. */ private static final String VOICE_KEYPHRASE_META_DATA = "android.voice_enrollment";

Además, necesitaremos el permiso android.permission.MANAGE_VOICE_KEYPHRASES . Aquí es donde el proyecto de ejemplo se atasca:

<!-- Must be required by hotword enrollment application, to ensure that only the system can interact with it. @hide <p>Not for use by third-party applications.</p> --> <permission android:name="android.permission.MANAGE_VOICE_KEYPHRASES" android:label="@string/permlab_manageVoiceKeyphrases" android:description="@string/permdesc_manageVoiceKeyphrases" android:protectionLevel="signature|system" />

El permiso requerido para admitir la detección de palabras activas no está disponible para aplicaciones de terceros. Todavía no puedo entender por qué el paquete android.service.voice package tiene acceso público. Quizás me esté perdiendo algo aquí.

¿Puede alguien proporcionar un ejemplo de cómo usar la nueva clase AlwaysOnHotwordDetector en Android?

Me gustaría crear una aplicación que, cuando se ejecuta en segundo plano, puede detectar una palabra clave como "siguiente", "atrás" o "pausa".