Speech Recognition windows 10

I'm trying to build a speech recognition in Windows 10 (using Cortana) in Visual C#. This is part of my code for speech recognition using old System.Speech.Recognition and works great, but it only support english.

SpeechSynthesizer sSynth = new SpeechSynthesizer();
PromptBuilder pBuilder = new PromptBuilder();
SpeechRecognitionEngine sRecognize = new SpeechRecognitionEngine();
Choices sList = new Choices();


private void Form1_Load(object sender, EventArgs e)
{


}

private void button1_Click(object sender, EventArgs e)
{
    pBuilder.ClearContent();
    pBuilder.AppendText(textBox2.Text);
    sSynth.Speak(pBuilder);
}

private void button2_Click(object sender, EventArgs e)
{
    button2.Enabled = false;
    button3.Enabled = true;
    sList.Add(new string[] { "who are you", "play a song" });
    Grammar gr = new Grammar(new GrammarBuilder(sList));
    try
    {
        sRecognize.RequestRecognizerUpdate();
        sRecognize.LoadGrammar(gr);
        sRecognize.SpeechRecognized += sRecognize_SpeechRecognized;
        sRecognize.SetInputToDefaultAudioDevice();
        sRecognize.RecognizeAsync(RecognizeMode.Multiple);
    }

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

    }

    private void sRecognize_SpeechRecognized(object sender,              SpeechRecognizedEventArgs e)
    {
          textBox1.Text = textBox1.Text + " " + e.Result.Text.ToString() + "\r\n";           

         }

How can I do it using new speech recognition in windows 10?

Upvotes: 0

Views: 4182

Answers (2)

Iridio
Iridio

Reputation: 9271

Use Microsoft Speech Platform SDK v11.0 (Microsoft.Speech.Recognition).

It works like System.Speech, but you can use Italian language (separeted install) and also use SRGS Grammar. I work with both kinect (SetInputToAudioStream) and default input device (SetInputToDefaultAudioDevice) without hassle.

Also it works offline, so no need to be online as with Cortana. With the SRGS grammar you can get a decent level of complexity for your commands

UPDATE Here is how I initialize the recognizer

private RecognizerInfo GetRecognizer(string culture, string recognizerId)
{
  try
  {
    foreach (var recognizer in SpeechRecognitionEngine.InstalledRecognizers())
    {
      if (!culture.Equals(recognizer.Culture.Name, StringComparison.OrdinalIgnoreCase)) continue;
      if (!string.IsNullOrWhiteSpace(recognizerId))
      {
        string value;
        recognizer.AdditionalInfo.TryGetValue(recognizerId, out value);
        if ("true".Equals(value, StringComparison.OrdinalIgnoreCase))
          return recognizer;
      }
      else
        return recognizer;
    }
  }
  catch (Exception e)
  {
    log.Error(m => m("Recognizer not found"), e);
  }
  return null;
}

private void InitializeSpeechRecognizer(string culture, string recognizerId, Func<Stream> audioStream)
{
  log.Debug(x => x("Initializing SpeechRecognizer..."));
  try
  {
    var recognizerInfo = GetRecognizer(culture, recognizerId);
    if (recognizerInfo != null)
    {
      recognizer = new SpeechRecognitionEngine(recognizerInfo.Id);
      //recognizer.LoadGrammar(VoiceCommands.GetCommandsGrammar(recognizerInfo.Culture));
      recognizer.LoadGrammar(grammar);
      recognizer.SpeechRecognized += SpeechRecognized;
      recognizer.SpeechRecognitionRejected += SpeechRejected;
      if (audioStream == null)
      {
        log.Debug(x => x("...input on DefaultAudioDevice"));
        recognizer.SetInputToDefaultAudioDevice();
      }
      else
      {
        log.Debug(x => x("SpeechRecognizer input on CustomAudioStream"));
        recognizer.SetInputToAudioStream(audioStream(), new SpeechAudioFormatInfo(EncodingFormat.Pcm, 16000, 16, 1, 32000, 2, null));
      }
    }
    else
    {
      log.Error(x => x(Properties.Resources.SpeechRecognizerNotFound, recognizerId));
      throw new Exception(string.Format(Properties.Resources.SpeechRecognizerNotFound, recognizerId));
    }
    log.Debug(x => x("...complete"));
  }
  catch (Exception e)
  {
    log.Error(m => m("Error while initializing SpeechEngine"), e);
    throw;
  }
}

Upvotes: 2

Nikolay Shmyrev
Nikolay Shmyrev

Reputation: 25210

Cortana API usage example is here. You can copy it and start modifying according to your needs. It creates a dialog with the user. You can not exactly reproduce your System.Speech code with Cortana API because it is designed for another purpose. If you still want to recognize just few words, you can continue using System.Speech API.

System.Speech API supports other languages, not just English. You can find more information here:

Change the language of Speech Recognition Engine library

Upvotes: 0

Related Questions