C#SAPI - 识别没有预定义条件语句的短语

时间:2013-10-27 13:47:49

标签: c# .net speech-recognition grammar sapi

场景:

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

2 个答案:

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