1

Je suis en train de modifier la démo android de pocketsphinx pour tester les mots-clés continus en fonction d'une liste de mots-clés et de seuils relatifs. Lorsque la méthode onResult de mon implémentation de edu.cmu.pocketsphinx.RecognitionListener est appelée cette chaîne hypothesis.getHypstr() contiendra la liste des correspondances possibles.Impossible de itérer sur SegmentList alors que plusieurs correspondances sont trouvées

Je lis here que pour obtenir chaque match et leur poids, il est possible de le faire comme ceci:

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

Cependant ma course de code est jamais itérez segments comme si SegmentList était vide alors que hypothesis.getHypstr() montre plus d'un match.

Pour reproduire le cas j'utilise cette liste de mots clés avec Seuils très bas de sorte que plusieurs correspondances sont faciles à trouver:

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

Ma méthode onPartialResult ne fait rien tout:

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

Par exemple si je dis "énergies" alors hypothesis.getHypstr() = "sang sur les énergies du sang" mais aucune itération n'est faite sur SegmentList: je peux le voir en mettant un point d'arrêt au début de la méthode onResult.

Une suggestion?

Merci

+0

Probablement il itère, mais n'imprime rien. Vous devez également déplacer la boucle dans l'hypothèse! = Null condition. –

+0

Merci @Nikolay, je ne cherche pas à la sortie en sortie standard mais à la place je suis en train de déboguer le code et le bloc n'est jamais entré. Vous avez raison je vais déplacer l'hypothèse! = Null condition, mais de toute façon tout en débogage je peux voir l'hypothèse n'est pas nulle car le bloc suivant est entré – salvolds

Répondre

0

Il y a un problème de threading ici. onResult Un message est envoyé lorsque le module de reconnaissance est déjà redémarré sous switchSearch. L'hypothèse est alors effacée et la requête de résultat ne renvoie rien.

Vous pouvez mettre ce code à l'intérieur switchSearch avant reconnaisseur est redémarré, il fonctionnera ok:

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

Si vous utilisez uniquement spotting mot-clé, vous pouvez aussi mettre ce code à l'intérieur onPartialResult qui est invoquée dès keyphrase est détecté, pas quand le silence est détecté. Cela rend la réaction plus rapide. Vous n'avez pas besoin de onEndOfSpeech et onResult dans le repérage de mots-clés purs.

+0

Merci Nikolay, c'était le problème de threading que vous recherchez. Maintenant, j'utilise uniquement surPartialResult et j'arrête et redémarre le module de reconnaissance à la fin de cela. Voyez-vous un inconvénient? Je vois que les probabilités sont des valeurs négatives (quelque chose comme -2340), est le match le plus probable le plus proche de 0? – salvolds

+0

J'arrête et redémarre le module de reconnaissance afin que l'hypotèse et SegmentList soient nettoyés à chaque fois. Y a-t-il un meilleur moyen? Il arrive parfois de dire une phrase clé qui n'est apparemment pas attrapée dans onPartialResult mais à la place elle est montrée après le prochain discours aussi si quelque chose de très différent a été dit – salvolds