Частичные результаты с использованием распознавания речи
Я создал простое приложение, вдохновленное этим примером, чтобы протестировать все доступные опции (т.е. дополнительные). Я читал о EXTRA_PARTIAL_RESULTS
дополнительно, и если я включу эту опцию, я получу от сервера любые частичные результаты, связанные с распознаванием речи. Тем не менее, когда я добавляю это ACTION_RECOGNIZE_SPEECH
намерение, распознавание голоса больше не работает: список не отображает никаких результатов.
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());
}
Когда эта опция включена, количество элементов в списке результатов равно 1, и этот один результат является пустой строкой. В чем причина такого поведения?
ДОБАВЛЕННЫЕ ДЕТАЛИ Я использовал следующий код, чтобы включить EXTRA_PARTIAL_RESULTS
вариант (на 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"
Однако, включив эту опцию, ArrayList<String> matches
в processResults
Метод имеет только один пустой элемент.
1 ответ
Я предлагаю не полагаться на PARTIAL_RESULTS, потому что в документации Google говорится следующее: сервер может игнорировать запрос частичных результатов в некоторых или во всех случаях.
По моему опыту, Google почти всегда игнорирует запросы на частичные результаты.
Тем не менее, я не верю, что установка EXTRA_PARTIAL_RESULTS
должен остановиться нормально EXTRA_RESULTS
от возвращения. Это просто не должно иметь никакого эффекта. Я проверил это в своем коде и добавив EXTRA_PARTIAL_RESULTS
не меняет вывод.
Кроме того, если вы не используете SpeechRecognizer
Android не отправит вам эти коды ошибок.
Чтобы увидеть это EXTRA_PARTIAL_RESULTS
не мешает результатам. Получите код отсюда и добавьте дополнительный в этот метод:
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);
}