如何实现激活短语,如" Hey Cortana"在SpeechRecognizer?

时间:2016-07-06 20:39:08

标签: win-universal-app speech-recognition

在通用Windows演示应用程序(link)中的 SpeechAndTTS 示例中,即使连续听写示例也要求用户单击按钮以启动识别器。 enter image description here

所以我的问题是我们如何实现一直听的SpeechRecognizer?在听到类似" Hey Cortana"或者"好的Google"。

enter image description here

我能想到的最接近的是

  1. speechRecoginzer 上放置一个SpeechRecognitionListConstraint,它只会收听"唤醒单词" (" Hey Cortana"例如)
  2. ResultGenerated事件处理程序中,检查" Hey Cortana"听到中/高信心。如果"嘿Cortana"没有听到,请使用speechRecognizer.CompileConstraintsAsync()强制识别器再次收听。
  3. Completed事件处理程序中,使用speechRecognizer.CompileConstraintsAsync()强制识别器再次侦听。
  4. 我检查的另一件事是Timeouts上的speechRecognizerhttps://msdn.microsoft.com/en-us/library/windows.media.speechrecognition.speechrecognizertimeouts.aspx

    但似乎我们不能拥有无限InitialSilenceTimeout

    那么,是否有一种直接的方式让一个speechRecognizer不会停止听,直到"唤醒短语"听到了吗?

1 个答案:

答案 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;保存旅行"。