1

设想 :

我有 2 个命令。

1)在谷歌搜索“这里的任何单词”

2)打开应用程序“这里的任何单词”

问题 :

由于“Search 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);
}
4

2 回答 2

3

对于这类事情,您可以从RecognizedPhrase.Words属性中提取目标短语。由于前 3 个单词result.text将是“Search Google for”,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...
}
于 2013-10-28T06:09:52.923 回答
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);
}
于 2013-10-27T15:36:34.190 回答