2014-02-07 5 views
1

먼저 "case"명령을 사용하여 AI에 인프라를 개조하고 있습니다. 어떤 사람이 if 문이되도록 변경하려고하고 if 문을 중첩합니다.음성 AI에 중첩 된 if 문

다음과 같이 좋습니다.

 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가있는 것처럼 보입니다. 따라서 처음으로 "hello"라고 말하면 첫 번째 if 문을 치고 "Hello Sir"라고 말합니다. 그러나 "어떻게 지내세요?"라고 말하면 완전히 새로운 이벤트가 발생합니다. 즉, 첫 번째 if 문에 도달하면 e.Result.Text가 "어때?"와 동일하므로 실패하고 전혀 응답하지 않습니다.

e.Result.Text는 이벤트 처리기 메서드 내에서 절대 변경되지 않습니다. 즉, C# 이벤트의 작동 방식이 아닙니다. 당신이 정말로 경우 문 중첩 된하려는 경우, 당신은 플래그 시스템을 설정할 수 있습니다 : 당신이 확장 가능한 솔루션을 찾고 있다면, 물론

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"); 
    } 
} 

을, 당신은 아마 더 강력한 뭔가를 할 것입니다. AI와 함께 행운을 빌어 요!

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
당신이 "안녕하세요"보다 더 추가 할 수 있기 때문에, 사용자는 이전 대신 부울을 사용하는 말을 단어를 절약 할 수

-> "메신저 좋은 선생님"그래서

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

, 방법 "경우"명령과 문을 연결하는 "경우에하는 것은"이것이다는 :

는이 같은 (명령 목록에 "좋은 아침"의 초기 또한 제외)를 가지고 말 :

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;   
} 

요 ur "끔찍하고 절대적으로 끔찍한"명령은 등록되지 않습니다. 이 문제를 해결하려면, 당신은 이런 식으로 뭔가 쓰는 것입니다 : 이제

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"블록을 만들었습니다 ("끔찍한, abs ...").

3) "check1"및 "check2"를 "게이트"로 추가했습니다. 두 번째 "게이트"에 정리를 제공하기 위해 "if (e.Result ...") 문을 허용하기 위해 "check1"을 추가했습니다.

4) "check2" 게이트는 선택 사항이지만 기본적으로 "끔찍한, abso ..."" 컨텍스트 ("Good morning "시퀀스)에서 사용하고 에서 컨텍스트 ("case 'Terrible ...':)를 사용할 수 있습니다. 나는 단지 "check2"를 두어 명령어가 두 개로 나눌 수있는 방법을 보여준다. 문맥 기반 명령어.

5) "게이트"를 모두 연 후에는 "check1"및 "check2"변수를 재설정하여 게이트를 재설정하거나 "다시 닫고" "끔찍한, abs ..." "명령을 다시 사용할 수 있습니다.

희망이 당신과 다른 사람에게 도움이됩니다.