我有2个命令。
1)在Google上搜索“此处有任何字词”
2)打开应用程序“这里有任何字”
由于“搜索Google for”之后的单词可以是任何内容,我怎么想知道我要为IF语句写什么?
使用预定义的句子,我可以轻松地完成
void Engine_SpeechRecognized (object sender, SpeechRecognizedEventsArgs e)
{
if (e.Result.Text == "Search Google Stackoverflow")
{
Search("Stackoverflow");
}
}
但是从现在开始它没有预定义,我想是什么 写我的IF声明条件? 这不是我能做到的,
if (e.Result.Text == "Search Google" + e.Result.Text)
{
Search(e.Result.Text);
}
那么,我该怎么做呢?如果我只有1个命令并且只需执行就很容易 1动作,然后我可以将默认动作设置为Search(),但现在案例不同。
这是我的代码(只有1个命令和动作,我需要2个及以上) *使用System.Speech
public MainWindow()
{
InitializeComponent();
builder.Append("search google for"); builder.AppendDictation();
Grammar grammar = new Grammar(builder);
grammar.Name = ("Google Searching");
engine.LoadGrammarAsync(grammar);
engine.SetInputToDefaultAudioDevice();
engine.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(Engine_SpeechRecognized);
engine.RecognizeAsync(RecognizeMode.Multiple);
}
string result;
void Engine_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
txtSpeech.Text = e.Result.Text;
ExtractKeywords(e.Result.Text);
OpenApp("https://www.google.com/#q=" + result);
}
答案 0 :(得分:3)
对于这类事情,您可以从RecognizedPhrase.Words
属性中提取目标短语。由于result.text
的前3个字将成为“搜索Google”,result.words[3]..results.words[result.words.count-1]
将会有要搜索的短语。
将它们连接起来然后离开。
要支持多个操作,请使用Grammar.Name
属性来确定要运行的命令。
void Engine_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
txtSpeech.Text = e.Result.Text;
ExtractKeywords(e.Result.Text);
if (e.Result.Grammar.Name.Equals("Google Search"))
{
OpenApp("www.google.com", result);
}
else if (e.Result.Grammar.Name.Equals("StackOverflow Search"))
{
OpenApp("www.stackoverflow.com", result);
}
// etc...
}
答案 1 :(得分:1)
您可以使用带有表示命令的键的字典和带有要执行的命令的匿名方法。为了提高性能,你最好将Dictionary重构为静态,并且只实例化一次,但这会给你一般的想法。
void Engine_SpeechRecognized (object sender, SpeechRecognizedEventsArgs e)
{
var commands = new Dictionary<string, Action<string>>();
commands.Add(
"search google",
(arg) => { Search(arg); }) ;
commands.Add(
"open application",
(arg) => { OpenApp( "https://www.google.com/#q=" + arg); }) ;
foreach(var command in commands.Keys)
{
if (e.Result.Text.StartsWith(command))
{
Action(command, e.Result.Text, commands[command]);
}
}
}
/* helper for getting one point for an arguments extractor */
static void Action(string cmd,string all, Action<string> act)
{
string args = all.Replace(cmd,"");
act(args);
}