12
votes

SpeechRecognizer provoque une ANR ... J'ai besoin d'aide avec l'API de la parole Android

éditer em>: J'aurais déjà dû mentionner cela déjà, mais j'exécute ce code dans un service. L'application entière est allumée / désactivée par un bouton de widget et n'a aucune activité.


mise à jour em>: j'ai essayé de joindre les sources SDK au projet afin que je puisse obtenir une idée plus précise de Lorsque l'échec était survenant, mais de Les regards , seules les API publiques sont incluses, ce qui semble les rendre beaucoup moins utiles ... Quelqu'un peut-il suggérer au moins une approche de débogage pour résoudre ce problème? Je suis un peu coincé. P>


J'essaie d'utiliser Android package de reconnaissance vocale pour enregistrer le discours utilisateur et le traduire en texte. Malheureusement, lorsque j'essaie d'initier une écoute, j'obtiens une erreur ANR qui ne pointe rien de spécifique. P>

Comme l'indique l'API de SpeechRecognizer, une erreur RunTimeException est lancée si vous essayez de l'appeler à partir du fil principal. Cela me ferait de me demander si le traitement était trop exigeant ... Mais je sais que d'autres applications utilisent l'API Android à cette fin et c'est généralement assez snappy. P>

Java.lang.RuntimeException : SpeamRecognizer doit être utilisé uniquement à partir du fil principal de l'application CODE> P>

Voici un échantillon (coupé) du code que j'essaie d'appeler de mon service. Est-ce la bonne approche? P>

Merci d'avoir pris le temps de vous aider. Cela a été un obstacle que je n'ai pas été capable de finir. P>

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);


1 commentaires

La balise de développement logiciel est une sorte de redondance ;-) c'est plus pour les sujets qui parlent du terrain en général.


6 Réponses :


4
votes

Vous ne devriez pas avoir besoin de créer vous-même la classe SheetkRecognizer, ni de mettre en œuvre une reconnaissance de reconnaissance. Google les a rendus publics pour être gentil, mais ils ont l'air assez compliqué et probablement à utiliser par des experts uniquement.

Pour obtenir du texte de la part de la parole des utilisateurs, vous devez simplement utiliser le reconnaissanceIntente.action_recognize_Speech pour lancer l'activité de reconnaissance de la parole intégrée, puis attendez que le résultat revienne sur OnActivityResult. Jetez un coup d'œil à l'exemple code ici:

http: // développeur.android.com/resources/samples/apidemos/src/com/example/android/apis/app/voiicerecognition.html

Je l'ai tiré de cet article.

http://developer.android.com/resources/articles/speech- INPUT.HTML

bonne chance.


3 commentaires

C'était la route que j'ai commencé. Je suis allé avec l'approche de la speakrecognizer parce que je suis tout dans les coulisses dans un service ... Il ne semblait pas juste de commencer une activité si mon application ne s'est pas concentrée (elle s'exécute à l'arrière-plan). Si cela revient, je pourrais juste avoir à utiliser une activité de toute façon. Mon application est destinée à être utilisée sans interactions utilisateur à l'écran.


D'après ce que j'ai lu jusqu'à présent, l'API de reconnaissance vocale n'est qu'une interface et que la mise en œuvre vit réellement ailleurs, telle que l'application "de la recherche vocale". Je crois que cela est basé sur la technologie exclusive et n'est pas open source. On dirait que vous êtes à la merci de l'interface fournie.


Cela me semble juste, mais je pense qu'il existe une sorte de faille de conception dans mon code, car mon intention devrait être traitée par la même application / activité qui serait utilisée si je devais diffuser mon intention avec StarTactivityForresult (). La mise en œuvre devrait affecter à la fois les techniques de manière égale ... Je pense que je vais probablement aller avec une activité comme solution alternative.



1
votes

au lieu de gettaplicationContextex () , utilisez ceci (c'est-à-dire votre instance de service). android.app.service hérite du contexte.


0 commentaires

1
votes

Voici le problème que j'ai rencontré, ce qui pourrait être lié à la vôtre. Je devais avoir NULL, peu importe quoi, à partir de cette ligne:

  ArrayList<String> voiceResults = results                .getStringArrayList("results_recognition");  


2 commentaires

Vous avez besoin de cela: reconnaissantintent.putextra (reconnaissantintentent.extra_calling_pac kage, "your.package"); reconnaissantintent.putextra (reconnaissantintentent.extra_partial_res ults, vrai);


Utilisez GetStringarrayList (SpeechRecognizer.Results_Recognition) au lieu de la chaîne de codage dure



1
votes

J'ai ceci pour travailler en installant l'application Google Voice


0 commentaires

5
votes

Assurez-vous d'utiliser l'autorisation Record_audio.


0 commentaires

4
votes

À partir d'un service, vous devez créer le reconnaissement de la boucle en cours d'exécution sur le fil principal. Également reconnaissant.extra_results devrait être SpeechRecognizer.Results_recognition.

Code PSEDEO: P>

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);


0 commentaires