2017-08-28 77 views
0

我有一个小型的声音指挥程序,我正在努力,并且我想让它在给定某些命令时要求确认......就像“嘿计算机,关闭程序”,然后是口头问题“你确定吗?”。之后回应我的口头答复;是或否。我对c#相当陌生,找不到任何相关的东西。下面的代码是语音命令的示例,我已经配置:如何让我的程序在使用语音命令时要求确认?

private void recEngine_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) 
{ 
    switch (e.Result.Text) 
    {     
     case "hey computer, start spotify": 
      synthesizer.SelectVoiceByHints(VoiceGender.Female); 
      synthesizer.SpeakAsync("starting SPOTteFY"); 
      string appDataPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); 
      string extentionToPath = "Spotify\\Spotify.exe"; 
      string finalPath = Path.Combine(appDataPath, extentionToPath); 

      Process.Start(finalPath); 
      //Process.Start("C:\\Users\\Danny\\AppData\\Roaming\\Spotify\\Spotify.exe"); 
      break; 
     case "hey computer, start chrome": 
      synthesizer.SelectVoiceByHints(VoiceGender.Female); 
      synthesizer.SpeakAsync("Starting Chrome"); 
      Process.Start("C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe"); 
      break; 
     case "hey computer, new tab": 
      SendKeys.Send("^t"); 
      break; 
     case "hey computer, close program": 
      synthesizer.SelectVoiceByHints(VoiceGender.Female); 
      synthesizer.SpeakAsync("Closing program"); 
      SendKeys.Send("%{F4}"); 
      break; 
     case "next song please": 
      keybd_event(VK_MEDIA_NEXT_TRACK, 0, KEYEVENTF_EXTENTEDKEY, IntPtr.Zero); 
      break; 
     case "stop song please": 
      keybd_event(VK_MEDIA_PLAY_PAUSE, 0, KEYEVENTF_EXTENTEDKEY, IntPtr.Zero); 
      break; 
     case "hey computer, start netflix": 
      synthesizer.SelectVoiceByHints(VoiceGender.Female); 
      synthesizer.SpeakAsync("Starting Netflix"); 
      System.Diagnostics.Process.Start("https://www.netflix.com/browse"); 
      break; 
     case "hey computer, pause netflix": 
      SendKeys.Send(" "); 
      break; 
     case "hey computer, start reddit": 
      synthesizer.SelectVoiceByHints(VoiceGender.Female); 
      synthesizer.SpeakAsync("Starting reddit"); 
      System.Diagnostics.Process.Start("https://www.reddit.com"); 
      break; 
     case "hey computer, show me the news": 
      synthesizer.SelectVoiceByHints(VoiceGender.Female); 
      synthesizer.SpeakAsync("Showing you what's going on"); 
      System.Diagnostics.Process.Start("http://nu.nl"); 
      break; 

     case "hey computer, hide yourself": 
      this.WindowState = FormWindowState.Minimized; 
      break; 
    } 
} 

回答

0

您可以执行命令(你说)前,运行一个事件,并请求许可。但请注意,此解决方案适用于用户界面。对于antoher解决方案看选项2

选项1:

public SomeClass() { 
      PermissionEvent += this_PermissionEvent; 
      } 

      private void this_PermissionEvent(object sender, PermissionEventArgs args) { 
     // MessageBox.Show(...) waits until you closed the window (yes/no/closed/terminated) 
      if (MessageBox.Show("Do you want execute?","Grant Permission",MessageBoxButtons.YesNo) == DialogResult.Yes) { 
     args.Handle = true; 
     } 
      } 

      private event EventHandler<PermissionEventArgs> PermissionEvent; 

      private void recEngine_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) 
      { 
      switch (e.Result.Text) 
      {     
      case "hey computer, start spotify": 
      // 
      var args = new PermissionEventArgs(); 
    // args is a reference type. That means, when you change args.Handle in this_PermissionEvent(...) then this args.Handle is also changed. 
      PermissionEvent?.Invoke(args) 

    // here we check the condition that might be changed. 
      if (args.Handle) { 
      // do something here 
      } 
      break; 
      } 
      } 

      public class PermissionEventArgs : EventArgs { 
      public bool Handle = false 
      } 

这是一个是一个解决方案,其中反馈可以不与列表,是一种历史的工作synchonously发生。

当你想回答“你确定吗?”时,你可以使用一个列表。这意味着,您启动一​​个命令,并将关于此命令的信息放入列表中,并立即运行一个读取列表条目的函数。现在你应该使用关于这些命令的信息,删除无效的条目,当它们为真时执行功能等等。

这里一个小例子:

选项2:

  List<Entry> list; // This list contains the commands 

      public SomeClass() { 
      list = new List<Entry>(); // initializion of the list in the constructor 
      } 

      private void verifyList() { 
      if (list.Count == 0) 
      return; 

      if (list[0].Cmd == Command.Yes || list[0].Cmd == Command.No) { 
      list.Clear(); 
      } else if (!list[0].NeedConfirm || (list.Count == 2 && list[1].Cmd == Command.Yes)) { 
      list[0].Call?.Invoke(); 
      list.Clear(); 
      } else if (list.Count >= 2) { 
      list.Clear(); 
      } 
      } 

      private void recEngine_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) 
      { 
       switch (e.Result.Text) 
       {     
        case "hey computer, start spotify": 
      list.Add(new Entry() { Cmd = Command.Yes, Call = new Action(() => { 
      // start spotify 
      }) }); 
      verifyList(); 
         break; 
        case "confirm command": 
      list.Add(new Entry() { Cmd = Command.Yes }); 
      verifyList(); 
      break; 
case "do not confirm command": 
      list.Add(new Entry() { Cmd = Command.No }); 
      verifyList(); 
      break; 
      } 
      } 

    // This class holds all important stuff of one command. 
    // 1. The kind of command 
    // 2. the action that performs if condition in verifyList() are true 
    // 3. And NeedConfirm that the verifiyList() needs 
     public class Entry { 
     Command Cmd; 
     Action Call; 
     bool NeedConfirm; 
     } 

     public enum Command { 
     StartSpotify, 
     Yes, 
     No 
     } 
相关问题