SpeechRecognizer provoque ANR... j'ai besoin d'aide avec L'API de la parole Android
EDIT : j'aurais dû le mentionner déjà, mais j'exécute ce code dans un service. L'application entière est activée / désactivée par un bouton widget et n'a aucune activité.
mise à jour : j'ai essayé d'attacher les sources SDK au projet pour que je puisse avoir une idée plus précise de l'endroit où l'échec se produisait, mais à partir de l'apparence de celui-ci , seuls les API publiques sont inclus, ce qui semble les rendre beaucoup moins utile... quelqu'un peut-il suggérer au moins un débogage approche pour résoudre ce problème? Je suis un peu coincé.
j'essaie D'utiliser le pack de reconnaissance vocale D'Android pour enregistrer la parole de l'utilisateur et la traduire en texte. Malheureusement, quand j'essaie d'initier l'écoute, j'obtiens une erreur ANR qui n'indique rien de spécifique.
comme l'indique L'API SpeechRecognizer, un RuntimeException est lancée si vous tentez de l'appeler à partir du thread principal. Cela me ferait me demander si le traitement était juste trop exigeant... mais je sais que d'autres applications utilisent L'API Android dans ce but et il est généralement assez snappy.
java.lang.RuntimeException: SpeechRecognizer should be used only from the application's main thread
voici un échantillon (tronqué) du code que j'essaie d'appeler de mon service. Est-ce la bonne approche?
Merci d'avoir pris le temps d'aider. Cela a ça a été un obstacle que je n'ai pas encore pu surmonter.
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,
"com.domain.app");
SpeechRecognizer recognizer = SpeechRecognizer
.createSpeechRecognizer(this.getApplicationContext());
RecognitionListener listener = new RecognitionListener() {
@Override
public void onResults(Bundle results) {
ArrayList<String> voiceResults = results
.getStringArrayList(RecognizerIntent.EXTRA_RESULTS);
if (voiceResults == null) {
Log.e(getString(R.string.log_label), "No voice results");
} else {
Log.d(getString(R.string.log_label), "Printing matches: ");
for (String match : voiceResults) {
Log.d(getString(R.string.log_label), match);
}
}
}
@Override
public void onReadyForSpeech(Bundle params) {
Log.d(getString(R.string.log_label), "Ready for speech");
}
@Override
public void onError(int error) {
Log.d(getString(R.string.log_label),
"Error listening for speech: " + error);
}
@Override
public void onBeginningOfSpeech() {
Log.d(getString(R.string.log_label), "Speech starting");
}
};
recognizer.setRecognitionListener(listener);
recognizer.startListening(intent);
6 réponses
vous ne devriez pas avoir besoin de créer la classe SpeechRecognizer vous-même, ni de mettre en œuvre un reconnaisseur. Google les a rendus publics pour être sympa, mais ils ont l'air assez compliqué et probablement à l'usage des experts seulement.
pour obtenir le texte des utilisateurs de la parole yo tout simplement besoin d'utiliser le RecognizerIntent.ACTION_RECOGNIZE_SPEECH pour lancer l'activité intégrée de reconnaissance vocale et attendre que le résultat revienne dans onActivityResult. Jetez un oeil à la exemple de code ici:
je l'ai tiré de cet article.
http://developer.android.com/resources/articles/speech-input.html
Bonne Chance.
à partir d'un service, vous devez créer le recognizer à partir de looper en cours d'exécution sur le filetage principal. Aussi RecognizerIntent.EXTRA_RESULTS should be SpeechRecognizer.RESULTS_RECOGNITION.
code psuedo:
public class VoiceRecognition implements RecognitionListener, Runnable
{
@Override
public void run()
{
recognizer = SpeechRecognizer.createSpeechRecognizer(yourContext);
recognizer.setRecognitionListener((RecognitionListener) this);
intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
//... all the intent stuff ...
intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 5);
recognizer.startListening(intent);
}
@Override
public void onResults(Bundle results)
{
ArrayList<String> matches;
matches=results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
}
}
....
VoiceRecognition voiceRecognizer = new VoiceRecognition();
Handler loopHandler = new Handler(Looper.getMainLooper());
loopHandler.post(voiceRecognizer);
au lieu de getApplicationContext()
, utilisez this
(c.-à-d. votre instance de service). android.app.Service
hérite du contexte.
voici le problème que j'ai rencontré, qui pourrait être lié au vôtre. Je n'obtenais rien, quoi qu'il arrive, de cette ligne:
ArrayList<String> voiceResults = results .getStringArrayList(RecognizerIntent.EXTRA_RESULTS);
le changer pour cela a complètement corrigé le problème:
ArrayList<String> voiceResults = results .getStringArrayList("results_recognition");
j'ai imprimé la clé du paquet, et c'était la seule valeur. Notez que la valeur de "results_recognition" n'est pas la valeur de la chaîne stockée à RecognizerIntent.EXTRA_RÉSULTATS. Je pense que c'est un bug, ou du moins il devrait be, depuis L'utilisation de RecognizerIntent.EXTRA_RESULTS fonctionne très bien dans la façon de faire de la reconnaissance vocale, mais pas quand quelqu'un utilise SpeechRecognizer.
de toute façon, je ne vais probablement pas vérifier ce site web à nouveau, mais s'il vous plaît m'envoyer un e-mail si vous avez des questions, puisque je n'ai maintenant la reconnaissance de la parole de travail sans aucune incitation, bips, ou autre chose.
j'ai obtenu que cela fonctionne en installant L'application Google Voice