使用语音识别的部分结果

时间:2012-03-25 09:38:28

标签: android speech-recognition android-2.3-gingerbread

我创建了一个受this example启发的简单应用程序,以测试所有可用选项(即额外的)。我读到了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方法中的processResults只有一个空元素。

1 个答案:

答案 0 :(得分:3)

我建议不要依赖PARTIAL_RESULTS,因为Google文档说明了这一点: The server may ignore a request for partial results in some or all cases.

根据我的经验,Google几乎总是忽略对部分结果的请求。

但是,我不认为设置EXTRA_PARTIAL_RESULTS会阻止正常EXTRA_RESULTS被退回。它应该没有效果。我已在我的代码中对此进行了测试,并且添加EXTRA_PARTIAL_RESULTS并未更改输出。

此外,除非您使用SpeechRecognizer,否则Android不会向您发送这些错误代码。

要查看EXTRA_PARTIAL_RESULTS不会影响结果。从here获取代码,然后在此方法中添加额外内容:

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