У меня есть приложение 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 никогда не запускалось с результатом. Итак, как добиться успеха без результата? И почему это заставляет его останавливаться?
Спасибо!
ResultsGenerated
вызвал исключение, посколькуdispatcher
не создается. Или вы не предоставили весь фрагмент кода. Предоставьте минимальный воспроизводимый пример, чтобы я мог протестировать на своей стороне. - person Sunteen Wu   schedule 11.05.2018