У меня есть приложение Windows 10 UWP, для которого я включаю распознавание голоса для текстового поля. Да, я знаю, что я также могу использовать Кортану для этого. Тем не менее, Cortana также имеет некоторые недостатки, в основном из-за того, что вы практически не контролируете Cortana из приложения.
Именно здесь и происходит непрерывное распознавание пространства имен SpeechRecognizer. Мне нравится степень моего контроля. Однако через несколько секунд он случайно перестает слушать.
Вот как я это реализовал. Обратите внимание, что я также пытался установить для каждого возможного времени ожидания значение 0, которое не должно означать никакого времени ожидания.
Свойства на странице:
private SpeechRecognizer speechRecognizer;
private CoreDispatcher dispatcher;
OnLoaded для страницы:
speechRecognizer = new SpeechRecognizer();
speechRecognizer.Timeouts.BabbleTimeout = TimeSpan.FromSeconds(0);
speechRecognizer.Timeouts.InitialSilenceTimeout = TimeSpan.FromSeconds(0);
speechRecognizer.Timeouts.EndSilenceTimeout = TimeSpan.FromSeconds(0);
speechRecognizer.ContinuousRecognitionSession.AutoStopSilenceTimeout = TimeSpan.FromSeconds(0);
SpeechRecognitionCompilationResult result = await speechRecognizer.CompileConstraintsAsync();
speechRecognizer.ContinuousRecognitionSession.ResultGenerated += ContinuousRecognitionSession_ResultGenerated;
speechRecognizer.StateChanged += SpeechRecognizer_StateChanged;
Затем, когда я нажимаю кнопку, чтобы начать прослушивание, я делаю это, чтобы начать:
if (speechRecognizer.State == SpeechRecognizerState.Idle)
{
await speechRecognizer.ContinuousRecognitionSession.StartAsync();
}
Наконец, я слушаю два описанных выше обработчика событий ResultGenerated и StateChanged. У меня установлены контрольные точки в этих двух событиях. Когда страница загружается, все создается просто отлично. Когда я нажимаю кнопку, чтобы начать прослушивание, она также хорошо запускается, и я вижу, что обработчик событий StateChanged срабатывает, чтобы показать, что он слушает. Однако, если я оставлю приложение бездействующим (не говоря уже) на несколько секунд (а количество секунд кажется случайным, может быть где-то между 2-5 секундами), событие StateChanged сработает и скажет, что оно снова бездействует. После этого я не могу запустить событие ResultGenerated, когда пытаюсь говорить, что еще раз показывает, что оно больше не слушает.
Я могу нажать кнопку, чтобы начать прослушивание снова, и оно будет, но с той же случайной остановкой снова.
Кроме того, если я говорю сразу, после нажатия кнопки распознавание речи работает просто отлично.
То, что я хочу, - это когда вы нажимаете кнопку, я хочу, чтобы она слушала бесконечно, пока я не вызову StopAsync и не скажу, чтобы она остановилась. Кто-нибудь знает, почему он просто останавливается сам по себе ???
ОБНОВЛЕНИЕ - я добавил обработчик событий для завершения:
speechRecognizer.ContinuousRecognitionSession.Completed += ContinuousRecognitionSession_Completed;
Потому что это даст мне статус в args.Status, и я поставлю точку останова. Самое смешное, что эта точка останова срабатывает через 2-5 секунд, когда непрерывное распознавание прекращается, и она дает статус «УСПЕХ», хотя я ничего не говорил, и событие ResultGenerated никогда не вызывало результат. Так как же добиться успеха без результата? И почему это останавливает его?
Спасибо!