1

Я модифицирую демо-версию pocketsphinx android для тестирования непрерывного определения ключевых слов на основе списка ключевых слов и относительных пороговых значений.Невозможно перебрать SegmentList, если найдено более одного совпадения

Когда метод onResult моей реализации edu.cmu.pocketsphinx.RecognitionListener называется этой строкой hypothesis.getHypstr() будет содержать список возможных совпадений.

Я прочитал here, что, чтобы получить каждый матч и их веса можно сделать так:

for (Segment seg : recognizer.getDecoder().seg()) { 
    System.out.println(seg.getWord() + " " + seg.getProb()); 
} 

Однако мой код работает никогда не итерация сегментов, как если SegmentList был пуст, а hypothesis.getHypstr() показывает более чем одно совпадение.

Чтобы воспроизвести случай я использую этот список ключевых слов с очень низким tresholds так, что больше матчей легко найти:

rainbow /1e-50/ 
about /1e-50/ 
blood /1e-50/ 
energies /1e-50/ 

Мой onPartialResult метод ничего не делает, а:

public void onEndOfSpeech() { 
     switchSearch(KWS_SEARCH); 
} 

public void onResult(Hypothesis hypothesis) { 
    if (hypothesis != null) { 

    for (Segment seg : recognizer.getDecoder().seg()) { 
     //No iteration is done here!!! 
     Log.d("onResult", seg.getWord() + " " + seg.getProb()); 
    } 

     String text = hypothesis.getHypstr(); 
     makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show(); 
    } 
} 

Например, если я говорю «энергии», то hypothesis.getHypstr() = «кровь об энергиях крови», но не выполняется итерация над SegmentList: я вижу это, поставив точку останова в начале метода onResult.

Любое предложение?

Thanks

+0

Скорее всего, он выполняет итерацию, но ничего не печатает. Вам также нужно переместить цикл внутри гипотезы! = Нулевое условие. –

+0

Спасибо @Nikolay, я не ищу выход в стандартном выпуске, но вместо этого я отлаживаю код, и блок никогда не вводится. Вы правы. Я переведу гипотезу! = Null, но в любом случае во время отладки я вижу, что гипотеза не является нулевой, потому что введен следующий блок. – salvolds

ответ

0

Здесь есть проблема с резьбой. onResult сообщение отправляется, когда распознаватель уже перезапущен в switchSearch, и поэтому гипотеза очищается, а запрос результата не возвращает ничего.

Вы можете поместить этот код в switchSearch до того распознаватель перезапущен, то он будет работать нормально:

private void switchSearch(String searchName) { 
    boolean wasRunning = recognizer.stop(); 

    if (wasRunning) { 
     for (Segment seg : recognizer.getDecoder().seg()) { 
      Log.d("!!!! ", seg.getWord()); 
     } 
    } 

    // If we are not spotting, start listening with timeout (10000 ms or 10 seconds). 
    if (searchName.equals(KWS_SEARCH)) 
     recognizer.startListening(searchName); 
    else 
     recognizer.startListening(searchName, 10000); 

    String caption = getResources().getString(captions.get(searchName)); 
    ((TextView) findViewById(R.id.caption_text)).setText(caption); 
} 

Если вы используете только ключевое слово пятнистость, вы также можете поместить этот код внутри onPartialResult который вызывается, как только keyphrase обнаружен, а не когда обнаружена тишина. Это ускоряет реакцию. Вам не нужны onEndOfSpeech и onResult в чистом ключевом слове.

+0

Спасибо Николаю, это была проблема с потоками, которую вы точно определяете. Теперь я использую только onPartialResult и останавливаю и перезапускаю распознаватель в конце этого. Вы видите какой-то недостаток? Я вижу, что вероятности - это отрицательные значения (что-то вроде -2340), наиболее вероятное совпадение с ближайшим к 0? – salvolds

+0

Я останавливаю и перезапускаю распознаватель, так что гипотетий и SegmentList очищаются каждый раз. Есть ли способ лучше? Иногда случается сказать ключевую фразу, которая, по-видимому, не попадает в onPartialResult, но вместо этого она появляется после следующей речи, также если было сказано что-то совсем другое – salvolds

Смежные вопросы