C# 4.0 使用SetInputToWaveFile的语音识别提前结束

C# 4.0 使用SetInputToWaveFile的语音识别提前结束,c#-4.0,speech-recognition,C# 4.0,Speech Recognition,我想对音频文件进行语音识别 我的代码是非常基本的,并且是从中派生出来的。问题是,即使某些wave文件长达数小时,它也会在几秒钟后过早地停止处理每个wave文件 如何让它扫描整个文件 namespace Stimmenerkennung { public partial class Form1 : Form { //... Thread erkennung; bool completed; private void

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

我的代码是非常基本的,并且是从中派生出来的。问题是,即使某些wave文件长达数小时,它也会在几秒钟后过早地停止处理每个wave文件

如何让它扫描整个文件

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;
            });
        }
    }
}
namespace stimmenerkenung
{
公共部分类Form1:Form
{
//...
艾尔肯农;
布尔完成;
私有void Form1\u加载(对象发送方、事件参数e)
{
erkennung=新螺纹(erkennen);
erkennung.Start();
}
void erkennen()
{
使用(语音识别引擎识别器=
新建SpeechRecognitionEngine())
{
//创建并加载语法。
语法听写=新听写语法();
听写。Name=“听写语法”;
识别器。加载语法(听写);
//配置识别器的输入。
recognizer.SetInputToWaveFile(@“REC01.wav”);
//为识别结果附加事件处理程序。
识别器+=
新的EventHandler(识别器\语音识别器);
识别器。识别器已完成+=
新的EventHandler(识别器识别完成);
//对整个文件执行识别。
db(“启动异步识别…”);
RecognizeAsync();
而(!已完成)
{
//fs((int)(100/recognizer.AudioPosition.TotalSeconds*recognizer.AudioPosition.Seconds));
db(recognizer.AudioState.ToString());
睡眠(100);
}
}
}
//处理SpeechReceigned事件。
无效识别器_SpeechRecognized(对象发送者,SpeechRecognizedEventArgs e)
{
如果(e.Result!=null&&e.Result.Text!=null)
{
db(e.Result.Text);
}
其他的
{
db(“识别文本不可用”);
}
}
//处理RecognizeCompleted事件。
无效识别器\u RecognizeCompleted(对象发送方,RecognizeCompletedEventArgs e)
{
如果(如已取消)
{
db(“操作已取消”);
}
如果(如输入流)
{
db(“遇到的流结束”);
}
完成=正确;
}
void db(字符串t)
{
此.textBox1.Invoke((MethodInvoker)委托
{
textBox1.Text=textBox1.Text+Environment.NewLine+t;
//textBox1.Text=t;
});
}
}
}

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

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


您可以在projet中找到VAD的一些现有实现这里最基本的错误是您没有使用RecognizeMode.Multiple参数调用RecognizeAsync(),这就解决了问题。做得好。看起来既不使用python也不使用c#。哪个VAD可以与c#或python一起使用?更好的是:如何将Microsoft语音识别用于VAD?目标是将wav文件作为输入,以便程序在检测到语音时输出TotalSeconds,更好的是指定语音区域,即语音块开始和结束时。