Почему прекращается распознавание непрерывной речи UWP

У меня есть приложение Windows 10 UWP, в котором я включаю распознавание голоса для текстового поля. Да, я знаю, что могу использовать для этого и Кортану. Однако у Кортаны есть и некоторые недостатки, в основном то, что у вас практически нет контроля над Кортаной из приложения.

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

Спасибо!


person Michael Bedford    schedule 10.05.2018    source источник
comment
Мой хрустальный шар говорит, что ваш обработчик событий ResultsGenerated выдает исключение. Не существует подходящего механизма для передачи такой ошибки в ваш пользовательский интерфейс, используйте try / catch, чтобы убедиться.   -  person Hans Passant    schedule 10.05.2018
comment
@HansPassant Спасибо за мысль, я добавил попытку / уловку для события ResultsGenerated, но нет никаких исключений. Фактически, событие даже не возникает, потому что я не говорю. Я нашел что-то еще странное, я добавил это как обновление выше. Я добавил событие Completed и обнаружил, что оно возникает с УСПЕХОМ, хотя я ничего не сказал и не получил результата. Это когда он перестает слушать.   -  person Michael Bedford    schedule 10.05.2018
comment
Я только что нашел более подробную информацию. Это зависит от сети, поэтому, если сети нет, она не запустится, и я считаю, что если сеть упадет, это приведет к ее остановке со статусом NetworkFailure. Это могло бы объяснить периодическую остановку. Во-вторых, я обнаружил, что если я использую подключение к локальной сети, оно не такое прерывистое. Он все равно остановится, но я обнаружил, что он постоянно останавливается через 15 секунд, теперь это не вопрос о сети. Итак, я лучше понимаю, за исключением того, почему он останавливается через 15 секунд, если я установил все возможные тайм-ауты на бесконечность?   -  person Michael Bedford    schedule 10.05.2018
comment
Невозможно воспроизвести вашу проблему. Распознавание не остановится через 15 секунд, тем более. И, кстати, как упоминал @HansPassant, на самом деле ваш обработчик событий ResultsGenerated вызвал исключение, поскольку dispatcher не создается. Или вы не предоставили весь фрагмент кода. Предоставьте минимальный воспроизводимый пример, чтобы я мог протестировать на своей стороне.   -  person Sunteen Wu    schedule 11.05.2018
comment
@Michael Bedford Привет, у меня описанная здесь аналогичная проблема Ошибка распознавания речи UWP требует перезапуска с передним планом и тайм-аутом. Вы воспользовались предложением из ответа на ваш вопрос? Если да, было бы очень полезно узнать, как вы решили эту задачу, не могли бы вы показать какое-нибудь руководство или пример, которые помогли бы вам разобраться с этой проблемой.   -  person lf80    schedule 17.08.2019


Ответы (1)


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

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

person Homde    schedule 17.04.2019
comment
Здравствуйте, у меня такая же проблема. Для отказа распознавания речи UWP требуется перезапустите с передним планом и тайм-аутом и Отправить аргументы распознавания речи. Результат как параметр в пакете UWP desktop-bridge. Не могли бы вы показать, как перезапустить ContSpeechRecognizer, когда он выходит на передний план, пожалуйста - person lf80; 17.08.2019