如何在 Windows 10 UWP 中正确实现语音识别

Posted

技术标签:

【中文标题】如何在 Windows 10 UWP 中正确实现语音识别【英文标题】:How to correctly implement Speech Recognition in Windows 10 UWP 【发布时间】:2017-12-16 02:09:19 【问题描述】:

到目前为止,我对在 Microsoft 网站上找到的语音识别示例没有任何帮助。我还查看了这个网站 - https://mtaulty.com/2016/02/08/text-to-speech-and-more-with-windows-10-uwp-project-oxford/ 并尝试使用给出的示例,但它仍然无法正常工作。正在发生的事情是 SpeechRecognitionConfidence 被拒绝(我没有说什么)。在你问之前,是的,我有一个可以使用的麦克风,并且在“设置”中启用了所有功能。

我在这里缺少什么简单的东西吗?

如果您不太理解我的问题,请滚动到我上面链接的页面底部,并且用户 nhwilly1011 遇到了与我相同的问题。

async void Button_Click_2(object sender, RoutedEventArgs e)
    
        this.recognizer = new SpeechRecognizer();
        await this.recognizer.CompileConstraintsAsync();

        this.recognizer.Timeouts.InitialSilenceTimeout = TimeSpan.FromSeconds(5);
        this.recognizer.Timeouts.EndSilenceTimeout = TimeSpan.FromSeconds(20);

        this.recognizer.UIOptions.AudiblePrompt = "Say whatever you like, I'm listening";
        this.recognizer.UIOptions.ExampleText = "The quick brown fox jumps over the lazy dog";
        this.recognizer.UIOptions.ShowConfirmation = true;
        this.recognizer.UIOptions.IsReadBackEnabled = true;
        this.recognizer.Timeouts.BabbleTimeout = TimeSpan.FromSeconds(5);

        var result = await this.recognizer.RecognizeWithUIAsync();

        if (result != null)
        
            StringBuilder builder = new StringBuilder();

            builder.AppendLine(
              $"I have result.Confidence confidence that you said [result.Text] " +
              $"and it took result.PhraseDuration.TotalSeconds seconds to say it " +
              $"starting at result.PhraseStartTime:g");

            var alternates = result.GetAlternates(10);

            builder.AppendLine(
              $"There were alternates?.Count alternates - listed below (if any)");

            if (alternates != null)
            
                foreach (var alternate in alternates)
                
                    builder.AppendLine(
                      $"Alternate alternate.Confidence confident you said [alternate.Text]");
                
            
            this.txtResults.Text = builder.ToString();
        
    
    SpeechRecognizer recognizer;

我也试过微软的例子,它也不起作用--

    private async void Button_Click_1(object sender, RoutedEventArgs e)
    
        // Create an instance of SpeechRecognizer.
        var speechRecognizer = new Windows.Media.SpeechRecognition.SpeechRecognizer();

        //// Listen for audio input issues.
        //speechRecognizer.RecognitionQualityDegrading += speechRecognizer_RecognitionQualityDegrading;

        // Add a web search grammar to the recognizer.
        var webSearchGrammar = new Windows.Media.SpeechRecognition.SpeechRecognitionTopicConstraint(Windows.Media.SpeechRecognition.SpeechRecognitionScenario.WebSearch, "webSearch");


        speechRecognizer.UIOptions.AudiblePrompt = "Say what you want to search for...";
        speechRecognizer.UIOptions.ExampleText = @"Ex. 'weather for London'";
        speechRecognizer.Constraints.Add(webSearchGrammar);


        // Compile the constraint.
        await speechRecognizer.CompileConstraintsAsync();

        // Start recognition.
        Windows.Media.SpeechRecognition.SpeechRecognitionResult speechRecognitionResult = await speechRecognizer.RecognizeWithUIAsync();
        await speechRecognizer.RecognizeWithUIAsync();

        // Do something with the recognition result.
        var messageDialog = new Windows.UI.Popups.MessageDialog(speechRecognitionResult.Text, "Text spoken");
        await messageDialog.ShowAsync();
    

【问题讨论】:

