2014-02-07 217 views
1

我正在將基礎結構重塑爲我的AI,首先使用「case」命令。任何人,我試圖改變它成爲一個if語句,然後嵌套if語句。嵌套if語句中的語句AI

所有的好處如下。

 InitializeComponent(); 
    } 

    private void Window_Loaded(object sender, System.Windows.RoutedEventArgs e) 
    { 
     recognizer.SetInputToDefaultAudioDevice(); 
     recognizer.LoadGrammar(new Grammar(new GrammarBuilder(new Choices(File.ReadAllLines(@"C:\Users\Deltagi\Documents\Commands.txt"))))); 
     GrammarBuilder builder = new GrammarBuilder(); 
     builder.AppendDictation(); 
     grammar = new Grammar(builder); 
     recognizer.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(_recognizer_SpeechRecognized); 
     recognizer.RecognizeAsync(RecognizeMode.Multiple); 
     Scot.Volume = 100; 
     Scot.Rate = 0; 
     Scot.SelectVoice("IVONA Brian"); 
     MainWebBrowser.IsEnabled = false; 
     MainWebBrowser.Visibility = Visibility.Hidden; 

    } 

    void _recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) 
    { 
     if (e.Result.Text == "hello") 
     { 
      Scot.Speak("Hello sir"); 

      if (e.Result.Text == "how are you") 
      { 
       Scot.Speak("im good sir"); 
      } 
     } 
    } 

第一個if語句在他們的作品中,但第二個不會。我可以聽到「你好」的聲音,但是當我說你好時,它什麼也不會說。爲什麼是這樣?

回答

2

在我看來,每次你說什麼都會有一個單獨的SpeechRecognizedEvent。所以,第一次你說「你好」時,它會打到第一個if語句並說「Hello Sir」。然而,當你說「你好嗎」時,一個全新的事件將被解僱,這意味着當它遇到第一個if語句時,e.Result.Text等於「你好嗎」,因此失敗並且根本沒有響應。

e.Result.Text在事件處理程序方法中永遠不會改變 - 這不是C#事件的工作方式。如果你真的想嵌套if語句,你可以建立一個標誌系統:

bool helloFlag = false; 
void _recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) 
{ 
    //First time you say something 
    if (e.Result.Text == "hello") 
    { 
     Scot.Speak("Hello sir"); 
     helloFlag = true; 
    } 

    //Second time you say something 
    if ((helloFlag == true) && (e.Result.Text == "how are you")) 
    { 
     Scot.Speak("im good sir"); 
    } 
} 

當然,如果你正在尋找一個可擴展解決方案,你可能想要的東西更穩健。祝你好運!

0

好吧所以TheBlueRage大部分是正確的!

 bool helloflag = false; 
    void _recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) 
    { 
     if (e.Result.Text == "hello") 
     { 
      Scot.Speak("Hello sir"); 
      helloflag = true; 
     } 

     if ((helloflag == true) && (e.Result.Text == "how are you")) 
     { 
      Scot.Speak("im good sir"); 
      helloflag = false; 
     } 
    } 

只是有我創建helloflag一個小變量,因此,它會被要求說一件事火了第二可能的響應!然後在第二個響應結束後,它也不會卡在if語句中!

0

我會救什麼用戶之前所說的,而不是使用一個布爾值這個詞,因爲你可能要添加不是「你好」更多 - >「IM好先生」

private static int count = 0; 

void _recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) 
{ 
    if(count == 0) 
    { 
     getSet.wordBefore = e.Result.Text; 
     count = 1; 
    } 
    else 
    { 
     count = 0 




     if (e.Result.Text == "hello") 
     { 
      Scot.Speak("Hello sir"); 

     } 

     if ((getSet.wordBefore == "Hello") && (e.Result.Text == "how are you")) 
     { 
      Scot.Speak("im good sir"); 

     } 
    } 
} 

public static class getSet 
{ 
    #region wordbefore 

    private static string _WordBefore; 
    public static string wordBefore 
    { 
     get {return _WordBefore;} 
     set { _WordBefore = value;} 
    } 
    #endregion 

} 
0

所以,途中「案例」命令和「if」語句連接是這樣的:

說你有這樣的事情(不包括在命令列表中的初始添加「早上好」的):

switch (e.Result.Text) 
{ 
    case "Good morning": 
     Scot.Speak("Morning, Jeffrey! How are you today?"); 
     if(e.Result.Text == "Terrible, absolutely terrible") 
     { 
      Scot.Speak("Oh, I hope you feel better sir"); 
     } 
     break;   
} 

呦你的「可怕的,絕對可怕的」命令將不會註冊。爲了解決這個問題,你會寫出來是這樣的:

public static int check1 = 0; //these "checks" are global variables 
public static int check2 = 0; 

switch (e.Result.Text) 
{ 
    case "Terrible, absolutely terrible": 
     if(check2 == 0) 
     { 
      Scot.Speak("What are you talking about?"); 
     } 
     break; 
    case "Good morning": 
     Scot.Speak("Morning, Jeffrey! How are you today?"); 
     //if(e.Result.Text == "Terrible, absolutely terrible") 
     //{ 
      //Scot.Speak("Oh, I hope you feel better sir"); 
     //} 
     check1++; 
     check2++; 
     break;   
} 

if(e.Result.Text == "Terrible, absolutely terrible") 
{ 
    if(check1 == 1) 
    { 
     if(check2 == 1) 
     { 
      Scot.Speak("Oh, I hope you feel better sir"); 
      check1--; 
     } 
     check2--; 
    } 
}  

現在,讓我來解釋一下這個過程:

1)你從代碼的「案例」塊去掉原來的「如果」塊。

2)您爲響應創建了單獨的「if」塊(「Terrible,abs ...」)。

3)您添加了「check1」和「check2」作爲「閘門」;我的意思是,你添加了「check1」以允許你分開的「if」語句(「if(e.Result ...」)給第二個「gate」留出空間。

4)「check2」門是可選的,但它基本上使「可怕,abso ...「可用於上下文(」早安「序列)和上下文(」案例'可怕...':)。我只是把「check2」顯示如何將1個命令分成兩個基於上下文的命令。 5)一旦你打開了兩個「門」,你只需要重置「check1」和「check2」變量來重置或「重新關閉」門,並使「可怕,絕對......」 「命令可以再次使用。

希望這可以幫助你和其他人。