Распознавание речи windows 10

Я пытаюсь создать распознавание речи в Windows 10 (используя Cortana) в Visual C#. Это часть моего кода для распознавания речи с использованием старого System.Speech.Recognition, и он прекрасно работает, но поддерживает только английский язык.

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

         }

Как я могу сделать это, используя новое распознавание речи в Windows 10?


person Marcello Christophar Vecchio    schedule 03.11.2015    source источник
comment
Stack Overflow — это сайт вопросов и ответов, и вы не задавали вопрос.   -  person Dour High Arch    schedule 03.11.2015
comment
Вопрос как сделать в виндовс 10 с помощью апи для кортаны? Я думал, что это очевидно.   -  person Marcello Christophar Vecchio    schedule 03.11.2015


Ответы (2)


Используйте SDK Microsoft Speech Platform v11.0 (Microsoft.Speech.Recognition).

Он работает как System.Speech, но вы можете использовать итальянский язык (отдельная установка), а также использовать Грамматика SRGS. Я без проблем работаю как с kinect (SetInputToAudioStream), так и с устройством ввода по умолчанию (SetInputToDefaultAudioDevice).

Также он работает в автономном режиме, поэтому не нужно быть в сети, как с Cortana. С грамматикой SRGS вы можете получить достойный уровень сложности для ваших команд.

ОБНОВЛЕНИЕ Вот как я инициализирую распознаватель

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;
  }
}
person Iridio    schedule 03.11.2015
comment
Я тоже пробовал, но после установки SDK и итальянского языка и установки моей культуры на (это-это), когда я запускаю программу, возникает эта ошибка: в вашей культуре не найдено распознавание речи. Вы знаете, почему это происходит? - person Marcello Christophar Vecchio; 03.11.2015
comment
Распознаватель требуемого идентификатора не найден в SpeechRecognitionEngine распознаватель = new SpeechRecognitionEngine(it-IT); - person Marcello Christophar Vecchio; 03.11.2015
comment
Я добавил фрагмент кода, который использую для инициализации распознавателя. - person Iridio; 04.11.2015

Пример использования Cortana API здесь. Вы можете скопировать его и начать изменять в соответствии с вашими потребностями. Он создает диалог с пользователем. Вы не можете точно воспроизвести код System.Speech с помощью Cortana API, потому что он предназначен для другой цели. Если вы все еще хотите распознавать всего несколько слов, вы можете продолжать использовать System.Speech API.

System.Speech API поддерживает другие языки, а не только английский. Дополнительную информацию можно найти здесь:

Изменить язык библиотеки механизма распознавания речи

person Nikolay Shmyrev    schedule 03.11.2015
comment
К сожалению, он не поддерживает итальянский язык. Я предполагаю, что мой другой вариант - использовать cmusphinx - person Marcello Christophar Vecchio; 03.11.2015