Cómo consultar el SpeechRecognizer predeterminado
¿Cómo averiguar el ComponentName del reconocedor de voz del sistema por defecto, es decir, el que se devuelve cuando se llama createSpeechRecognizer (Context context) ? (En realidad, sólo necesito averiguar qué idiomas de entrada soporta, así que si sólo hay una respuesta a eso, también lo agradecería.)
El marco resuelve esto
- Desarrollo de aplicaciones similares a "Google ahora" - ¿es posible utilizar el reconocimiento de voz sin entrada de teclado?
- OnServiceConnected nunca llamado después del método bindService
- Reconocimiento de voz como servicio de fondo
- Lista de comandos de voz que activan la comprobación del ritmo cardíaco
- ¿Cómo detectar si el discurso al texto está disponible en android?
String serviceComponent = Settings.Secure.getString(mContext.getContentResolver(), Settings.Secure.VOICE_RECOGNITION_SERVICE);
(Consulte el código fuente de SpeechRecognizer .)
Sin embargo, esta solución no parece estar disponible para una aplicación de terceros.
- Error de conexión de reconocimiento de voz
- Android: ¿Es posible reposicionar la ventana emergente de reconocimiento de voz?
- ¿Qué versión de Android introdujo la señal audible de SpeechRecognizer onReadyForSpeech?
- RecognizerIntent no funciona; "Falta paquete de llamada extra"
- Reconocimiento de sonido en Android
- ¿Hay algún equivalente para el uso RemoteInput.setChoices, pero para el teléfono?
- Cómo implementar un reconocedor de voz en android- "Reconocimiento no presente"?
- Código fuente de reconocimiento de voz google
Sin embargo, esta solución no parece estar disponible para una aplicación de terceros.
Supongo que llegó a tal conclusión porque Settings.Secure.VOICE_RECOGNITION_SERVICE
no es una API pública. Sin embargo, Settings.Secure.getString()
requiere nombre de la fila para buscar en tabla segura para el segundo argumento. Así, simplemente puede proporcionar el nombre real de la fila que está buscando: "voice_recognition_service" .
Es decir, puede usar el mismo código de SpeechRecognizer
con un ligero cambio:
String serviceComponent = Settings.Secure.getString(mContext.getContentResolver(), "voice_recognition_service");
Espero que esto ayude.
ACTUALIZACIÓN (he leído mal la pregunta original)
SpeechRecognizer no es la cosa que está haciendo el procesamiento del habla, la Intención que pasa a SpeechRecognizer, sin embargo, es (vía startListening(Intent intent)
). Esa intención utiliza RecognizerIntent.ACTION_RECOGNIZE_SPEECH
y, AFAIK, se pueden detectar de la manera pasada de moda.
Para detectar los valores predeterminados, intente resolver el Intent que desea que encuentre el valor predeterminado pero con el conjunto PackageManager.MATCH_DEFAULT_ONLY
.
Código no probado:
String detectDefaultSpeechRecognizer(Context context) { final Intent speechIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); // 1: Try to find the default speech intent final ResolveInfo defaultResolution = context.getPackageManager().resolveService(speechIntent, PackageManager.MATCH_DEFAULT_ONLY); if (defaultResolution != null) { final ActivityInfo activity = defaultResolution.activityInfo; if (!activity.name.equals("com.android.internal.app.ResolverActivity")) { //ResolverActivity was launched so there is no default speech recognizer return ""; } } // 2: Try to find anything that we can launch speech recognition with. Pick up the first one that can. final List<ResolveInfo> resolveInfoList = context.getPackageManager().queryIntentServices(speechIntent, PackageManager.MATCH_DEFAULT_ONLY); if (!resolveInfoList.isEmpty()) { speechIntent.setClassName(resolveInfoList.get(0).activityInfo.packageName, resolveInfoList.get(0).activityInfo.name); return resolveInfoList.get(0).activityInfo.packageName; } return ""; }
ANTIGUA RESPUESTA
Echa un vistazo a GAST, tiene una manera de comprobar si un idioma es compatible con un reconocedor de voz.
https://github.com/gast-lib/gast-lib/blob/master/library/src/root/gast/speech/SpeechRecognizingActivity.java#L70
También puede intentar comprobar manualmente la etiqueta de metadatos <recognition-service>
. http://developer.android.com/reference/android/speech/RecognitionService.html#SERVICE_META_DATA
Si sólo desea averiguar qué idiomas de entrada admite el reconocedor de voz del sistema predeterminado ( createSpeechRecognizer (Context context)
), existe una manera más sencilla de hacerlo.
Todo lo que necesitas hacer es usar una intención RecognizerIntent.getVoiceDetailsIntent
que compruebe los lenguajes predeterminados del reconocedor de voz del sistema:
Intent intent = RecognizerIntent.getVoiceDetailsIntent(getApplicationContext()); if (intent != null) { ctx.sendOrderedBroadcast(intent, null, new BroadcastReceiver() { @Override public void onReceive(Context context, final Intent intent) { Log.d(TAG, "Receiving Supported Speech Recognition Languages broadcast " + intent); final Bundle extra = getResultExtras(false); if ((getResultCode() == Activity.RESULT_OK) && (extra != null) && (mHandler != null) && ((extra .containsKey(RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES)) || (extra .containsKey(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE)))) { List<String> supportedLanguages = extra .getStringArrayList(RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES); String prefLang = extra .getString(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE); } } }, null, Activity.RESULT_OK, null, null); }
- ¿Cuál es la mejor manera de depurar los problemas de RxJava con mensajes no recibidos?
- ¿Cómo posiciono el cursor a la derecha en EditText