こんにちは
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;
}
}
}