贾维斯需要很长时间来回应

时间:2018-06-10 13:07:05

标签: c# speech-recognition

我正在使用c#制作jarvis。我把它编码了,一旦我们说了什么,贾维斯花了太长时间回复。需要10-15分钟才能回复,有时甚至不会回应。我希望一旦发出语音命令,jarvis就会迅速作出反应。

 using System;
    using System.IO;
    using System.Speech.Recognition;
    using System.Speech.Synthesis;
    using System.Windows.Forms;

    namespace Jarvis
    {
        public partial class Form1 : Form
        {
            SpeechRecognitionEngine _recognizer = new SpeechRecognitionEngine();
            SpeechSynthesizer JARVIS = new SpeechSynthesizer();
            string QEvent;
            string ProcWindow;
            double timer = 10;
            int count = 1;
            Random rnd = new Random();
            public Form1()
            {
                InitializeComponent();
            }

            private void Form1_Load(object sender, EventArgs e)
            {
                _recognizer.SetInputToDefaultAudioDevice();
                _recognizer.LoadGrammar(new Grammar(new GrammarBuilder(new Choices(File.ReadAllLines(@"C:\Users\Ashwini\Desktop\Jarvis\Jarvis\bin\Debug\commands.txt")))));
                _recognizer.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(_recognizer_SpeechRecognized);
                _recognizer.RecognizeAsync(RecognizeMode.Multiple);
            }
            void _recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
            {
                int ranNum = rnd.Next(1, 10);
                string speech = e.Result.Text;
                switch (speech)
                {

                    case "hello":
                    case "hello jarvis":
                        if (ranNum < 6) { JARVIS.Speak("Hello sir"); }
                        else if (ranNum > 5) { JARVIS.Speak("Hello"); }
                        break;
                    case "goodbye":
                    case "goodbye jarvis":
                    case "close":
                    case "close jarvis":
                        JARVIS.Speak("Until next time");
                        Close();
                        break;
                    case "jarvis":
                        if (ranNum < 5) { QEvent = ""; JARVIS.Speak("Yes sir"); }
                        else if (ranNum > 4) { QEvent = ""; JARVIS.Speak("Yes?"); }
                        break;

                    //WEBSITES
                    case "open google":
                        System.Diagnostics.Process.Start("https://www.google.com/");
                        break;
                    case "open my facebook":
                        System.Diagnostics.Process.Start("https://www.facebook.com/");
                        break;
                    case "open gmail":
                        System.Diagnostics.Process.Start("https://www.google.com/gmail/");
                        break;

                    //SHELL COMMANDS
                    case "open this pc":
                        System.Diagnostics.Process.Start("This PC");
                        JARVIS.Speak("Loading");
                        break;

                    case "open my folder":
                        System.Diagnostics.Process.Start("F:");
                        JARVIS.Speak("Loading");
                        break;

                    //CLOSE PROGRAMS
                    case "close this pc":
                        ProcWindow = "This PC";
                        StopWindow();
                        break;

                    //CONDITION OF DAY
                    case "what time is it":
                        DateTime now = DateTime.Now;
                        string time = now.GetDateTimeFormats('t')[0];
                        JARVIS.Speak(time);
                        break;
                    case "what day is it":
                        JARVIS.Speak(DateTime.Today.ToString("dddd"));
                        break;
                    case "whats the date":
                    case "whats todays date":
                        JARVIS.Speak(DateTime.Today.ToString("dd-MM-yyyy"));
                        break;

                    //OTHER COMMANDS
                    case "go fullscreen":
                        FormBorderStyle = FormBorderStyle.None;
                        WindowState = FormWindowState.Maximized;
                        TopMost = true;
                        JARVIS.Speak("expanding");
                        break;
                    case "exit fullscreen":
                        FormBorderStyle = FormBorderStyle.Sizable;
                        WindowState = FormWindowState.Normal;
                        TopMost = false;
                        break;
                    case "switch window":
                        SendKeys.Send("%{TAB " + count + "}");
                        count += 1;
                        break;

                    case "out of the way":
                        if (WindowState == FormWindowState.Normal || WindowState == FormWindowState.Maximized)
                        {
                            WindowState = FormWindowState.Minimized;
                            JARVIS.Speak("My apologies");
                        }
                        break;
                    case "come back":
                        if (WindowState == FormWindowState.Minimized)
                        {
                            JARVIS.Speak("Alright?");
                            WindowState = FormWindowState.Normal;
                        }
                        break;
                    case "show commands":
                        string[] commands = (File.ReadAllLines(@"C:\Users\Ashwini\Desktop\Jarvis\Jarvis\bin\Debug\commands.txt"));
                        JARVIS.Speak("Very well");
                        lstCommands.Items.Clear();
                        lstCommands.SelectionMode = SelectionMode.None;
                        lstCommands.Visible = true;
                        foreach (string command in commands)
                        {
                            lstCommands.Items.Add(command);
                        }
                        break;
                    case "hide listbox":
                        lstCommands.Visible = false;
                        break;

                }
            }

            private void StopWindow()
            {

            }
        }
    }

我不知道这段代码有什么问题。请帮帮我。

1 个答案:

答案 0 :(得分:0)

有关语音识别的深入教程,请参阅我的教程https://youtu.be/BJkymbvxlJs

使用语音识别时,您需要使用Async方法。 Jarvis.SpeakAsync异步方法将提供持续的命令和指令。

仅使用Jarvis.Speak,您必须等待引擎完成。例如:

  Jarvis.Speak("this is what Jarvis will say after a  command is spoken");

使用Jarvis.Speak时,您无法在合成时执行任何命令。

   Jarvis.SpeakAsync("this is what Jarvis will say after a command is spoken");

使用Jarvis.SpeakAsync时,您可以在合成过程中暂停,停止和/或中断语音引擎。

上面的教程链接显示了SpeakAsync的基本格式以及如何在语音识别应用程序中使用它。