2016-01-10 32 views
0

问题很简单:只有在按住某个键时,才需要使用麦克风录制音频。当钥匙被解除时,我想让它停止录音。然后将此记录传递给语音识别。c# - 在keydown上录制音频

问题是当我按住Z按钮时,它将进入gkh_KeyUp事件并继续运行此代码。我想简单地记录下它,而不是多次运行这个记录函数。

我想将此与微软语音识别结合使用。

using System.Speech.Recognition; 
public partial class Form1 : Form 
    { 
     SpeechRecognitionEngine recognizer = new SpeechRecognitionEngine(); 
     Grammar dictationGrammar = new DictationGrammar(); 
     public Form1() 
     { 
      InitializeComponent(); 
      globalKeyboardHook gkh = new globalKeyboardHook(); 
      gkh.HookedKeys.Add(Keys.Z); 
      //gkh.HookedKeys.Add(Keys.B); 
      gkh.KeyDown += new KeyEventHandler(gkh_KeyDown); 
      gkh.KeyUp += new KeyEventHandler(gkh_KeyUp); 

      recognizer = new SpeechRecognitionEngine(); 
      dictationGrammar = new DictationGrammar(); 
      recognizer.LoadGrammar(dictationGrammar); 

     } 

     void gkh_KeyUp(object sender, KeyEventArgs e) 
     { 
      textBox1.Text = "Up" + e.KeyCode.ToString(); 
      try 
      { 
       RecognitionResult result = recognizer.Recognize(); 
       textBox1.Text = result.Text; 
      } 
      catch (InvalidOperationException exception) 
      { 
       textBox1.Text = String.Format("Could not recognize input from default aduio device. Is a microphone or sound card available?\r\n{0} - {1}.", exception.Source, exception.Message); 
      } 
      e.Handled = true; 
     } 

     void gkh_KeyDown(object sender, KeyEventArgs e) 
     { 
      textBox1.Text += "Down" + e.KeyCode.ToString(); 


      try 
      { 
       //recognizer.SetInputToDefaultAudioDevice(); 
       recognizer.SetInputToAudioStream() 

      } 
      catch (InvalidOperationException exception) 
      { 
       button1.Text = String.Format("Could not recognize input from default aduio device. Is a microphone or sound card available?\r\n{0} - {1}.", exception.Source, exception.Message); 
      } 
      e.Handled = true; 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      SpeechRecognitionEngine recognizer = new SpeechRecognitionEngine(); 
      Grammar dictationGrammar = new DictationGrammar(); 
      recognizer.LoadGrammar(dictationGrammar); 
      try 
      { 
       button1.Text = "Speak Now"; 
       recognizer.SetInputToDefaultAudioDevice(); 
       //recognizer.SetInputToAudioStream; 
       RecognitionResult result = recognizer.Recognize(); 
       textBox1.Text = result.Text; 
      } 
      catch (InvalidOperationException exception) 
      { 
       button1.Text = String.Format("Could not recognize input from default aduio device. Is a microphone or sound card available?\r\n{0} - {1}.", exception.Source, exception.Message); 
      } 
      finally 
      { 
       recognizer.UnloadAllGrammars(); 
      } 
     } 

     private void textBox1_TextChanged(object sender, EventArgs e) 
     { 

     } 

键盘钩子:http://www.codeproject.com/Articles/19004/A-Simple-C-Global-Low-Level-Keyboard-Hook

+0

什么不是目前的工作? – Alex

+0

@Alex更新的问题 – Kevin

回答

0

有真正的很频繁的按键,当你按住按钮模拟按键之间没有什么区别。

您需要使用超时,如果在0.5秒之后没有发出向下的动作,则停止录制。

如果您仍想使用挂接,您可以访问该键的保持状态,但您需要使用较低级别的访问权限。您可以探索WM_KEYDOWN事件和查找键状态的位30:

How to disable WM_KEYDOWN repeat event for Shift/Ctrl/Alt key?