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 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无关紧要,结果保持不变。 在那一点上,文档是否过时了?

根据我对文件的解释:

recognizerIntent.Extra_Results返回一个有序的字符串数组,每个字符串都是一个关于所说内容的建议,索引为0的字符串是识别器最有信心的建议。

recognizerIntent.Extra_Confidence_Scores返回与每个建议相对应的浮点数组。

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

我得到了类似的结果。 我从未有过一系列结果,其中不止一个建议具有不可忽视的信心,就像你一样。 例如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 。 请你检查一下float []是否返回null。

 ArrayList 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,Adam Stroud这肯定会对你有所帮助。 您将在本书的第394页获得一些详细信息。

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

Google似乎只实施了传统方法并在API中保留了更加详细的结果,并且信心十足。

您只需等待Google正确实施所有内容即可。