Частичные результаты с использованием распознавания речи - PullRequest
2 голосов
/ 25 марта 2012

Я создал простое приложение, вдохновленное этим примером , чтобы протестировать все доступные опции (т.е. дополнительные). Я читал о EXTRA_PARTIAL_RESULTS extra и, если я включу эту опцию, я получу от сервера любые частичные результаты, связанные с распознаванием речи. Однако, когда я добавляю это дополнение к намерению 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 in processResults имеет только один пустой элемент.

1 Ответ

3 голосов
/ 26 марта 2012

Я предлагаю не полагаться на 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);
}
...