2017-08-28 10 views
0

J'ai un petit programme de commande vocale sur lequel je travaille et je voudrais le faire demander une confirmation quand on me donne une certaine commande ... Comme "bon ordinateur, fermer le programme" suivi de la question verbale "Etes-vous sûr?" et après cela répondant à ma réponse verbale; Oui ou non. Je suis assez nouveau à C# et je n'ai rien trouvé de similaire. Le code suivant est un exemple de commandes vocales que je l'ai déjà configuré:Comment demander à mon programme de demander une confirmation lors de l'utilisation d'une commande vocale?

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

Répondre

0

Vous pouvez avant d'exécuter la commande (vous avez parlé), exécutez un événement et demander la permission. Mais sachez que cette solution fonctionne avec une interface utilisateur. Pour antoher solution regarder l'option 2.

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

C'est une est une solution dont la rétroaction peut se synchonously sans travailler avec une liste, une sorte d'histoire.

Lorsque vous voulez de cette façon en répondant à "Êtes-vous sûr?", Vous pouvez travailler avec une liste. Cela signifie que vous lancez une commande et la place avec les informations sur cette commande dans une liste et exécute immédiatement une fonction qui lit les entrées de la liste. Vous devriez maintenant jouer avec les informations sur ces commandes, supprimer les entrées invalides, exécuter les fonctions lorsqu'elles sont vraies, etc.

Voici un petit exemple:

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