none
Speech.Recognitionを使ってWavを認識したいが途中で終わる RRS feed

  • 質問

  • こんにちは

    WavファイルからLipSyncデータを作る作業をしています。

    そのためにまずSpeechを使って、wavからstringと各音のwav上の時間を取得しようとしました。

    そして上記コードを書きました。

    デバッグしたところCompletedと出て正しく認識してくれた ように見えましたが途中までしか認識してくれませんでした。

    「おはようございます。今日もいい天気ですね」とあったら「おはようございます」までしかRecognitionResultに入ってません。

    どうすれば全体をちゃんと認識してくれるでしょうか?

    またLipSyncなので時間が大事です。startとdurationはとれました。

    しかし欲しいのは「お」の時間、「は」の時間、「よ」の時間… なのです。

    これらを取得する方法はありますか?

     

    WindowsVista 32bit home basic

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    using System.Speech.AudioFormat;
    using System.Speech.Recognition;
    
    namespace Wav2LipSyncDat
    {
      class CWav2LipSyncData
      {
        private SpeechRecognitionEngine m_SpRecoEngine = new SpeechRecognitionEngine();
        private bool m_bRecognizing = true;
        private bool m_bStreamEnd = false;
        private bool m_bInitialSilenceTimeout = false;
        private bool m_bBabbleTimeout = false;
    
        public CWav2LipSyncData()
        {
          m_SpRecoEngine.BabbleTimeout = new TimeSpan(0, 0, 1);
          m_SpRecoEngine.EndSilenceTimeout = new TimeSpan(0, 0, 1);
          m_SpRecoEngine.EndSilenceTimeoutAmbiguous = new TimeSpan(0, 0, 1);
          Console.WriteLine("BableTimeout" + m_SpRecoEngine.BabbleTimeout.ToString());
          Console.WriteLine("EndSilence" + m_SpRecoEngine.EndSilenceTimeout.ToString());
          Console.WriteLine("EndSilenceAmbiguous" + m_SpRecoEngine.EndSilenceTimeoutAmbiguous.ToString());
    
        }
        public void Recognized(object sender, RecognitionEventArgs e)
        {
          Console.WriteLine("Recognized");
          Console.WriteLine(e.Result.Text);
    
          if (e.Result.Text == "終了。" || e.Result.Text == "終了")
          {
          }
          //m_bRecognizing = false;
        }
        public void Hypothesized(object sender, SpeechHypothesizedEventArgs e)
        {
    
          Console.WriteLine("Hypothesized" + " " + m_SpRecoEngine.AudioPosition.ToString());
          if (e.Result.Audio != null)
          {
            RecognizedAudio audio = e.Result.Audio;
            Console.WriteLine(audio.AudioPosition.ToString());
          }
          Console.WriteLine(e.Result.Text);
        }
        public void RecogRejected(object sender, SpeechRecognitionRejectedEventArgs e)
        {
          Console.WriteLine("Rejecter");
          foreach (RecognizedWordUnit wu in e.Result.Words)
          {
            Console.WriteLine(wu.Text);
          }
        }
        public void Detected(object sender, SpeechDetectedEventArgs e)
        {
          Console.WriteLine("Detected");
          Console.WriteLine(e.AudioPosition.ToString());
    
        }
        public void Completed(object sender, RecognizeCompletedEventArgs e)
        {
          Console.WriteLine("Conpleted");
          //Console.WriteLine(e.Result.Text);
          m_bStreamEnd = e.InputStreamEnded;
          m_bInitialSilenceTimeout = e.InitialSilenceTimeout;
          m_bBabbleTimeout = e.BabbleTimeout;
          {
            RecognitionResult result = e.Result;
            string text = "";
            for (int i = 0; i < result.Words.Count; ++i)
            {
              text = result.Words[i].LexicalForm;
              Console.WriteLine(text);
            }
            
          }
          //m_bRecognizing = false;
        }
        public bool Invoke(string szInputPath, string szOutputPath)
        {
          Console.WriteLine("認識エンジン初期化開始");
    
          FileStream sr = new FileStream(szInputPath, FileMode.Open);
    
          
          m_SpRecoEngine.SetInputToWaveStream(sr);
          //m_SpRecoEngine.SetInputToWaveFile(szInputPath);
          m_SpRecoEngine.SpeechHypothesized += Hypothesized;
          m_SpRecoEngine.SpeechRecognized += Recognized;
          m_SpRecoEngine.SpeechDetected += Detected;
          m_SpRecoEngine.SpeechRecognitionRejected += RecogRejected;
          m_SpRecoEngine.RecognizeCompleted += Completed;
          m_SpRecoEngine.LoadGrammar(new DictationGrammar());
          //m_SpRecoEngine.SetInputToDefaultAudioDevice();
    
          //m_SpRecoEngine.SetInputToAudioStream(sr, safi);
          
          Console.WriteLine("認識エンジン初期化完了!");
          Console.WriteLine("マイクに向かって話してください");
          int iCount = 0;
    
    
          m_SpRecoEngine.RecognizeAsync(RecognizeMode.Multiple);
    
    
          while (iCount < 1000)
          {
            if (m_bStreamEnd) break;
            if (m_bInitialSilenceTimeout) break;
            if (m_bBabbleTimeout) break;
            System.Threading.Thread.Sleep(5);
            iCount++;
          }
          Console.WriteLine(m_bStreamEnd.ToString() + m_bInitialSilenceTimeout.ToString() + m_bBabbleTimeout.ToString());
          m_SpRecoEngine.RecognizeAsyncCancel();
    
          Console.WriteLine("Ok");
          Console.ReadLine();
    
          return true;
        }
      }
    }
    

    2011年1月5日 14:11