2013-02-12 2 views
0

Я хочу сделать распознавание речи аудиофайла.Распознавание речи с использованием SetInputToWaveFile заканчивается преждевременно

Мой код довольно простой и получен из here. Проблема в том, что он останавливается с каждым волновым файлом преждевременно через несколько секунд, хотя некоторые волновые файлы имеют часы.

Как заставить сканировать весь файл?

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; 
      }); 
     } 
    } 
} 
+1

Самое основное здесь не так, что вы не вызываете RecognizeAsync() с аргументом RecognizeMode.Multiple. –

+0

Это решило. Хорошая работа. –

ответ

0

Вы можете разбить файл на несколько секунд куски по молчанию и кормить кусок в распознаватель отдельно. Затем вы можете комбинировать результаты в одну строку.

Вы можете использовать любую реализацию обнаружения голосовой активности для выполнения разделения, достаточно простого VAD, основанного на энергии, для вычисления энергии кадра.

Вы можете найти некоторые из существующих реализаций VAD в CMUSphinx Projet

+0

Работает ни с python, ни с C#, как кажется. Какой VAD работает с C# или python? –

+0

Еще лучше: как использовать распознавание речи Microsoft для VAD? Цель состоит в том, чтобы иметь wav-файл в качестве входного сигнала для программы для вывода TotalSeconds, когда он обнаруживает голос, еще лучше определяет области голоса, т. Е. Когда начинается голосовой блок и когда он заканчивается. –

Смежные вопросы