0

音声ファイルの音声認識をしたいです。

私のコードはかなり基本的で、 hereから派生しています。問題は、一部の 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;
            });
        }
    }
}
4

1 に答える 1

0

沈黙によってファイルを数秒のチャンクに分割し、チャンクをレコグナイザーに個別にフィードできます。次に、結果を1つの文字列に結合できます。

任意の音声アクティビティ検出実装を使用して分割を実行できます。フレームエネルギーを計算する単純なエネルギーベースのVADで十分です。

VADのいくつかの既存の実装はCMUSphinxプロジェクトで見つけることができます

于 2013-02-12T10:22:18.457 に答える