2017-05-28 56 views
0

我正在编写一个语音识别应用程序,并且我找到了一个示例here。我尽可能接近代码,只是变化很小,但是当我启动应用程序时,我在第24行中发现了InnerException,特别是在C语言中识别语音的问题

在进行识别之前至少必须加载一个语法

问题。我已将代码行复制到行(以教育为目的),所以我非常肯定它必须起作用,但由于某种原因它没有。我的代码是:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.Speech.Recognition; 

namespace Voice_Recognition 
{ 
    public partial class Form1 : Form 
    { 
     SpeechRecognitionEngine recEngine = new SpeechRecognitionEngine(); 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void btnEnable_Click(object sender, EventArgs e) 
     { 
      recEngine.RecognizeAsync(RecognizeMode.Multiple); 
      btnDisable.Enabled = true; 
     } 

     private void btnDisable_Click(object sender, EventArgs e) 
     { 
      recEngine.RecognizeAsyncStop(); 
      btnDisable.Enabled = false; 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      Choices commands = new Choices(); 
      commands.Add(new string[] { "say hello", "say goodbye", "say my name" }); 
      GrammarBuilder gBuilder = new GrammarBuilder(); 
      gBuilder.Append(commands); 
      Grammar grammar = new Grammar(gBuilder); 

      recEngine.LoadGrammarAsync(grammar); 
      recEngine.SetInputToDefaultAudioDevice(); 
      recEngine.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(RecEngine_SpeechRecognized); 
     } 

     private void RecEngine_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) 
     { 
      switch (e.Result.Text) 
      { 
       case "say hello": 
        MessageBox.Show("Hello to you!"); 
        break; 
       case "say goodbye": 
        MessageBox.Show("Bye, bye!"); 
        break; 
       case "say my name": 
        InputBox.Text += "\nYourName"; 
        break; 
      } 
     } 
    } 
} 

我使用的是Visual Studio 2015社区版。但我不认为,这是问题。

P.S.我知道,类似的问题已经被问到here on stack overflow;不过,我的问题有点不同,因为上面的所有代码看起来都是正确的。

+0

24行在哪里?请在代码中添加注释出现异常 –

+0

recEngine.RecognizeAsync(RecognizeMode.Multiple); –

回答

2

如果您不注册Load事件,方法Form1_Load将永远不会执行。你可以在你的构造函数中做到这一点。

public Form1() 
{ 
    InitializeComponent(); 
    Load += Form1_Load; 
} 

我想在这个例子中这行是在设计器文件中。

+0

谢谢!我会检查这个解决方案。 –

+0

看来,你是对的。非常感谢你! –

+0

@L_Pav总是一种乐趣 – NtFreX