C#使用语音识别时不必要的输入 类程序 { 静态void Main(字符串[]参数) { Brain b=新大脑(); b、 start(); } } 公共类地图 { 公共字符串密钥; 公共字符串值; 公共映射(字符串键、字符串值) { this.key=key; 这个值=值; } } 公众阶级的耳朵 { 私人演讲识别引擎耳; 公共耳朵(列出知识、EventHandler OnRecognite、EventHandler onReject) { this.ears=新的SpeechRecognitionEngine(); 选项命令=新选项(); foreach(知识中的var项目) { commands.Add(item.key); } GrammarBuilder gBuilder=新的GrammarBuilder(); gBuilder.Append(命令); 语法=新语法(gBuilder); 听力语法(语法); setInputOdeFaultAudioDevice(); ears.RecognizeAsync(RecognizeMode.Multiple); ears.SpeechRecognized+=onrecognized; ears.SpeechRecognitionRejected+=onReject; } 公共停车场() { ears.RecognizeAsyncCancel(); } 公开作废开始() { ears.RecognizeAsync(RecognizeMode.Multiple); } } 公共阶层的头脑 { 保护列表命令; 受保护名单答案; 私人只读耳朵; 公共大脑() { commands=newlist(); 添加(新映射(“列表”,“列表”)); 添加(新映射(“somethingElse”、“sometvalue”); ears=新的EAR(命令、OnReceigned、onRejected); } private void OnRecognited(对象发送方,SpeechRecognitizedEventArgs e) { Console.WriteLine(e.Result.Text); TerminateCommand(新映射(例如,Result.Text.Trim().ToLower(),null)); } 公开作废开始(){ while(true){ 字符串answer=Console.ReadLine(); 如果(回答!=“”) { TerminateCommand(新映射(应答,null)); } } } private void onRejected(对象发送方,SpeechRecognitionRejectedEventArgs e) { } 专用void terminateCommand(映射命令){ Console.WriteLine(“需要用户输入”); var answer=Console.ReadLine(); Console.WriteLine(“再次需要用户输入”); var answer2=Console.ReadLine(); } }
如果我使用键盘,“list”方法工作得很好(由TerminateCommand调用)。因此,TerminateCommand是从“start”方法调用的。但是,如果我使用VoiceRecognition(基本的Mycrosoft.Speech),并且从eventHandler调用TerminateCommand,每当list方法需要用户输入时,我都必须按Enter键,写入sg,然后再次按Enter键。“list”方法中的每个Console.ReadLine()前面似乎都有另一个Console.ReadLine()。 ears.stop()仅停止语音识别。 Map是一个类,包含2个字符串(值、键)。C#使用语音识别时不必要的输入 类程序 { 静态void Main(字符串[]参数) { Brain b=新大脑(); b、 start(); } } 公共类地图 { 公共字符串密钥; 公共字符串值; 公共映射(字符串键、字符串值) { this.key=key; 这个值=值; } } 公众阶级的耳朵 { 私人演讲识别引擎耳; 公共耳朵(列出知识、EventHandler OnRecognite、EventHandler onReject) { this.ears=新的SpeechRecognitionEngine(); 选项命令=新选项(); foreach(知识中的var项目) { commands.Add(item.key); } GrammarBuilder gBuilder=新的GrammarBuilder(); gBuilder.Append(命令); 语法=新语法(gBuilder); 听力语法(语法); setInputOdeFaultAudioDevice(); ears.RecognizeAsync(RecognizeMode.Multiple); ears.SpeechRecognized+=onrecognized; ears.SpeechRecognitionRejected+=onReject; } 公共停车场() { ears.RecognizeAsyncCancel(); } 公开作废开始() { ears.RecognizeAsync(RecognizeMode.Multiple); } } 公共阶层的头脑 { 保护列表命令; 受保护名单答案; 私人只读耳朵; 公共大脑() { commands=newlist(); 添加(新映射(“列表”,“列表”)); 添加(新映射(“somethingElse”、“sometvalue”); ears=新的EAR(命令、OnReceigned、onRejected); } private void OnRecognited(对象发送方,SpeechRecognitizedEventArgs e) { Console.WriteLine(e.Result.Text); TerminateCommand(新映射(例如,Result.Text.Trim().ToLower(),null)); } 公开作废开始(){ while(true){ 字符串answer=Console.ReadLine(); 如果(回答!=“”) { TerminateCommand(新映射(应答,null)); } } } private void onRejected(对象发送方,SpeechRecognitionRejectedEventArgs e) { } 专用void terminateCommand(映射命令){ Console.WriteLine(“需要用户输入”); var answer=Console.ReadLine(); Console.WriteLine(“再次需要用户输入”); var answer2=Console.ReadLine(); } },c#,readline,speech,C#,Readline,Speech,如果我使用键盘,“list”方法工作得很好(由TerminateCommand调用)。因此,TerminateCommand是从“start”方法调用的。但是,如果我使用VoiceRecognition(基本的Mycrosoft.Speech),并且从eventHandler调用TerminateCommand,每当list方法需要用户输入时,我都必须按Enter键,写入sg,然后再次按Enter键。“list”方法中的每个Console.ReadLine()前面似乎都有另一个Console.R
我有点困惑。有什么想法吗?你能把问题缩小一点吗?这是很多代码,其中大部分不会导致问题。这节省了我们为您做这件事的时间。:)我把范围缩小了一点。从VoiceRecognite事件处理程序调用函数中的每个Console.ReadLine()时,都会出现此问题。如果从任何其他不涉及语音识别的功能调用它,它可以正常工作。我想我想要的是一个,这样我就可以将它复制/粘贴到IDE中,直接开始帮助您工作,而无需额外准备。请记住,我们每天都会收到数千个问题,因此您正在争夺我们的时间。:)祝你好运,抱歉误会了。这是我所能做到的最低限度。可复制的。需要语音参考。因此,如果OnRecognited调用TerminateCommand,则每个Console.ReadLine()都会被调用2x,如果它是从“开始”调用的,它的工作方式就像charm一样。-@如果你不使用语音模块,那么问题就消失了?很奇怪!不知道我能不能解释。
class Program
{
static void Main(string[] args)
{
Brain b = new Brain();
b.start();
}
}
public class Map
{
public string key;
public string value;
public Map(string key, string value)
{
this.key = key;
this.value = value;
}
}
public class Ears
{
private SpeechRecognitionEngine ears;
public Ears(List<Map> knowledge, EventHandler<SpeechRecognizedEventArgs> onRecognise, EventHandler<SpeechRecognitionRejectedEventArgs> onReject)
{
this.ears = new SpeechRecognitionEngine();
Choices commands = new Choices();
foreach (var item in knowledge)
{
commands.Add(item.key);
}
GrammarBuilder gBuilder = new GrammarBuilder();
gBuilder.Append(commands);
Grammar grammar = new Grammar(gBuilder);
ears.LoadGrammar(grammar);
ears.SetInputToDefaultAudioDevice();
ears.RecognizeAsync(RecognizeMode.Multiple);
ears.SpeechRecognized += onRecognise;
ears.SpeechRecognitionRejected += onReject;
}
public void stop()
{
ears.RecognizeAsyncCancel();
}
public void start()
{
ears.RecognizeAsync(RecognizeMode.Multiple);
}
}
public class Brain
{
protected List<Map> commands;
protected List<Map> answers;
private readonly Ears ears;
public Brain()
{
commands = new List<Map>();
commands.Add(new Map("list",""));
commands.Add(new Map("somethingElse","someValue"));
ears = new Ears(commands, onRecognized, onRejected);
}
private void onRecognized(object sender, SpeechRecognizedEventArgs e)
{
Console.WriteLine(e.Result.Text);
terminateCommands(new Map(e.Result.Text.Trim().ToLower(), null));
}
public void start() {
while (true) {
string answer = Console.ReadLine();
if (answer!="")
{
terminateCommands(new Map(answer, null));
}
}
}
private void onRejected(object sender, SpeechRecognitionRejectedEventArgs e)
{
}
private void terminateCommands(Map cmd) {
Console.WriteLine("need user input");
var answer = Console.ReadLine();
Console.WriteLine("need user input again");
var answer2 = Console.ReadLine();
}
}