RaceOnRCWCleanup when 运行 用于语音识别的控制台应用程序

RaceOnRCWCleanup when running console app for speech recognition

我不知道我们是否可以为语音识别创建一个控制台应用程序(搜索相同但没有找到任何答案)并尝试了这个代码。

我在 winforms 应用程序中使用此代码

但是当尝试在控制台中创建此应用程序时 visual studio 给出了一个非常奇怪的错误 mscorelib.pdb 而不是 found.And 转移到页面 mscorelib.pdb

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Speech;
using System.Speech.Recognition;
using System.Speech.Synthesis;
using System.Threading;

namespace ConsoleApplication2
{
    public  class Program
    {
        
        public static void Main(string[] args)
        {
            tester tst = new tester();
            tst.DoWorks();
           
        }

    }
    public class tester
    {
        SpeechSynthesizer ss = new SpeechSynthesizer();
        SpeechRecognitionEngine sre = new SpeechRecognitionEngine();
        PromptBuilder pb = new PromptBuilder();
        Choices clist = new Choices();

        public void DoWorks()
        {
            clist.Add(new string[] { "how are you", "what is the current time", "open chrome", "hello" });

            Grammar gr = new Grammar(new GrammarBuilder(clist));

            sre.RequestRecognizerUpdate();
            sre.LoadGrammar(gr);
            sre.SetInputToDefaultAudioDevice();
            sre.SpeechRecognized += sre_recognised;
            sre.RecognizeAsync(RecognizeMode.Multiple);
        }

        public void sre_recognised(object sender, SpeechRecognizedEventArgs e)
        {
            switch (e.Result.Text.ToString())
            {
                case "hello":ss.SpeakAsync("Hello shekar");
                    break;
                case "how are you": ss.SpeakAsync("I am fine and what about you");
                    break;
                case "what is the time":ss.SpeakAsync("current time is: " + DateTime.Now.ToString());
                    break;
                case "open chrome":System.Diagnostics.Process.Start("chrome", "wwe.google.com");
                    break;
                default:  ss.SpeakAsync("thank you");
                    break;
            }
            Console.WriteLine(e.Result.Text.ToString());
        }
    }
}

这里是错误页面的截图

我也加载了给定的选项“Microsoft.symbol.Server”,但它仍然给出相同的输出。

编辑

这是输出 window

输出的篇幅比较大,无法展示所有的输出,截取了一些相关的部分(遗憾)。

您看到调试器发出 RaceOnRCWCleanup。原因可能是您正在实例化但没有正确清理由 SpeechSynthesizer and/or SpeechRecognitionEngine.

在幕后创建的 COM 对象

同时,控制台应用程序不会自动 'kept alive'。您需要专门添加代码以防止其立即退出。

你需要做两件事:

  • 确保您的应用程序保持足够长的生命周期(例如,通过在 Main 方法中添加 Console.ReadLine() 语句
  • 确保正确清理资源。 SpeechRecognitionEngine 和 SpeechSynthesizer 都实现了 IDisposable,因此在不再需要时应将其丢弃。要正确执行此操作,请在您的测试器 class:
  • 中实施 IDisposable

示例:

 public class Tester 
 {
    SpeechSynthesizer ss = new SpeechSynthesizer();
    SpeechRecognitionEngine sre = new SpeechRecognitionEngine();
    public void Dispose() 
    {
         ss.Dispose();
         sre.Dispose();
    }
 }