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);
12
demandé sur tnunamak 2010-12-30 07:09:53

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:

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/VoiceRecognition.html

je l'ai tiré de cet article.

http://developer.android.com/resources/articles/speech-input.html

Bonne Chance.

4
répondu satur9nine 2011-01-03 00:51:37

assurez-vous d'utiliser la permission RECORD_AUDIO.

4
répondu Curtis Shovan 2011-12-29 20:23:19

à 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);
3
répondu Matt Cobb 2012-04-17 02:48:16

au lieu de getApplicationContext() , utilisez this (c.-à-d. votre instance de service). android.app.Service hérite du contexte.

1
répondu Al. 2011-01-06 20:41:00

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.

1
répondu Sina Bahram 2011-04-13 22:17:28

j'ai obtenu que cela fonctionne en installant L'application Google Voice

1
répondu oopscope 2011-05-06 07:41:51