我不知道我们是否可以创建一个控制台应用程序或者是否不能进行语音识别(搜索相同但未找到任何答案)并尝试了这段代码。
我有此代码在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());
}
}
}
这是错误页面的快照
我还加载了给定的选项“ Microsoft.symbol.Server”,但它仍提供相同的输出。
HERE是输出窗口
输出很大,因此无法显示所有输出,因此捕获了一些相关部分(遗憾)。
答案 0 :(得分:2)
您看到调试器正在发布RaceOnRCWCleanup。原因可能是您实例化但没有正确清理由SpeechSynthesizer
和/或SpeechRecognitionEngine
在后台创建的COM对象。
同时,控制台应用程序不会自动“保持活动”。您需要专门添加代码以防止其立即退出。
您需要做两件事:
Console.ReadLine()
方法中添加Main
语句IDisposable
,因此应在不再需要它们时将它们丢弃。要正确执行此操作,请在您的测试人员类中实现IDisposable
:示例:
public class Tester
{
SpeechSynthesizer ss = new SpeechSynthesizer();
SpeechRecognitionEngine sre = new SpeechRecognitionEngine();
public void Dispose()
{
ss.Dispose();
sre.Dispose();
}
}