18

我正在通过 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++. 但不管我使用哪个 API 高于 8,结果保持不变。在那一点上文档已经过时了吗?

4

3 回答 3

3

根据我对文档的解释:

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

identifyrIntent.Extra_Confidence_Scores 返回对应于这些建议中的每一个的浮点数组。

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

我得到了类似的结果。就像您一样,我从未有过一组结果,其中一个以上的建议具有不可忽略的信心。例如 0.7435, 0.0, 0.0, 0.0, ......

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

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

于 2015-01-27T09:30:01.917 回答
1

我没有进行语音重组。但是,正如您所说,您将浮点数组值设为 0.0,这意味着float array is null. 你能检查一下 float[] 是否返回 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]);
  }
}

您能否查看Greg Milette 和 Adam Stroud 撰写的 Professional Android Sensor Programming一书,这肯定会对您有所帮助。您将在本书的第394页获得一些详细信息。

于 2013-09-27T04:40:21.487 回答
1

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

似乎 Google 仅实施了传统方法,并在 API 中保留了位置,以便以 n 最佳置信度获得更详细的结果。

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

于 2015-12-09T17:09:39.650 回答