c# - 在keydown上录制音频

时间:2016-01-10 17:47:01

标签: c# speech-recognition

问题很简单:当和仅当按下按键时,我想使用麦克风录制音频。当钥匙抬起时我想让它停止录音。然后将此录音传递给语音识别。

问题是,当我按住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

1 个答案:

答案 0 :(得分:0)

按住按钮时,真正非常频繁的按键和模拟按键之间没有区别。

你需要使用超时,如果在上传0.5秒后没有发出声音,你就会停止录音。

如果您仍想使用挂钩,则可以访问密钥的保持状态,但您需要使用较低级别的访问权限。您可以浏览WM_KEYDOWN事件并查找关键状态的第30位:

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