2 votes

Pourquoi le système de reconnaissance vocale de Microsoft fait-il correspondre des grammaires même si aucun mot de cette grammaire n'a été prononcé ?

J'utilise c# et le System.Speech.Recognition pour charger quelques grammaires simples que j'ai définies. Lorsque je prononce des phrases correspondant aux grammaires, le moteur reconnaît la grammaire correctement avec un taux de confiance d'environ 0,95.

Mais quand je prononce des mots qui ne sont même pas dans la grammaire (même des langues différentes ou du charabia), les moteurs renvoient aléatoirement une correspondance à une grammaire avec un texte aléatoire jamais prononcé et toujours avec une confiance élevée comme 0.92.

Y a-t-il quelque chose que je dois définir dans l'objet SpeechRecognitionEngine ou dans chaque objet Grammar pour éviter ce problème ?

2voto

Paolo Vigori Points 850

Je pense avoir trouvé une solution qui fonctionne pour moi, mais il serait bon d'en trouver une plus élégante si elle existe :

Je définis une grammaire de dictée et un "placeholder". Ensuite, je charge mes grammaires et je les désactive immédiatement.

using System.Speech.Recognition;
...

private DictationGrammar dictationGrammar;
private Grammar placeholderGrammar;
private List<Grammar> commands;

public void Initialize()
{
    dictationGrammar = new DictationGrammar();
    recognizer.LoadGrammarAsync(dictationGrammar);

    var builder = new GrammarBuilder();
    builder.Append("MYPLACEHOLDER");        
    placeholderGrammar = new Grammar(builder);
    recognizer.LoadGrammarAsync(placeholderGrammar);

    commands = new List<Grammar>();

    foreach (var grammar in grammarManager.GetGrammars())
    {
        commands.Add(grammar);           
        grammar.Enabled = false;
        recognizer.LoadGrammarAsync(grammar);
    }
}

Ensuite, sur l'événement speechRecognized, je mets la logique qui fait que si le placeholder est reconnu, les commandes sont activées. Si une commande est reconnue, la dictée est réactivée et toutes les commandes sont désactivées :

private async void speechRecognized(object sender, SpeechRecognizedEventArgs e)
{
    if (e.Result.Grammar == placeholderGrammar)
    {
        //go to command mode
        placeholderGrammar.Enabled = false;
        dictationGrammar.Enabled = false;

        foreach (var item in commands)
            item.Enabled = true;
    }
    else if (commands.Any(x => e.Result.Grammar == x))
    {
        Do_something_with_recognized_command("!!");

        //go back in normal mode
        placeholderGrammar.Enabled = true;
        dictationGrammar.Enabled = true;
    }else {//this is dictation.. nothing to do}
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X