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

Why does UWP continuous speech recognition stop(为什么UWP连续语音识别停止)

本文介绍了为什么UWP连续语音识别停止的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个Windows 10 UWP应用程序,我正在为文本框启用语音识别。是的,我知道我也可以利用Cortana来解决这个问题。然而,Cortana也有一些缺点,主要是你几乎无法从应用程序中控制Cortana。

这就是持续识别SpeechRecognizer名称空间的用武之地。我喜欢我所拥有的控制力。然而,它似乎会在几秒钟后随机停止侦听。

以下是我如何实现它的。请注意,我还尝试将每个可能的超时设置为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;

因为这将在arg.Status中给我一个状态,我在那里设置了一个断点。有趣的是,当连续识别停止时,这个断点将在2-5秒内命中,并且它会给出"成功"状态,即使我什么都没说,并且ResultGenerated事件从未触发过结果。那么,它是如何获得成功而没有结果的呢?为什么这会导致它停止?

谢谢!

推荐答案

我有您的问题的答案。经过近两周的挣扎,我终于找到了问题的根源。对于连续语音识别和正常语音识别,遗憾的是,它没有太多的手段来检测其运行状态。我的建议是使用条件递归进行连续语音识别。下面是一个例子:

编码:

                                speechRecognizer = new Windows.Media.SpeechRecognition.SpeechRecognizer();
                                await speechRecognizer.CompileConstraintsAsync();
                                speechRecognizer.ContinuousRecognitionSession.AutoStopSilenceTimeout = TimeSpan.FromMilliseconds(0);
                                speechRecognizer.ContinuousRecognitionSession.ResultGenerated += ContinuousRecognitionSession_ResultGenerated;
                                speechRecognizer.ContinuousRecognitionSession.Completed += ContinuousRecognitionSession_Completed;
                                speechRecognizer.StateChanged += SpeechRecognizer_StateChanged;
                                await speechRecognizer.ContinuousRecognitionSession.StartAsync();

//这在ContinuousRecognitionSession_Complete事件内。

       speechRecognizer.Dispose();


                speechRecognizer = new Windows.Media.SpeechRecognition.SpeechRecognizer();
                await speechRecognizer.CompileConstraintsAsync();
                speechRecognizer.ContinuousRecognitionSession.AutoStopSilenceTimeout = TimeSpan.FromMilliseconds(0);
                speechRecognizer.ContinuousRecognitionSession.ResultGenerated += ContinuousRecognitionSession_ResultGenerated;
                speechRecognizer.ContinuousRecognitionSession.Completed += ContinuousRecognitionSession_Completed;
                speechRecognizer.StateChanged += SpeechRecognizer_StateChanged;
                await speechRecognizer.ContinuousRecognitionSession.StartAsync();
            }
            catch { }   

这意味着您将在连续语音识别器每次完成语音识别会话时重新启动它,这在函数术语中翻译为完成。

您考虑的另一件事是,每次核心窗口失去焦点时,Windows.Media.SpeechRecognition.SpeechRecognizer都会暂停识别会话。这不能使用Activate()方法来修复。此问题只能通过IsEnably专有功能来解决。 我的建议是使用计时器,该计时器在指定的时间间隔会将IsEnabled Producty设置为True。

另一个主要建议是将Windows.Media.SpeechRecognition API迁移到WPF应用程序中,因为它使您能够更大程度地控制应用程序的功能。 API迁移通过下载名为Microsoft.Windows.SDK.Contracts的NuGet包来完成。

这篇关于为什么UWP连续语音识别停止的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本文标题为:为什么UWP连续语音识别停止