2012-03-25 12 views
2

Ich habe eine einfache Anwendung inspiriert von this example erstellt, um alle verfügbaren Optionen (dh extra) zu testen. Ich lese über die EXTRA_PARTIAL_RESULTS extra und wenn ich diese Option aktiviere, sollte ich von dem Server alle Teilergebnisse erhalten, die sich auf eine Spracherkennung beziehen. Wenn ich jedoch dieses Extra zur ACTION_RECOGNIZE_SPEECH Absicht hinzufüge, funktioniert die Stimmerkennung nicht mehr: Die Liste zeigt keine Ergebnisse an.Teilergebnisse mit Spracherkennung

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == VOICE_RECOGNITION_REQUEST_CODE) { 
     switch(resultCode) { 
     case RESULT_OK: 
      Log.i(TAG, "RESULT_OK"); 
      processResults(data); 
      break; 
     case RESULT_CANCELED: 
      Log.i(TAG, "RESULT_CANCELED"); 
      break; 
     case RecognizerIntent.RESULT_AUDIO_ERROR: 
      Log.i(TAG, "RESULT_AUDIO_ERROR"); 
      break; 
     case RecognizerIntent.RESULT_CLIENT_ERROR: 
      Log.i(TAG, "RESULT_CLIENT_ERROR"); 
      break; 
     case RecognizerIntent.RESULT_NETWORK_ERROR: 
      Log.i(TAG, "RESULT_NETWORK_ERROR"); 
      break; 
     case RecognizerIntent.RESULT_NO_MATCH: 
      Log.i(TAG, "RESULT_NO_MATCH"); 
      break; 
     case RecognizerIntent.RESULT_SERVER_ERROR: 
      Log.i(TAG, "RESULT_SERVER_ERROR"); 
      break; 
     default: 
      Log.i(TAG, "RESULT_UNKNOWN"); 
      break; 
     } 
    } 
    Log.i(TAG, "Intent data: " + data); 
    super.onActivityResult(requestCode, resultCode, data); 
} 

private void processResults(Intent data) { 
    Log.i(TAG, "processResults()"); 

    ArrayList<String> matches = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); 

    // list of results 
    ListView listOfResults = (ListView)(findViewById(R.id.list_of_results)); 
    listOfResults.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, matches)); 

    // number of elements of above list 
    TextView resultsCount = (TextView)(findViewById(R.id.results_count)); 
    resultsCount.setText(getString(R.string.results_count_label) + ": " + matches.size()); 
} 

Wenn diese Option aktiviert ist, ist die Anzahl der Elemente in der Liste der Ergebnisse gleich 1 ist und dieses Ergebnis ist eine leere Zeichenfolge. Was ist der Grund für dieses Verhalten?

Hinzugefugt habe ich den folgenden Code, um EXTRA_PARTIAL_RESULTS Option zu aktivieren (auf Android 2.3.5).

Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, ...); 
intent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true); 
intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 3); 
intent.putExtra(RecognizerIntent.EXTRA_PROMPT, ...); 
startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE); // where VOICE_RECOGNITION_REQUEST_CODE is a "global variable" 

jedoch die Aktivierung dieser Option ist der ArrayList<String> matches in processResults Verfahren hat nur ein leeres Element.

+0

Was ist innerhalb von EXTRA_PARTIAL_RESULTS? – gregm

+0

Ein konstanter String-Wert ('" android.speech.extra.PARTIAL_RESULTS "'), der verwendet werden kann, um die Option "pratial results" zu aktivieren oder zu deaktivieren, also setze ich sie mit dem booleschen Wert 'true'. – enzom83

Antwort

2

Ich schlage vor, nicht auf PARTIAL_RESULTS angewiesen, weil die Google-Dokumentation sagt diese: The server may ignore a request for partial results in some or all cases.

Nach meiner Erfahrung Google fast immer ignoriert Anfragen für Teilergebnisse.

Allerdings glaube ich nicht, dass die Einstellung EXTRA_PARTIAL_RESULTS sollte normal von zurückgegeben werden. Es sollte nur keinen Effekt haben. Ich habe dies in meinem Code getestet und das Hinzufügen EXTRA_PARTIAL_RESULTS ändert nicht die Ausgabe.

Auch wenn Sie SpeechRecognizer nicht verwenden, sendet Android Ihnen diese Fehlercodes nicht.

Um zu sehen, dass EXTRA_PARTIAL_RESULTS nicht mit den Ergebnissen interferiert. Holen Sie den Code aus here dann die zusätzliche innerhalb dieser Methode hinzufügen:

private void sendRecognizeIntent() 
{ 
    Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, 
      RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
    intent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true); 
    intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Say the magic word"); 
    intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 100); 
    startActivityForResult(intent, SPEECH_REQUEST_CODE); 
} 
+0

Ich möchte verstehen, warum meine Tests (mit 'EXTRA_PARTIAL_RESULTS' Option) auf Android 2.3.5 nicht funktionieren. Mit welchen Anweisungen haben Sie Teilergebnisse angefordert? (Ich fügte dieses Extra nur der Absicht hinzu: siehe die Details, die ich am Ende meiner Frage hinzugefügt habe). Mit welchen Anweisungen haben Sie auf die Teilergebnisse zugegriffen? Es sollte zusammen mit vollständigen Ergebnissen zurückgegeben werden ... oder nicht? – enzom83

+1

Holen Sie den Code von hier: https://github.com/gmilette/Say-the-Magic-Word- Fügen Sie dann intent.putExtra hinzu (RecognizerIntent.EXTRA_PARTIAL_RESULTS, true); Hinweis: Ich habe auf Android 4.0.3 getestet – gregm

+0

Bald werde ich den Code von Ihrem Link versuchen! Wenn das gleiche Problem auftritt, was könnte das verursachen? Die Version 2.3.5 von Android oder die Version des Spracherkenners (ich habe Sprachsuche 2.1.3)? – enzom83