WindowsフォームとSystem.Speechを使用してC#アプリケーションを作成して、WAVファイルをテキストに変換しようとしています。私はこれを行う方法のサンプルをオンラインでたくさん見てきましたが、どれも非常に堅牢ではありません。私は、BackgroundWorkerスレッドを使用して大きなWAVファイルの小さな部分を解析できるアプリケーションを作成したいと考えていましたが、engine.Recognize()を呼び出すときに、スレッドのDoWork関数で次の例外が発生し続けます。BackgroundWorkerのSpeechRecognitionEngine
"マイクがシステムに接続されている場合はSetInputToDefaultAudioDeviceメソッドを使用し、そうでなければSetInputToWaveFile、SetInputToWaveStreamまたはSetInputToAudioStreamを使用して事前録音されたオーディオから音声認識を実行します。 "
ここで私のDoWork関数:
SpeechRecognitionEngine engine = new SpeechRecognitionEngine(new System.Globalization.CultureInfo("en-US"));
engine.SetInputToWaveFile(fname);
engine.LoadGrammar(new DictationGrammar());
engine.BabbleTimeout = TimeSpan.FromSeconds(10.0);
engine.EndSilenceTimeout = TimeSpan.FromSeconds(10.0);
engine.EndSilenceTimeoutAmbiguous = TimeSpan.FromSeconds(10.0);
engine.InitialSilenceTimeout = TimeSpan.FromSeconds(10.0);
BackgroundWorker w = (BackgroundWorker)sender;
while (true)
{
RecognitionResult data = engine.Recognize();
if (data == null)
break;
if (w == null) //our thread died from beneath us
break;
if (!w.IsBusy) //our thread died from beneath us
break;
if (w.CancellationPending) //notice to cancel
break;
w.ReportProgress(0, data.Text);
}
私はlこのコードを実行する複数のBackgroundWorkerスレッドを起動します。私が単一のスレッドを使用する場合、私はこの問題は表示されません。
私は年間でSAPIで作業していないが、私の頭の上から、私は彼らが、プロセスのCOMサーバーの外にシングルとして実行することができます覚えているので、あなたが倍数simultanously動作するように取得しようとした場合、それはありませんデフォルトのシナリオでは、オーディオソースとプロセス認識ツールを共有する必要があります。 –
私は、BackgroundWorkerスレッドからSpeechRecognitionEngineクラスを使用しようとすると、この例外が発生することに気付きました。 – user1229658