2014-02-07 8 views
2

SpeechRecognizedEventArgs에서 원하는 정보를 추출 할 수없는 것 같습니다. 내 문법에는 "하나"와 "왼쪽 화살표"라는 문구가 있습니다. 두 사람의 말을 다른 사람에게 말하면 내 인식자가 문법에있는 최대 반복 횟수가 5가되기 때문에 찾을 수 있지만 그 결과의 단계를 구분할 수는 없습니다. SpeechRecognizedEventArgstext는 "하나, 왼쪽 화살표"또는 첫 번째 항목이 "하나"이고 두 번째 항목이 "왼쪽 화살표"인 목록을 원할 때 "왼쪽 화살표 하나"입니다.Microsoft 음성 인식을위한 SpeechRecognizedEventArgs에서 일치하는 개별 구문 찾기

"Words"속성은 거의 내가 원하지만 거의 그렇지 않다는 것을 발견했습니다. 스타일을 쉼표로 구분하거나 문법의 단 하나의 단계가있을 때 찾을 수있는 스타일이라면 분리 할 수없는 그룹 대신 하나씩 차례로 가져올 수 있습니다. 시도 내가 예를 들어, 하나의 문구를 발언 할 때 의미가 작동하여 -

void recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) 
    { 
     // e.g. "one left arrow" 
     // when I'd like either "one,left arrow" or a list 
     Console.WriteLine(e.Result.Text); 
     // ... 
    } 

편집 :

var cultureInfo = new System.Globalization.CultureInfo("en-US"); 
    recognizer_ = new SpeechRecognitionEngine(cultureInfo); 
    var choices = LoadWordChoices(); 
    var gb = new GrammarBuilder(); 
    gb.Append(choices, 1, 5); 
    var grammar = new Grammar(gb); 
    recognizer_.LoadGrammar(grammar); 
    recognizer_.SpeechRecognized += 
     new EventHandler<SpeechRecognizedEventArgs>(recognizer_SpeechRecognized); 

그리고 이벤트 : 내 코드의 일부 "왼쪽 화살표"하지만 "왼쪽 화살표 한 개"라고 말하면 다음 오류로 인해 충돌합니다. "처리되지 않은 'System.Reflection.TargetInvocationException'형식의 예외가 mscorlib.dll에서 발생했습니다. 추가 정보 : 예외가 throw되었습니다. 호출 대상. "

 var gb = new GrammarBuilder(); 
     var choices = new Choices(); 
     var words = LoadWords(); // string[] of "one", "left arrow" etc. 
     foreach (var word in words) 
     { 
      choices.Add(new SemanticResultValue(word, word)); 
     } 
     gb.Append(choices, 1, 5); 
     return gb; 

편집 : 2 : 오류 재현하는 최소한의 작업 프로그램을 포함 : 여기 내 시도이다

class MySpeech 
{ 
    private SpeechRecognitionEngine recognizer_; 

    public MySpeech() 
    { 
     var cultureInfo = new System.Globalization.CultureInfo("en-US"); 
     recognizer_ = new SpeechRecognitionEngine(cultureInfo); 
     var gb = CreateGrammarBuilder(); 
     var grammar = new Grammar(gb); 
     recognizer_.LoadGrammar(grammar); 

     recognizer_.SpeechRecognized += 
      new EventHandler<SpeechRecognizedEventArgs>(recognizer_SpeechRecognized); 
     recognizer_.SetInputToDefaultAudioDevice(); 
     recognizer_.RecognizeAsync(RecognizeMode.Multiple); 
    } 

    private GrammarBuilder CreateGrammarBuilder() 
    { 
     var gb = new GrammarBuilder(); 
     var choices = new Choices(); 
     var words = new string[] { "one", "left arrow" }; 
     foreach (var word in words) 
     { 
      choices.Add(new SemanticResultValue(word, word)); 
     } 
     var gbChoices = new GrammarBuilder(choices); 
     var key = new SemanticResultKey("press", gbChoices); 
     gb.Append(key, 1, 5); 
     return gb; 
    } 

    void recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) 
    { 
     Console.WriteLine("Recognized: " + e.Result.Text); 
    } 
} 

답변

4

당신은 문법에 SemanticResultKeySemanticResultValue 객체를 사용하려면, 다음의 정보는 다음의 제품에 e.Result.Semantics을 사용할 수 있습니다 다양한 결과를 추출하십시오.

SemanticValue은 사전이며 값은 SemanticValues 일 수 있으며 결과 트리가됩니다.

SemanticResultValues는 SemanticResultKeys와 연결되어야합니다.

var gb = new GrammarBuilder(); 
    var choices = new Choices(); 
    var words = LoadWords(); // string[] of "one", "left arrow" etc. 
    foreach (var word in words) 
    { 
     choices.Add(new SemanticResultValue(word, word)); 
    } 
    var gbchoices = new GrammarBuilder(choices); 
    var key = new SemanticResultKey("words", gbchoices); 

    gb.Append(key, 1, 5); // use implicit conversion from SemanticResultKey to GrammarBuilder 
+0

몇 가지 변형을 시도했지만 여러 구를 사용할 때 충돌이 계속 발생합니다. 코드로 업데이트했습니다. 어떤 아이디어? –

+0

@PhloxMidas 예제를 사용하여 새 질문을 업데이트/시작하고 백 트랙을 스택 할 수 있습니까? –

+0

@PhloxMidas가 귀하의 편집 내용을 보지 못했습니다. updated answer –

1

나는 dictationgrammar를 추가함으로써 TargetInvokationException을 제거했습니다.

_speech.LoadGrammar(new Grammar(new Choices(commands)) { Name = "commands" }); 
_speech.LoadGrammar(new DictationGrammar() { Name = "_background" }); 

SpeechRecognized 이벤트에서 결과가 명령 사전에서 오는 것인지 확인할 수 있습니다.

SpeechRecognized += (object sender, SpeechRecognizedEventArgs e) => 
    { 
    if (e.Result.Grammar.Name == "commands") 
    { 
     // command recognized 
    } 
    else 
    { 
     // "background noise" 
    } 
    }; 

결과는 다음과 같습니다. 더 이상 충돌이없고 매우 정확하고 안정적인 명령 (또는 경우에 따라서는 개별 단어?) 인식.