首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SetInputToWaveFile的语音识别过早结束

使用SetInputToWaveFile的语音识别过早结束
EN

Stack Overflow用户
提问于 2013-02-12 08:03:08
回答 1查看 1.2K关注 0票数 0

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

我的代码非常简单,是从here派生而来的。问题是,即使一些wave文件长达数小时,它也会在几秒钟后过早地停止每个wave文件。

如何让它扫描整个文件?

代码语言:javascript
复制
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;
            });
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2013-02-12 18:22:18

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14823261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档