繁体   English   中英

C#-录制按键时的音频

[英]c# - Record audio on keydown

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

问题是当我按住Z按钮时,它将进入gkh_KeyUp事件并继续运行此代码。 我只想在保存时进行记录,而不要多次运行此记录功能。

我想将此与Microsoft的语音识别结合使用。

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.5秒后仍未发出向下播放,则停止录制。

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

如何禁用Shift / Ctrl / Alt键的WM_KEYDOWN重复事件?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM