Подтвердить что ты не робот

Значения "доверия" 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 я использую его, результат остается прежним. Устали ли документы в этой точке?

4b9b3361

Ответ 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 выполнит все правильно.