1

키워드 목록 및 상대 임계 값을 기반으로 연속 키워드 검색을 테스트하기 위해 pocketsphinx android 데모를 수정합니다.둘 이상의 일치 항목이있는 동안 SegmentList를 반복 할 수 없습니다.

내 구현 edu.cmu.pocketsphinx.RecognitionListener의 onResult 메서드를이 문자열 hypothesis.getHypstr()이라고 할 때 가능한 일치 목록이 포함됩니다. SegmentList가 비어있는 경우 내 코드 실행이 결코 세그먼트 반복되지

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

hypothesis.getHypstr() 더 보여줍니다 동안 같은 :

나는 그것을 같이 할 수 있습니다 매 경기 자신의 무게를 얻을 수 here 읽기 일치하는 것보다

더 일치 쉽게 찾을 수 있도록 내가 매우 낮은 역치이 키워드 목록을 사용하고 경우 재현하려면 다음

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(); 
    } 
} 

예를 들어 "energies"라고 말하면 hypothesis.getHypstr() = "blood about energy blood"하지만 SegmentList에 반복은 수행되지 않습니다. onResult 메서드의 시작 부분에 중단 점을 넣어서 볼 수 있습니다.

의견이 있으십니까?

감사합니다.

+0

대부분 반복되지만 인쇄되지는 않습니다. 당신은 또한 hypothesis! = null 조건 내에서 루프를 움직일 필요가 있습니다. –

+0

고마워요 @ 니콜라이, 표준 출력의 출력을 찾고있는 대신 코드를 디버깅 중이며 블록이 입력되지 않습니다. 당신은 맞습니다! = null 조건이지만 디버깅하는 동안 어쨌든 다음 블록이 입력되어 있기 때문에 가설이 null이 아닌 것을 볼 수 있습니다 – salvolds

답변

0

여기에 스레딩 문제가 있습니다. 인식기가 이미 switchSearch에서 다시 시작될 때 onResult 메시지가 전달되므로 가설이 지워지고 결과 쿼리가 아무 것도 반환하지 않습니다.

인식기를 다시 시작하기 전에 당신은 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

감사합니다. Nikolay, 당신이 정확히 지적하는 스레딩 문제였습니다. 이제 onPartialResult 만 사용하고 그 끝에서 인식기를 중지했다가 다시 시작합니다. 어떤 단점이 보이십니까? 나는 확률이 음의 값 (-2340과 같은 것)을 보았고, 0에 가장 가깝게 가장 일치하는 것이 맞습니까? – salvolds

+0

나는 hypotesis 및 SegmentList가 매번 정리되도록 인식기를 중지했다가 다시 시작합니다. 더 좋은 방법이 있습니까? 때로는 onPartialResult에서 잡히지 않은 키프 레그를 말하는 경우가 있지만, 그 다음의 스피치 후에도 매우 다른 것 – salvolds