我有一个Windows 10 UWP应用程序,正在为文本框启用语音识别。是的,我知道我也可以利用Cortana来做到这一点。但是,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事件从未触发结果,它的状态仍为“成功”。那么,如何成功却没有结果呢?为什么这导致它停止?

谢谢!

最佳答案

所以我遇到了同样的问题,并且遇到了这个问题。我想我终于明白了。问题在于,当UWP应用从前台运行(例如切换到另一个应用)时,语音识别器将停止(不发生任何事件)。

当然,在调试时,这将在设置断点时发生。我认为问题可以通过重新启动SpeechRecognizer使其再次进入前台来解决。

关于c# - 为什么UWP连续语音识别停止,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50277331/

10-16 19:37