我通过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无关紧要,结果保持不变。在那一点上,文档是否过时了?
答案 0 :(得分:3)
根据我对文件的解释:
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,......所以,结果中的第一个元素将始终是识别者最有信心的元素。
答案 1 :(得分: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]);
}
}
请您查一下专业的Android传感器编程作者:Greg Milette,Adam Stroud ,这一定会对您有所帮助。您将在本书的第394页上获得一些详细信息。
答案 2 :(得分:1)
传统的语音识别算法允许返回1个最佳结果的置信度,因为它是与其他结果相比较的结果,用于计算置信度。也可以返回N个最佳结果,而不仅仅是1个最佳结果,但是,计算它们的置信度要困难得多。
Google似乎只实施了传统方法,并在API中保留了更加详细的结果,并且信心十足。
您只需等待Google正确实施所有内容。