【问题标题】:Android SpeechRecognizer "confidence" values are confusingAndroid SpeechRecognizer“信心”值令人困惑
【发布时间】:2015-12-10 01:09:39
【问题描述】:

我正在通过 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,结果保持不变。那个时候文档已经过时了吗?

【问题讨论】:

  • 不确定您希望得到什么样的答案。它的工作方式与 Google 实现的方式相同,您几乎无法在当前版本中对其进行更改。也许它会在未来的版本中得到支持。最好重新考虑您正在尝试构建的应用程序并选择正确的工具来实现它。开源语音识别工具包在这方面更加灵活,至少您可以使用它们获得一些东西。
  • @NikolayShmyrev 我发现此功能不能用作文档声明中的描述。因此,我期望得到的答案是,您使用错误,这不受您所想的支持,或者这是不可能的,因为它只是未来实现的占位符。我尝试使用 Android 框架的实现,因为通常用户熟悉它。但看起来第三个库是唯一的选择。我只是想确保文档在这一点上需要更新。
  • 文档没有过期,正如您在类似问题的回答中已经解释的那样,请参阅:stackoverflow.com/questions/18694497/…

标签: android speech-recognition


【解决方案1】:

根据我对文档的解释:

recognizerIntent.Extra_Results 返回一个 ordered 字符串数组列表,每个字符串都是关于所说内容的一个建议,索引 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, ......

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

【讨论】:

    【解决方案2】:

    我没有进行语音重组。但是,正如您所说,您将浮点数组值设为 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 页上获得一些详细信息。

    【讨论】:

    • 数组中的第一个元素的值介于 0 和 1 之间。数组的所有其他元素都是 0.0。所以数组不为空。我希望每个结果都是浮点数组中的置信度分数。但事实并非如此。结果列表和置信度数组的大小是一样的。您链接的书、Google 文档和 Reto Meier 的书正是使用这个。但是,如果只有一个结果会有置信度分数,那就没有意义了。
    【解决方案3】:

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

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

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

    【讨论】:

    • 没有冒犯,但是您的这些信息的来源是什么?这是有道理的,该数组只是充当一个占位符。但我想要一个证据。
    • 如果您检查大多数现代算法的置信度评分,例如共识解码arxiv.org/abs/cs/0010012 或最小贝叶斯风险解码static.googleusercontent.com/media/research.google.com/en//pubs/…,它们都是 1-to-everything,这意味着它们估计的概率针对所有其他可能结果的假设,而不是 n 最佳假设。 N-best 是使用单独的算法计算的,不同的结果不会相互比较,只是与其他所有结果进行比较。
    • 这是一种自然的方法,因为您无法真正对所有可能结果的空间中的假设结果进行排名,这个空间太大了,它可能不符合您对置信度的期望。如果您查看 SRILM 或 Kaldi 之类的开源工具包,它们也提供 1-best confidence 或 n-best 结果来自 lattice,但绝不会两者兼而有之。
    • 可能有一个参数可以将谷歌识别算法切换到n-best结果模式?
    猜你喜欢
    • 2012-05-15
    • 1970-01-01
    • 2022-01-21
    • 2022-01-17
    • 1970-01-01
    • 2018-08-05
    • 2018-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多