은 내가 나를 위해 작동 해결책을 찾은 것 같아요하지만 여전히이있는 경우 더 우아한 하나를 찾을 것이 좋을 것이다 : 나는 받아쓰기 문법과 "자리"를 정의
. 그런 다음 문법을로드하고 즉시 문을 닫습니다.
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}
}
"MYPLACEHOLDER"는 명령을 실행하기 위해 선택한 단어 또는 구입니다. –