请编辑您的问题,提供错误的详细信息。 mtaulty.com 的链接可能会在几年后断开,因此将详细信息包含在一个位置(在 *** 中)会更安全。 当 UI 提示用户说话(我说了些什么)并且它无法识别我所说的内容时。它识别出我已经说过一些话,但它默认输出对“”所说的内容。 @kennyzx 我已经添加了代码-谢谢你的推荐 【参考方案1】:

我已经找到答案了。我的电脑没有启用 Cortana,所以我最初没有收到错误消息。使用具有 Cortana 的计算机后,我发现我使用的网络存在问题。切换网络后,一切都按预期工作。我的错误是语音识别错误:“无法访问网络”,并通过切换到不安全的 WiFi 连接来解决。

【讨论】:

【参考方案2】:

如果我遗漏了什么,请纠正我,但在调用CompileConstraintsAsync 之前,建议将SpeechRecognitionTopicConstraint 添加到SpeechRecognizer 的约束集合中。 这是我发现的一个有用的演练,here。

【讨论】:

我包含的示例没有 SpeechRecognitionTopicConstraint,但是我也尝试了 Microsoft 网站上的示例,但仍然无法正常工作。 docs.microsoft.com/en-us/windows/uwp/input-and-devices/…(第三个例子) 您是否遇到了与正在识别的内容相同的问题,还是遇到了另一个错误? 两者都有同样的问题——他们都没有听到所说的话,但他们确实听到了 something 被说过。【参考方案3】:

在这里您可能会发现来自 Windows.Media.SpeechRecognition 的唤醒词语音识别

    public MAINPage()
            
     this.InitializeComponent();
    this.Loaded += OnLoaded;
    
     
Windows.Media.SpeechRecognition.SpeechRecognizer recognizer;
    public async void OnLoaded(object sender, RoutedEventArgs args)
            
                this.recognizer = new SpeechRecognizer();
    
                var commands = new Dictionary<string, int>()
                 
                    [Constants.WAKEUP_INIT_WORD] = -90, //define your start word
                    [Constants.WAKEUP_STOP_WORD] = 90 //define your stop word
                ;
    
                this.recognizer.Constraints.Add(new SpeechRecognitionListConstraint(
                  commands.Keys));
    
                await this.recognizer.CompileConstraintsAsync();
    
                this.recognizer.ContinuousRecognitionSession.ResultGenerated +=
                  async (s, e) =>
                  
                      if ((e.Result != null) && (commands.ContainsKey(e.Result.Text)))
                      
                          await this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
                    () =>
                        
                            
                            //e.Result.Confidence
                            double confidence = e.Result.RawConfidence;
                            if (e.Result.Confidence == SpeechRecognitionConfidence.Medium || e.Result.Confidence == SpeechRecognitionConfidence.High || confidence >0.85)
                            
                                if (e.Result.Text == Constants.WAKEUP_INIT_WORD)
                                
                                    recordButton_Click(sender, args);
                                    stopRecordButton.IsEnabled = true;
                                    recordButton.IsEnabled = false;
    
                                
                                if (e.Result.Text == Constants.WAKEUP_STOP_WORD)
                                
                                    stopRecordButton_Click(sender, args);
                                    recordButton.IsEnabled = true;
                                    stopRecordButton.IsEnabled = false;
                                
                            
    
                        
                  );
                          this.recognizer.ContinuousRecognitionSession.Resume();
                      
                  ;
    
                await this.recognizer.ContinuousRecognitionSession.StartAsync(
                  SpeechContinuousRecognitionMode.PauseOnRecognition);
            
enter code here

更多品种在这里https://mtaulty.com/2016/02/08/text-to-speech-and-more-with-windows-10-uwp-project-oxford/

【讨论】:

以上是关于如何在 Windows 10 UWP 中正确实现语音识别的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的 for 循环中正确实现睡眠功能? (Ubuntu)

如何在动态加载的 DLL 中正确实现(C++)线程本地存储?

如何在php中正确实现结构化菜单

如何在c#中正确实现等待异步[重复]

如何在python的类中正确实现辅助函数

在这种情况下,如何在 Flutter 中正确实现 FutureBuilder?