Почему распознавание непрерывной речи UWP прекращается - PullRequest
0 голосов
/ 10 мая 2018

У меня есть приложение 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 никогда не вызывало результат. Так как же добиться успеха без результата? И почему это останавливает его?

Спасибо!

1 Ответ

0 голосов
/ 17 апреля 2019

Итак, у меня возникла та же проблема, и я столкнулся с этим вопросом. Я думаю, я понял это в конце концов. Проблема в том, что когда приложение UWP выходит с переднего плана (например, переключается на другое приложение), распознаватель речи останавливается (без какого-либо события).

При отладке это, конечно, происходит, когда вы устанавливаете точки останова. Я думаю, что проблема решена путем перезапуска SpeechRecognizer, когда он снова выходит на передний план.

...