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

时间:2018-08-13 14:18:25

标签: c# .net speech-recognition text-to-speech speech-synthesis

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

我有此代码在winforms应用程序中工作

但是当尝试在控制台Visual Studio中创建此应用程序时,出现了一个非常奇怪的错误,找不到mscorelib.pdb。然后转移到页面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());
        }
    }
}

这是错误页面的快照

enter image description here

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

编辑

HERE是输出窗口

enter image description here

输出很大,因此无法显示所有输出,因此捕获了一些相关部分(遗憾)。

1 个答案:

答案 0 :(得分:2)

您看到调试器正在发布RaceOnRCWCleanup。原因可能是您实例化但没有正确清理由SpeechSynthesizer和/或SpeechRecognitionEngine在后​​台创建的COM对象。

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

您需要做两件事:

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

示例:

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