0

我想对音频文件进行语音识别。

我的代码非常基础,源自这里。问题在于,即使某些波形文件长达数小时,它也会在几秒钟后过早地停止每个波形文件。

如何让它扫描整个文件?

namespace Stimmenerkennung
{
    public partial class Form1 : Form
    {
        //...
        Thread erkennung;
        bool completed;

        private void Form1_Load(object sender, EventArgs e)
        {
            erkennung = new Thread(erkennen);
            erkennung.Start();
        }

        void erkennen()
        {
            using (SpeechRecognitionEngine recognizer =
               new SpeechRecognitionEngine())
            {

                // Create and load a grammar.
                Grammar dictation = new DictationGrammar();
                dictation.Name = "Dictation Grammar";

                recognizer.LoadGrammar(dictation);

                // Configure the input to the recognizer.
                recognizer.SetInputToWaveFile(@"REC01.wav");


                // Attach event handlers for the results of recognition.
                recognizer.SpeechRecognized +=
                  new EventHandler<SpeechRecognizedEventArgs>(recognizer_SpeechRecognized);
                recognizer.RecognizeCompleted +=
                  new EventHandler<RecognizeCompletedEventArgs>(recognizer_RecognizeCompleted);

                // Perform recognition on the entire file.
                db("Starting asynchronous recognition...");
                recognizer.RecognizeAsync();
                while (!completed)
                {
                    //fs((int)(100 / recognizer.AudioPosition.TotalSeconds * recognizer.AudioPosition.Seconds));
                    db(recognizer.AudioState.ToString());
                    Thread.Sleep(100);
                }
            }
        }

        // Handle the SpeechRecognized event.
        void recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
        {
            if (e.Result != null && e.Result.Text != null)
            {
                db(e.Result.Text);
            }
            else
            {
                db("  Recognized text not available.");
            }
        }

        // Handle the RecognizeCompleted event.
        void recognizer_RecognizeCompleted(object sender, RecognizeCompletedEventArgs e)
        {
            if (e.Cancelled)
            {
                db("  Operation cancelled.");
            }
            if (e.InputStreamEnded)
            {
                db("  End of stream encountered.");
            }
            completed = true;
        }

        void db(string t)
        {
            this.textBox1.Invoke((MethodInvoker)delegate
            {
                textBox1.Text = textBox1.Text + Environment.NewLine + t;
                //textBox1.Text = t;
            });
        }
    }
}
4

1 回答 1

0

您可以通过静音将文件拆分为几秒钟的块,然后将块分别提供给识别器。然后,您可以将结果组合成一个字符串。

您可以使用任何语音活动检测实现来执行拆分,一个简单的基于能量的 VAD 计算帧能量就足够了。

您可以在CMUSphinx projet中找到一些现有的 VAD 实现

于 2013-02-12T10:22:18.457 回答