在通用Windows演示应用程序(link)中的 SpeechAndTTS 示例中,即使连续听写示例也要求用户单击按钮以启动识别器。
所以我的问题是我们如何实现一直听的SpeechRecognizer?在听到类似" Hey Cortana"或者"好的Google"。
我能想到的最接近的是
SpeechRecognitionListConstraint
,它只会收听"唤醒单词" (" Hey Cortana"例如)ResultGenerated
事件处理程序中,检查" Hey Cortana"听到中/高信心。如果"嘿Cortana"没有听到,请使用speechRecognizer.CompileConstraintsAsync()
强制识别器再次收听。Completed
事件处理程序中,使用speechRecognizer.CompileConstraintsAsync()
强制识别器再次侦听。我检查的另一件事是Timeouts
上的speechRecognizer
。 https://msdn.microsoft.com/en-us/library/windows.media.speechrecognition.speechrecognizertimeouts.aspx
但似乎我们不能拥有无限InitialSilenceTimeout
。
那么,是否有一种直接的方式让一个speechRecognizer不会停止听,直到"唤醒短语"听到了吗?
答案 0 :(得分:2)
所以我的问题是我们如何实现一直听的SpeechRecognizer?在听到类似" Hey Cortana"或者"好的Google"。
众所周知,当应用已在前台运行时,我们无法将Cortana应用到我们的应用中,我们需要使用SpeechRecognition。但我们可以使用Continuous dictation完成这项工作。
即使连续听写示例也要求用户单击按钮以启动识别器。
是的,但这是因为await speechRecognizer.ContinuousRecognitionSession.StartAsync()
在按钮点击事件中,会话开始在此事件中工作。要在没有按钮点击事件的情况下启动它,您可以在页面的OnNavigateTo
方法中启动此会话,并在OnNavigateFrom
方法中停止此会话。当然,你可以在"唤醒短语"听到了。
我同意你的想法,你可以强迫它在Completed
事件中倾听,但我更喜欢在SpeechContinuousRecognitionSession.Completed | completed event中使用speechRecognizer.ContinuousRecognitionSession.StartAsync()
这样的话:
if (args.Status != SpeechRecognitionResultStatus.Success)
{
if (args.Status == SpeechRecognitionResultStatus.TimeoutExceeded)
{
await dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
// Show the state on UI
});
await speechRecognizer.ContinuousRecognitionSession.StartAsync();
}
...
}
对于时间限制,我刚刚测试过,默认情况下,Continuous dictation
将持续大约5秒而没有任何声音,然后进入状态超时。我也测试过设置这样的时间:
speechRecognizer.Timeouts.InitialSilenceTimeout = TimeSpan.FromSeconds(10.0);
它在我身边工作。
实际上,对于您的方案,您可以参考官方视频:Cortana and Speech Platform In Depth。在这个视频的样本中,它听了两个句子:"记笔记"和#34;保存旅行"。