【问题标题】:Enable and Disable Speech Recognition using speech Commands使用语音命令启用和禁用语音识别
【发布时间】:2024-01-03 02:21:02
【问题描述】:

我的问题分为两部分。

  1. 有没有办法使用语音命令启用语音识别。

  2. 有没有一种方法可以禁用语音识别,但同时保持监听或启用命令以告知它何时再次启用语音识别。

这就是我的想法:

case "Stop Listening":
    synthesizer.speakasync("Ok");
    recEngine.RecognizeAsyncStop();
    //Command or code here that wait's for the command "Start Listening"
    recEngine.RecognizeAsyncStop "until" case "Start Listening"
    break;

我知道这行不通,因为没有“直到”命令,所以我该怎么做呢?

【问题讨论】:

  • 如果没有办法按照我上面建议的方式进行,请给我其他想法。谢谢。

标签: c# windows winforms speech-recognition


【解决方案1】:

我处理这个问题的方式是让它一直在听;我认为这可能也是“大人物”的做法,因为根据定义,如果您想使用语音命令开始收听,那么它已经必须在收听。

就我而言,我希望程序始终运行,因此我在构造函数中对其进行了设置。听起来这与您正在做的事情相似:在这里有一个明确的名称来添加到短语中会有所帮助(想想说“Hey Cortana”或“OK Google”,它有助于它知道您正在尝试用它)。假设您希望您的起始短语是“嘿拉里,开始听我说”。您将拥有第二个SpeechRecognitionEngine,它始终存在,但如果您正在使用主引擎,则关闭它,并在您希望主引擎停止时重新打开。

public partial class Form1 : Form
    {
        private Choices onOff = new Choices();
        private Choices recChoices = new Choices();
        private SpeechRecognitionEngine alwaysOnListener = new SpeechRecognitionEngine(new System.Globalization.CultureInfo("en-US"));
        private SpeechRecognitionEngine recEngine = new SpeechRecognitionEngine(new System.Globalization.CultureInfo("en-US"));

        public Form1()
        {
            InitializeComponent();
            onOff.Add(new string[] {"Hey Larry start listening to me"});
            GrammarBuilder gb = new GrammarBuilder();
            gb.Append(onOff);
            Grammar g = new Grammar(gb);
            alwaysOnListener.LoadGrammar(g);
            alwaysOnListener.SpeechRecognized += alwaysOnListener_SpeechRecognized;


            recChoices.Add(new string[] {"Stop Listening"});
            GrammarBuilder gb2 = new GrammarBuilder();
            gb2.Append(recChoices);
            Grammar recGrammar = new Grammar(gb2);
            recEngine.LoadGrammar(recGrammar);
            recEngine.SpeechRecognized += recEngine_SpeechRecognized;
        }

        void recEngine_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
        {
            if (e.Result.Text.Equals("Stop Listening"))
            {
                recEngine.RecognizeAsyncStop();
                alwaysOnListener.RecognizeAsync(RecognizeMode.Multiple);
            }

        }

        void alwaysOnListener_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
        {
            if (e.Result.Text.Equals("Hey Larry start listening to me"))
            {
                recEngine.RecognizeAsync(RecognizeMode.Multiple);
                alwaysOnListener.RecognizeAsyncStop();
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            alwaysOnListener.EmulateRecognize("Hey Larry start listening to me");
        }

        private void btnStop_Click(object sender, EventArgs e)
        {
            recEngine.EmulateRecognize("Stop Listening");
        }
    }

【讨论】:

  • 嘿。谢谢,我有点明白你的意思,但请你举个简单的例子。不过我明白你的意思。
  • np,添加了一些示例代码并稍微更改了答案,以便更容易理解。
  • 当我尝试运行我的程序时,它会出现一个显示中断的窗口。
  • 我不知道你的意思是什么...你有错误吗?
  • 是的。我的程序在运行时冻结,然后由于某种原因崩溃。