2

저는 C#과 System.Speech.Recognition을 사용하여 제가 정의한 몇 가지 간단한 문법을로드하고 있습니다. 문법과 일치하는 문구를 말하면 엔진은 0.95 주변의 신뢰로 문법을 올바르게 인식합니다.Microsoft 음성 인식 시스템에서 문법이 일치하지 않는 이유는 무엇입니까?

하지만 (심지어 언어가 다르거 나 횡설수설해도) 문법에 포함되지 않은 단어를 발음하면 엔진에서 무작위로 텍스트가 표시되지 않고 여전히 높은 신뢰도의 문법이 무작위로 반환됩니다.

이 문제를 피하려면 SpeechRecognitionEngine 개체 또는 각 문법 개체에서 설정해야 할 것이 있습니까?

답변

2

은 내가 나를 위해 작동 해결책을 찾은 것 같아요하지만 여전히이있는 경우 더 우아한 하나를 찾을 것이 좋을 것이다 : 나는 받아쓰기 문법과 "자리"를 정의

. 그런 다음 문법을로드하고 즉시 문을 닫습니다.

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

그런 다음 speechRecognized 이벤트에서 placeholder가 인식되면 명령을 사용할 수 있도록 논리를 설정합니다. 명령이 인식되면 받아쓰기를 다시 활성화하고 모든 명령을 비활성화합니다.

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} 
} 
+0

"MYPLACEHOLDER"는 명령을 실행하기 위해 선택한 단어 또는 구입니다. –