C# 具有言论自由的语音识别

C# 具有言论自由的语音识别,c#,grammar,speech,C#,Grammar,Speech,我需要帮助。我想做一个应用程序,它能识别我说的话,并做我说的事情。例如: 如果我说open[notepad],其中[notepad]可以是任何应用程序名称,它需要打开notepad 我想我需要同时使用语法和听写语法,但我不知道如何使用。请帮帮我。谢谢 我的代码现在如下所示: string WelcomeSentence = "Hello sir, how are you today"; SpeechSynthesizer sSynth = new SpeechSynthesize

我需要帮助。我想做一个应用程序,它能识别我说的话,并做我说的事情。例如:

如果我说
open[notepad]
,其中
[notepad]
可以是任何应用程序名称,它需要打开notepad

我想我需要同时使用语法和听写语法,但我不知道如何使用。请帮帮我。谢谢

我的代码现在如下所示:

    string WelcomeSentence = "Hello sir, how are you today";
    SpeechSynthesizer sSynth = new SpeechSynthesizer();
    PromptBuilder pBuilder = new PromptBuilder();
    SpeechRecognitionEngine sRecognize = new SpeechRecognitionEngine();

    private void frmMain_Load(object sender, EventArgs e)
    {
        sSynth.SelectVoice("IVONA Amy");
        sSynth.SetOutputToDefaultAudioDevice();
        pBuilder.ClearContent();
        pBuilder.AppendText(WelcomeSentence);
        sSynth.Speak(pBuilder);

        Choices sList = new Choices();
        sList.Add(File.ReadAllLines(@"Commands.ekd"));
        Grammar gr = new Grammar(new GrammarBuilder(sList));
        DictationGrammar dgr = new DictationGrammar();
        try
        {
            sRecognize.RequestRecognizerUpdate();
            sRecognize.LoadGrammar(gr);
            sRecognize.SpeechRecognized += sRecognize_SpeechRecognized;
            sRecognize.SetInputToDefaultAudioDevice();
            sRecognize.RecognizeAsync(RecognizeMode.Multiple);
            sRecognize.Recognize(); 
        }
        catch { return; }
    }
    private void sRecognize_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
    {
        if (e.Result.Text == "open notepad")
        {
            System.Diagnostics.Process.Start(@"C:\Windows\System32\Notepad.exe");
        }
        else
        {
            pBuilder.ClearContent();
            pBuilder.AppendText(e.Result.Text);
            sSynth.Speak(pBuilder);
        }
    }

请帮忙

在回答之后,我提出以下建议

意识到我漏掉了
SpeechFactory
类和大部分
mypeechmethods
类,请从另一个答案中复制它。另外,正如在另一个答案中所指出的,您必须进行一些错误处理。有了这个警告,您可以这样修改自己的代码

private void sRecognize_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
    var methods = new MySpeechMethods();
    MethodInfo myMethod;
    myMethod = SpeechFactory.GetSpeechMethod(e.Result.Text);

    if(myMethod != null) return;        
    pBuilder.ClearContent();
    pBuilder.AppendText(e.Result.Text);
    sSynth.Speak(pBuilder);
}
然后在
MySpeechMethods
中,您将拥有您的命令

public class MySpeechMethods
{
    [Speech("Open Notepad")]
    public void OpenNotepad()
    {
       System.Diagnostics.Process.Start(@"C:\Windows\System32\Notepad.exe");
    }
//...

在这个问题上,我为您添加代码和创建可读性问题打满分。然而,我认为它太宽泛了。你需要把你的问题缩小到更具体的语言上。。几个月前,你可能对一个项目感兴趣。我不知道我还能说些什么。我只想让应用程序将open识别为命令,将notepad识别为语法中未添加的应用程序。@paqogomez我不知道如何在代码中实现这一点。你能帮我个忙吗?我做了一个很大的假设。上面的代码可以编译并运行。您没有提到错误,只是您遇到了语法问题和听写语法问题。看起来你两个都正确加载了,但是我不知道你的语音引擎的细微差别。我一定会实现这个,这非常好。但这不是我想要的。使用您的代码,方法将刚刚打开(执行应用程序的命令)。所以,用户说打开,计算机将其识别为一个命令,然后他说是记事本,这是需要更改的应用程序的名称。因此,使用您的代码,我需要为我希望使用我的应用程序运行的每个应用程序编写一个方法。“你知道我想知道什么吗?”TheNeosrb是的,我正打算对此发表评论。它确实需要映射每个命令。我不知道如何将程序名转换为计算机上的路径。这听起来也不确定。简单易懂的
删除c:
。您应该知道您的程序正在启动哪些程序。@TheNeosrb如果这样做更简单,您可以从配置文件中读取可能的文件,并以这种方式构建MySpeechMethods类。但这可能超出了这个问题的范围。换一种方法怎么样。比如,用户说
google[query]
,然后我的应用程序打开
https://www.google.rs/search?q=[查询]
。所以计算机只会将第一个单词识别为命令,而将其他单词识别为搜索查询?@TheNeosrb在这种情况下,我认为您可以扩展
GetSpeechMethod
。捕获第一个单词,然后将剩余的作为参数传入。