2

So basically I used two speech recognition engines(speechrecog & speechrecog1) and one speech synthesizer. When the speechrecog is asked a question like how are you it then replies I am fine (if the computer picks 2 from the two numbers 1,2). Then it initializes the second speech recognition engine. When it does its stuff. It then turns the second one off and the first one on again. But the problem is when using the second speech recognition engine it repeats( speech synthesizer) the number of times I have tried the second speech recognition engine out. Here's my code for that form:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Speech.Recognition;
using System.Speech.Synthesis;
using System.Threading;
namespace Project_Juliet
{
    public partial class Form11 : Form
    {
        public Form11()
        {
            InitializeComponent();
        }
        class FullScreen
        {
            public void EnterFullScreenMode(Form targetForm)
            {
                targetForm.WindowState = FormWindowState.Normal;
                targetForm.FormBorderStyle = FormBorderStyle.None;
                targetForm.WindowState = FormWindowState.Maximized;
            }

            public void LeaveFullScreenMode(Form targetForm)
            {
                targetForm.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Sizable;
                targetForm.WindowState = FormWindowState.Normal;
            }
        }


       // System.Globalization.CultureInfo cl2 = new System.Globalization.CultureInfo("en-US");

        SpeechRecognitionEngine speechrecog = new SpeechRecognitionEngine(/*new System.Globalization.CultureInfo("en-IN")*/);
        SpeechSynthesizer ss = new SpeechSynthesizer();
        PromptBuilder pb = new PromptBuilder();
        Choices zlist = new Choices();
        Form2 frm = new Form2();
        FullScreen fs = new FullScreen();
        bool SpeechRecognitionState = true;
        Choices dirlist = new Choices();
        SpeechRecognitionEngine speechrecog1 = new SpeechRecognitionEngine(/*new System.Globalization.CultureInfo("en-IN")*/);
        bool sprs2 = false;
        Choices us = new Choices();
        string dir234;
        string[] gm;



