Android SpeechRecognizer的“自信”值是令人困惑的

我正在通过Intent使用SpeechRecognizer:

Intent i = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); i.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); i.putExtra(RecognizerIntent.EXTRA_PROMPT, "straight talk please"); i.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 5); i.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "en-US"; startActivityForResult(i, 0); 

我在onActivityResults()中得到这样的结果:

 protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 0 && resultCode == RESULT_OK) { // List with the results from the Voice Recognition API ArrayList<String> results = data .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); // The confidence array float[] confidence = data.getFloatArrayExtra( RecognizerIntent.EXTRA_CONFIDENCE_SCORES); // The confidence results for (int i = 0; i < confidence.length; i++) { Log.v("oAR", "confidence[" + i + "] = " + confidence[i]); } } super.onActivityResult(requestCode, resultCode, data); } 

但是float数组总是返回0.0,但是第一个元素是这样的:

 confidence[0] = any value between 0 and 1 confidence[1] = 0.0 confidence[2] = 0.0 and so on 

我期望每一个结果的置信度值在0和1之间。否则,这看起来很没用,因为具有最高置信度的结果将是默认的第一个元素,而不使用EXTRA_CONFIDENCE_SCORES 。 有什么我失踪?

此外, RecognizerIntent.EXTRA_CONFIDENCE_SCORES应该在API Level 14++ 。 但是,在8以上的API上使用它并不重要,结果保持不变。 这个文件是否过时了?

Solutions Collecting From Web of "Android SpeechRecognizer的“自信”值是令人困惑的"

根据我对文档的解释:

recognizerIntent.Extra_Results返回一个有序的stringarrayList,每个string都是一个build议,索引0处的string是Recognizer最有把握的build议。

recognitionizerIntent.Extra_Confidence_Scores返回与这些build议中的每一个相对应的浮点数组。

所以,如果你得到的结果是正确的(否则这可能是一个错误),那么识别器有1个,只有1个,暗示它有信心,其他几个只有微不足道或没有信心。

我得到了类似的结果。 我从来没有一个结果,就像你一样,一个以上的build议有不可忽视的信心。 例如0.7435,0.0,0.0,0.0 ……

然而,我有时得到了一系列的结果,其中所有结果的可信度都可以忽略不计。 例如0.0,0.0,0.0,0.0,0.0,……

因此,结果中的第一个元素将始终是识别器最有信心的元素。

我没有进行言语重组。 但是,正如你所说的,你得到的float数组值为0.0,这意味着float array is null 。 你可以请检查是浮动[]返回null或其他。

 ArrayList<String> results = data .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); float[] confidence = data.getFloatArrayExtra( RecognizerIntent.EXTRA_CONFIDENCE_SCORES); if (confidence == null) { for (int i = 0; i < results.size(); i++) { Log.d(TAG, i + ": " + results.get(i)); } } else { for (int i = 0; i < results.size(); i++) { Log.d(TAG, i + ": " + heard.get(i) + " confidence : " + confidence[i]); } } 

您可以请检查本书专业Android传感器编程通过Greg Milette,亚当斯特劳德,这一定会帮助你。 您将在本书的第394页上获得一些细节。

传统的语音识别algorithm允许仅返回1最佳结果的置信度,因为它是与其他结果相比计算置信度的结果。 也可以返回N个最好的结果而不是1个最好的结果,但是计算它们的置信度要困难得多。

Google似乎只采用了传统的方法,并在API中预留了更多的详细结果,而且信心十足。

您只需等待Google正确实施一切。