C# 为什么UWP连续语音识别停止

C# 为什么UWP连续语音识别停止,c#,.net,uwp,windows-10-universal,voice-recognition,C#,.net,Uwp,Windows 10 Universal,Voice Recognition,我有一个Windows 10 UWP应用程序,我正在为文本框启用语音识别。是的,我知道我也可以利用Cortana。然而,Cortana也有一些缺点,主要是你在应用程序中对Cortana几乎没有控制权 这就是SpeechRecognitor名称空间的持续识别。我喜欢我的控制力。然而,它似乎会在几秒钟后随机停止收听 下面是我如何实现它的。注意,我还尝试将每个可能的超时设置为0,这意味着没有超时 第页上的属性: private SpeechRecognizer speechRecognizer; pr

我有一个Windows 10 UWP应用程序,我正在为文本框启用语音识别。是的,我知道我也可以利用Cortana。然而,Cortana也有一些缺点,主要是你在应用程序中对Cortana几乎没有控制权

这就是SpeechRecognitor名称空间的持续识别。我喜欢我的控制力。然而,它似乎会在几秒钟后随机停止收听

下面是我如何实现它的。注意,我还尝试将每个可能的超时设置为0,这意味着没有超时

第页上的属性:

private SpeechRecognizer speechRecognizer;
private CoreDispatcher dispatcher;
已为页面加载:

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应用程序从前台离开(如切换到另一个应用程序)时,语音识别器将停止(无任何事件)


当然,在调试时,设置断点时会发生这种情况。我认为当SpeechRecognitor再次进入前台时,重新启动SpeechRecognitor可以解决此问题。

我的水晶球显示ResultsGenerated事件处理程序抛出异常。没有合适的机制将这样的灾难转发到您的UI,请使用try/catch来确保。@HansPassant谢谢您的想法,我在ResultsGenerated事件中添加了try/catch,但也没有例外。事实上,这件事根本就没有引起注意,因为我没有发言。我确实发现了一些奇怪的东西,我在上面添加了它作为更新。我添加了已完成的事件,发现它以“成功”的形式出现,尽管我什么也没说,也没有得到结果。这是它停止监听的时候。我只是找到了更多细节。它依赖于网络,因此如果没有网络,它将无法启动。我相信,如果网络断开,它将导致它以“网络故障”的状态停止。这也许可以解释间歇性停车的原因。其次,我发现如果我在局域网上连接,它就不是那么断断续续了。它仍然会停止,但我发现它会在15秒后持续停止,因为网络不是问题。所以,我更了解情况,但如果我将所有可能的超时设置为“无限”,为什么会在15秒后停止?无法重现您的问题。识别不会在15秒后停止,甚至更久。顺便说一下,正如@HansPassant所提到的,实际上您的
ResultsGenerated
事件处理程序确实抛出了一个异常,因为
dispatcher
不是实例。或者您没有提供完整的代码片段。请为我提供一个测试工具。@Michael Bedford您好,我在这里描述了类似的问题。你是否使用了你问题答案中的建议?如果是这样的话,了解你是如何解决这项任务的将会非常有帮助,你能给我一些指南或例子来帮助你解决这个问题吗?你好,我这里和这里都有同样的问题。您能演示一下,当进入前台时,如何重新启动
ContSpeechRecognizer