Вопрос по c# – Событие распознавания речи не запускается в службе Windows

8

Итак, у меня есть служба Windows с распознаванием речи, реализованная с использованием механизма распознавания system.speech. Мой код распознавания речи работает нормально, когда я запускаю службу, но нет событий для распознавания речи пожаров. Странно то, что если я запускаю точно такой же код, но вместо этого в консоли или в приложении WPF, событие для распознавания речи работает просто отлично.
Я уже подключил отладчик к своему процессу обслуживания, чтобы проверить, что происходит за кулисами. Кажется, что механизм распознавания речи правильно загружает грамматики, устанавливает режим непрерывного прослушивания и правильно устанавливает событие распознавания речи. Никаких исключений не выбрасывается, поэтому я не слишком уверен, что здесь не так. Есть идеи?

Ваш Ответ

3   ответа
2

как аудиосистема будет работать в сервисе, если вы пытаетесь использовать аудиоустройство по умолчанию. Если вы пытаетесь конвертировать аудиофайлы или поток, убедитесь, что вы используете распознаватель InProc.

Если вы создаете серверное приложение, вам, вероятно, следует подумать об использовании Microsoft.Speech API и серверных реконфигураторов. Видеть В чем разница между System.Speech.Recognition и Microsoft.Speech.Recognition? и Microsoft Speech Platform SDK -http: //www.microsoft.com/en-us/download/details.aspx ID = 27226

Если вы пытаетесь выполнить непрерывное распознавание без приложения на переднем плане, я полагаю, что общий распознаватель может удовлетворить ваши потребности. Распознаватель рабочего стола Microsoft, который поставляется в Windows 7 и Vista, может работать в двух режимах: inproc или shared. Распознаватели общего доступа полезны на рабочем столе, где голосовые команды используются для управления любыми открытыми приложениями. В System.Speech вы можете использовать SpeechRecognizer для доступа к общему рабочему столу или SpeechRecognitionEngine иметь специальный распознаватель inproc для вашего приложения. Возможно, вы сможете использовать разделяемый распознаватель для непрерывного распознавания вашего приложения, даже если ваше приложение не находится на переднем плане.

Есть очень хорошая статья, которая была опубликована несколько лет назад наhttp: //msdn.microsoft.com/en-us/magazine/cc163663.asp. Это, наверное, лучшая вступительная статья, которую я когда-либо нашел. Это говорит:

еханизм распознавания @ ... может быть создан в другом процессе, который называется SAPISVR.EXE. Это обеспечивает общий механизм распознавания, который может использоваться одновременно несколькими приложениями. Эта конструкция имеет ряд преимуществ. Во-первых, для распознавателей обычно требуется значительно больше ресурсов времени выполнения, чем для синтезаторов, и совместное использование распознавателя является эффективным способом уменьшения накладных расходов. Во-вторых, разделяемый распознаватель также используется встроенной речевой функциональностью Windows Vista. Поэтому приложения, использующие общий распознаватель, могут использовать микрофон системы и интерфейс обратной связи. Нет дополнительного кода для написания и нового пользовательского интерфейса для изучения пользователем. Новое в SAPI 5.3

Я использую микрофон и не создаю серверное приложение. Bob
Я не знаю, можно ли использовать аудиоустройство по умолчанию в службе. Какой у вас вариант использования? Если вы пытаетесь выполнить непрерывное распознавание без приложения на переднем плане, я думаю, что общий распознаватель может удовлетворить ваши потребности. Michael Levy
Я обновил свой ответ, включив в него дополнительную информацию, которая, я надеюсь, будет полезна. Michael Levy
Да, мое приложение должно постоянно слушать речь в фоновом режиме. Что именно вы имеете в виду под общим распознавателем? Bob
Я не знаю, но сервисы, взаимодействующие с устройствами, довольно сложны, и обычно их следует избегать. Видеть Msdn.microsoft.com / EN-US / библиотека / ms683502 (VS.85) .aspx, Support.microsoft.com / кб / 327618, Us.generation-nt.com / ответ / .... Michael Levy
4

т SpeechRecognitionEngine, если что-то вроде этого:

static ManualResetEvent _completed = null;
static void Main(string[] args)
{
     _completed = new ManualResetEvent(false);
     SpeechRecognitionEngine _recognizer = new SpeechRecognitionEngine();
     _recognizer.RequestRecognizerUpdate(); // request for recognizer update
     _recognizer.LoadGrammar(new Grammar(new GrammarBuilder("test")) Name = { "testGrammar" }); // load a grammar
     _recognizer.RequestRecognizerUpdate(); // request for recognizer update
     _recognizer.LoadGrammar(new Grammar(new GrammarBuilder("exit")) Name = { "exitGrammar" }); // load a "exit" grammar
     _recognizer.SpeechRecognized += _recognizer_SpeechRecognized; 
     _recognizer.SetInputToDefaultAudioDevice(); // set the input of the speech recognizer to the default audio device
     _recognizer.RecognizeAsync(RecognizeMode.Multiple); // recognize speech asynchronous
     _completed.WaitOne(); // wait until speech recognition is completed
     _recognizer.Dispose(); // dispose the speech recognition engine
} 
void _recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
     if (e.Result.Text == "test") // e.Result.Text contains the recognized text
     {
         Console.WriteLine("The test was successful!");
     } 
     else if (e.Result.Text == "exit")
     {
         _completed.Set();
     }
}

@Also также была проблема, похожая, когда я использовал SpeechRecognition, а не SpeechRecognitionEngine. Выше приведен отличный пример использования + прослушивания событий в другом потоке. p.s: я получил ссылку из отличной статьи: Распознавание речи, речь в текст, текст в речь и синтез речи в C # повеселись :

"должен быть запущен в отдельной ветке", ты действительно спас мне жизнь! Crasher
Если вы используете RequestRecognizerUpdate, я думаю, что вы должны затем использовать обработчик событий RecognizerUpdateReached для вызова LoadGrammar, плюс вы должны делать все вызовы LoadGrammar вместе в этом обработчике событий. Однако, если распознаватель еще не запущен, не должно быть необходимости вызывать RequestRecognizerUpdate в первую очередь (можно удалить его) George Birbilis
@ Robocide проголосовал! Я делал нечто подобное - ставил в очередь несколько заданий по распознаванию речи, и это помогло мне (используяManualResetEvent а такжеWaitOne(). Я пытался выяснить, как избавиться от существующего_recognizer для следующего задания в очереди как MSDN утверждает, что "звонитDispose() в обработчике событий -н посоветовал ". Надеюсь, это кому-нибудь поможет! Jia Jian
btw, шаблон, который я придумал в SpeechLib SpeechLib.codeplex.com) после множества проб и ошибок загрузка грамматики, когда распознавание речи уже началось, упоминается в конце Zoomicon.wordpress.com / 2015/12 / 07 / ... George Birbilis
1

Я полагаю, что эта настройка распространяется на взаимодействие с пользовательскими интерфейсными устройствами, такими как микрофон.

Я думал, что это могло быть проблемой, но это не решает ее: Bob

Похожие вопросы