2013-10-27 50 views
1

場景:

我有2個命令。C#SAPI - 識別沒有預定義條件語句的短語

1)搜索谷歌「這裏的任何詞」

2)打開應用程序「是任何詞」

問題:後

由於單詞「搜索谷歌」可以是任何東西,我想怎麼知道我要爲我的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操作,那麼我可以將默認操作設置爲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); 
} 

回答

3

對於這樣的事情,你可以拉從RecognizedPhrase.Words財產的目標短語。由於result.text的前三個單詞將是「搜索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... 
} 
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); 
}