Значения "доверия" Android SpeechRecognizer запутывают
Я использую SpeechRecognizer через Intent:
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 я использую его, результат остается прежним. Устали ли документы в этой точке?
Ответы
Ответ 1
Согласно моей интерпретации документации:
identizerIntent.Extra_Results возвращает упорядоченный массив строк, каждый из которых является одним предложением относительно того, что было сказано, с строкой в индексе 0, являющейся предположением, что Recognizer наиболее уверен в.
распознавательIntent.Extra_Confidence_Scores возвращает массив поплавков, соответствующий каждому из этих предложений.
Итак, если результаты, которые вы получаете, верны (иначе это может быть ошибка),
то распознаватель имеет 1 и только 1, предположение, что у него есть уверенность и несколько других, что он имеет лишь незначительную или не уверенность.
Я получаю похожие результаты. У меня никогда не было набора результатов, в которых более чем одно предложение имело не пренебрежимую уверенность, как и вы.
например
0,7435,
0.0,
0.0,
0.0,
......
Тем не менее, я иногда получал набор результатов, в которых результаты ALL имеют незначительную уверенность. например 0,0, 0,0, 0,0, 0,0, 0,0,...
Итак, первый элемент в результатах всегда будет тем, с чем наиболее уверенно распознает Recognizer.
Ответ 2
Я не работаю с реорганизацией речи. Но все же, как вы сказали, вы получаете значение массива float равным 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-телефоне Грег Милетт, Адам Страуд, это, безусловно, поможет вам. Вы получите подробную информацию на странице 394 в этой книге.
Ответ 3
Традиционный алгоритм распознавания речи позволяет вернуть доверие только 1-лучшему результату, потому что это результат по сравнению с другими результатами для расчета уверенности. Также возможно вернуть N лучших результатов вместо 1-наилучшего, однако их гораздо сложнее рассчитать доверие к ним.
Похоже, что Google применил только обычный подход и зарезервировал место в API для получения более подробных результатов с n-лучшей уверенностью.
Вам просто нужно подождать, пока Google выполнит все правильно.