        private void Form11_Load(object sender, EventArgs e)
        {

            listBox1.Visible = false;
            string dir = "C:/Users/" + Environment.UserName + "/Documents/Juliet/response";
            DirectoryInfo dinfo = new DirectoryInfo(dir);
            FileInfo[] Files = dinfo.GetFiles("*.txt");
            webBrowser1.ScriptErrorsSuppressed = true;



            foreach (FileInfo file2 in Files)
            {
                string yts = ".txt";

                listBox1.Items.Add(file2.Name.Replace(yts + "", ""));
            }
           /* String[] list = new String();
            list = listBox1.Items.OfType<string>().ToList();
            */




           fs.EnterFullScreenMode(this);
           textBox1.Width = toolStrip1.Width - 10;
           // toolStripTextBox1.Width = toolStrip1.Width - 30;
           // toolStripTextBox1.Select();
            pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
            ss.SelectVoiceByHints(VoiceGender.Female, VoiceAge.Teen);
            zlist.Add(new string[] { "exit"});
            Grammar gr = new Grammar(new GrammarBuilder(zlist));
            gr.Weight = 0.9f;

            dirlist.Add(new string[]{"Mr.Danely"});

            foreach (FileInfo file2 in Files)
            {
                string yts = ".txt";

                dirlist.Add(file2.Name.Replace(yts + "", ""));
            }
            Grammar gr1 = new Grammar(new GrammarBuilder(dirlist));
            gr1.Weight = 1f;
            Grammar tgi = new DictationGrammar();
            tgi.Weight = 0.3f;
            try
            {

                if (SpeechRecognitionState == true)
                {
                    speechrecog.RequestRecognizerUpdate();
                    speechrecog.LoadGrammar(gr);
                    speechrecog.LoadGrammar(gr1);
                    speechrecog.LoadGrammar(tgi);
                    speechrecog.SpeechRecognized += speechrecog_SpeechRecognized;
                    speechrecog.SetInputToDefaultAudioDevice();
                    speechrecog.RecognizeAsync(RecognizeMode.Multiple);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error");
            }

            //us.Add(new string[] { "yes","no","good","bad" });
            us.Add(new string[] { "exit" });
            Grammar gr12 = new Grammar(new GrammarBuilder(us));
            if (sprs2 == true)
            {

            }

        }

        void speechrecog1_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
        {


           if(File.Exists(@"C://Users//" + Environment.UserName + "//Documents//Juliet//response//r1//"+e.Result.Text.ToString()+".txt"))
           {

               string hjjk = @"C://Users//" + Environment.UserName + "//Documents//Juliet//response//r1//" + e.Result.Text.ToString() + ".txt";
                          StreamReader file = new StreamReader(hjjk);
                          string readText = file.ReadLine();
                          file.Close();
                          ss.Speak(readText);
                          timer2.Interval = 10;
                          timer2.Start();

           }

          }



          void speechrecog_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
          {
              string igput = e.Result.Text.ToString();
              dir234 = @"C://Users//" + Environment.UserName + "//Documents//Juliet//response//" + igput + ".txt";
              if (igput == "exit")
              {

                  speechrecog.RecognizeAsyncStop();
                  this.Hide();

                  frm.Closed += (s, args) => this.Close();
                  frm.Show();
              }
              else
              {
                  if (File.Exists(dir234))
                  {
                      StreamReader file = new StreamReader(dir234);
                      string readText = file.ReadLine();
                      file.Close();
                      if (readText.Contains("%"))
                      {
                          string[] words = readText.Split('%');
                          Random r = new Random();
                          int selection = r.Next(1, 3);

                          if (selection == 1)
                          {

                              ss.SpeakAsync(words[0]);
                          }
                          if (selection == 2)
                          {

                              if (readText.Contains('#'))
                              {
                                  SpeechRecognitionState = false;
                                  us.Add(new string[] { "exit" });
                                  gm = words[1].Split('#');
                                  string speak = words[0] + gm[0];
                                  ss.SpeakAsync(speak);
                                  List<string> lk = gm.ToList();
                                  lk.RemoveAt(0);
                                  string[] hkl = lk.ToArray<string>();
                                  foreach(string g3 in hkl)
                                  {
                                      if (g3.Contains(".txt"))
                                      {
                                          string fj = g3.Replace(".txt" + "", "");
                                          us.Add(fj);
                                      }
                                      else
                                      {
                                          string fj = g3;
                                          us.Add(fj);


                                      }
                                  }

                                  string dir333 = @"C://Users//" + Environment.UserName + "//Documents//Juliet//response//r1";
                                  Grammar gr12 = new Grammar(new GrammarBuilder(us));


                                  try
                                  {
                                      speechrecog1.RequestRecognizerUpdate();
                                      speechrecog1.LoadGrammar(gr12);
                                      speechrecog1.SpeechRecognized += speechrecog1_SpeechRecognized;
                                      speechrecog1.SetInputToDefaultAudioDevice();
                                      speechrecog1.RecognizeAsync(RecognizeMode.Single);
                                      //speechrecog1.RecognizeAsyncStop();
                                      //speechrecog.RecognizeAsync(RecognizeMode.Multiple);
                                      //_completed.WaitOne(); // wait until speech recognition is completed




                                  }
                                  catch (Exception ex)
                                  {
                                      MessageBox.Show(ex.Message, "Error");
                                  }

                                 // timer2.Interval = 7000;
                                  //timer2.Start();

                                 // timer2.Interval = 5000;
                                  //timer2.Start();



                              }
                              else

                              {
                                  string speak = words[0] + words[1];
                                  ss.SpeakAsync(speak);
                              }

                          }

                      }
                      else
                      {
                          ss.Speak(readText);
                      }
                  }
                  else

                  {
                      try
                      {
                          tabControl1.SelectedIndex = 1;
                          webBrowser1.Navigate("https://www.google.com/search?q=" + e.Result.Text.ToString());
                      }
                      catch (Exception ex)
                      {
                          string ggh = "Error"+ex;
                      }
                  }
              }
              /* SpeechRecognitionState = false;
               timer1.Interval = 3000;
                timer1.Start();
               *  */
            textBox1.Text = "You: "+e.Result.Text.ToString();

        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            SpeechRecognitionState = true;
            timer1.Stop();
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void pictureBox1_Click(object sender, EventArgs e)
        {

        }

        private void timer2_Tick(object sender, EventArgs e)
        {
             //loading the grammar again somehow make the recognition better
           speechrecog.UnloadAllGrammars();
        Grammar gr1 = new Grammar(new GrammarBuilder(dirlist));
        gr1.Weight = 1f;
        Grammar tgi = new DictationGrammar();
        tgi.Weight = 0.3f;
        Grammar gr = new Grammar(new GrammarBuilder(zlist));
        gr.Weight = 0.9f;
        speechrecog.LoadGrammar(gr);
        speechrecog.LoadGrammar(gr1);
        speechrecog.LoadGrammar(tgi);
            SpeechRecognitionState = true;
            speechrecog1.RecognizeAsyncStop();

            speechrecog1.UnloadAllGrammars();

            timer2.Stop();
        }

    }
}

For example: the text file how are you.txt contains: i am fine. thank you.% how are you#good#bad and the computer asks if im good and I reply with good. In the good.txt file: Oh thats cool

the first time I ask her: How are you?

Reply:I am fine thankyou. How are you

User: good

reply: Oh thats cool(1 time)

the 2nd time I ask her: How are you?

Reply:I am fine thankyou. How are you

User: good

reply: Oh thats cool(repeats it 2 times)

the 3rd time I ask her: How are you?

Reply:I am fine thankyou. How are you

User: good

reply: Oh thats cool(repeats it 3 times)

How do i fix the repetition problem.

Mr.Dan
  • 21
  • 3
  • 1
    Theres a lot going on here, can you narrow down the method that is causing the problem? First try disabling one of the speech synthesizers and go from there. – Rick james Feb 17 '17 at 21:11
  • @Rick James That's the problem i've tried isolating my mistake but can't figure out where I went wrong. btw there's only one speech synthesizer – Mr.Dan Feb 17 '17 at 22:41
  • Have you set a breakpoint and stepped through it? – Rick james Feb 17 '17 at 22:45
  • @Rick James yup plus it won't work because something goes wrong the second time you ask her, so if a put a break the first won't go through... – Mr.Dan Feb 17 '17 at 22:55
  • Designer.cs : http://pastebin.com/ds0avZMc – Mr.Dan Feb 17 '17 at 23:36
  • Possible duplicate of [Why is my event handler firing twice?](http://stackoverflow.com/questions/10768676/why-is-my-event-handler-firing-twice) – Nikolay Shmyrev Feb 19 '17 at 16:42
  • Your problem is that you run `speechrecog1.SpeechRecognized += speechrecog1_SpeechRecognized; ` multiple times. You need to do that only once when recognizer is initialized. – Nikolay Shmyrev Feb 19 '17 at 16:43
  • Also see http://stackoverflow.com/questions/367523/how-to-ensure-an-event-is-only-subscribed-to-once – Nikolay Shmyrev Feb 19 '17 at 16:44
  • Thanks @NikolayShmyrev – Mr.Dan Feb 20 '17 at 05:01

1 Answers1

0

Thanks to @Nikolay Shmyrev I found the solution. As he said my event handler was firing twice. So inside it I put a:

try
{
    //My code
}
finally
{
    speechrecog1.SpeechRecognized -= speechrecog1_SpeechRecognized;
}
Mr.Dan
  • 21
  • 3