【问题标题】:c# - Record audio on keydownc# - 在 keydown 上录制音频
【发布时间】:2016-01-10 17:47:00
【问题描述】:

问题很简单:我想在且仅当按住某个键时才使用麦克风录制音频。当钥匙被抬起时,我希望它停止录音。然后将此录音传递给语音识别。

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

【问题讨论】:

  • 目前有什么不工作?
  • @Alex 更新问题

标签: c# speech-recognition


【解决方案1】:

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

您需要使用超时,如果在 up 后 0.5 秒后没有发出 down,则停止录制。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-30
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 2019-03-03
    相关资源
    最近更新 更多