Поддерживает ли Recognizer MS Speech Platform 11 скомпилированные грамматики ARPA? - PullRequest
0 голосов
/ 18 сентября 2018

Как я могу использовать файлы ARPA с MS Speech?Документация к Microsoft Speech Platform 11 Recognizer подразумевает, что можно скомпилировать грамматику из файла ARPA.

Я могу скомпилировать файл ARPA - например, крошечный пример , предоставленный Microsoft - используя следующую командную строку:

CompileGrammar.exe -In stock.arpa -InFormat ARPA

Я могу использовать полученный файл CFG в следующем тесте:

using Microsoft.Speech.Recognition;

// ...

using (var engine = new SpeechRecognitionEngine(new CultureInfo("en-US")))
{
    engine.LoadGrammar(new Grammar("stock.cfg"));
    var result = engine.EmulateRecognize("will stock go up");
    Assert.That(result, Is.Not.Null);
}

Этот тест пройден, но обратите внимание, чтоон использует EmulateRecognize().Когда я переключаюсь на использование реального аудиофайла, например, так:

using (var engine = new SpeechRecognitionEngine(new CultureInfo("en-US"))) 
{
    engine.LoadGrammar(new Grammar("stock.cfg"));
    engine.SetInputToWaveFile("go-up.wav");
    var result = engine.Recognize();
}

результат всегда равен нулю и тест не пройден.

Microsoft заявляет довольно четко что это поддерживается, но даже очень простые примеры, похоже, не работают.Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Существует два разных ответа на этот вопрос в зависимости от того, какую версию Microsoft Speech SDK вы используете.(См .: В чем разница между System.Speech.Recognition и Microsoft.Speech.Recognition? )

System.Speech (настольная версия)

В этом случаесм. ответ seiya1223 .Пример кода там прекрасно работает.

Microsoft.Speech (версия сервера)

Возможно, поскольку версия сервера не включает «механизм диктовки», библиотека Microsoft.Speech, очевидно, никогда не будет соответствует ARGA-источник CFG.Тем не менее, он все равно будет выдвигать гипотезу того, что было сказано через событие SpeechRecognitionRejected.Вот необходимые изменения в коде рабочего стола seiya1223:

  1. Измените оператор использования с System.Speech на Microsoft.Speech, конечно.
  2. Добавьте обработчик событий для SpeechRecognitionRejectedevent.
  3. В вашем обработчике событий проверьте свойство e.Result.Text для окончательной гипотезы.

Следующий фрагмент должен помочь проиллюстрировать:

static string transcription;

static void Main(string[] args)  
{
  using (var recognizer = new SpeechRecognitionEngine(new CultureInfo("en-us")))
  {
    engine.SpeechRecognitionRejected += SpeechRecognitionRejectedHandler;
    // ...
  }
}

void SpeechRecognitionRejectedHandler(object sender, SpeechRecognitionRejectedEventArgs e)
{
  if (e.Result != null && !string.IsNullOrEmpty(e.Result.Text))
    transcription = e.Result.Text;
}

ThisОбработчик вызывается один раз в конце распознавания.Например, вот вывод кода seiya1223, но с использованием всех доступных обработчиков событий и нескольких дополнительных журналов (выделено мое):

Запуск асинхронного распознавания ...
В SpeechDetectedHandler:
- AudioPosition = 00: 00: 01.2300000
В SpeechHypothesizedHandler:
- Имя грамматики = Фондовый;Текст результата = Go
В SpeechHypothesizedHandler:
- Имя грамматики = Фондовый;Текст результата = будет
В SpeechHypothesizedHandler:
- Имя грамматики = Фондовый;Текст результата = Запас будет
В SpeechHypothesizedHandler:
- Имя грамматики = Запас;Текст результата = Запас будет идти
В SpeechHypothesizedHandler:
- Имя грамматики = Запас;Текст результата = Запас будет расти
В SpeechRecognitionRejectedHandler:
- Имя грамматики = Запас;Текст результата = запас увеличится

В RecognizeCompletedHandler.
- AudioPosition = 00: 00: 03.2000000;InputStreamEnded = True
- Нет результата.
Готово.

0 голосов
/ 27 сентября 2018

На ваш вопрос:

Поддерживает ли распознаватель MS Speech Platform 11 скомпилированную ARPA грамматику?

Ответ: Да.

Рабочий кодна моей стороне , просто измените три свойства: Культура / Грамматика / WaveFile .Я не знаю вашего полного кода, но, основываясь на моем тесте и демонстрационном коде, я предполагаю, что основная причина в том, что нам нужно обработать SpeechRecognized на нашей стороне, чего вы, возможно, не сделали на вашей стороне.

static bool completed;

        static void Main(string[] args)  
        {
            // Initialize an in-process speech recognition engine.  
            using (SpeechRecognitionEngine recognizer =
               new SpeechRecognitionEngine(new CultureInfo("en-us")))
            {

                // Create and load a grammar.   
                Grammar dictation = new Grammar("stock.cfg");
                dictation.Name = "Dictation Grammar";

                recognizer.LoadGrammar(dictation);

                // Configure the input to the recognizer.  
                recognizer.SetInputToWaveFile("test.wav");

                // Attach event handlers for the results of recognition.  
                recognizer.SpeechRecognized +=
                  new EventHandler<SpeechRecognizedEventArgs>(recognizer_SpeechRecognized);
                recognizer.RecognizeCompleted +=
                  new EventHandler<RecognizeCompletedEventArgs>(recognizer_RecognizeCompleted);

                // Perform recognition on the entire file.  
                Console.WriteLine("Starting asynchronous recognition...");
                completed = false;
                recognizer.RecognizeAsync();

                // Keep the console window open.  
                while (!completed)
                {
                    Console.ReadLine();
                }
                Console.WriteLine("Done.");
            }

            Console.WriteLine();
            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }

        // Handle the SpeechRecognized event.  
        static void recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
        {
            if (e.Result != null && e.Result.Text != null)
            {
                Console.WriteLine("  Recognized text =  {0}", e.Result.Text);
            }
            else
            {
                Console.WriteLine("  Recognized text not available.");
            }
        }

        // Handle the RecognizeCompleted event.  
        static void recognizer_RecognizeCompleted(object sender, RecognizeCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                Console.WriteLine("  Error encountered, {0}: {1}",
                e.Error.GetType().Name, e.Error.Message);
            }
            if (e.Cancelled)
            {
                Console.WriteLine("  Operation cancelled.");
            }
            if (e.InputStreamEnded)
            {
                Console.WriteLine("  End of stream encountered.");
            }
            completed = true;
        }

enter image description here enter image description here

А содержание wav просто ", запас увеличится"(Продолжительность около 2 секунд).

Для получения дополнительной информации: https://docs.microsoft.com/en-us/dotnet/api/system.speech.recognition.speechrecognitionengine.setinputtowavefile?redirectedfrom=MSDN&view=netframework-4.7.2#System_Speech_Recognition_SpeechRecognitionEngine_SetInputToWaveFile_System_String_

...