SpeechRecognitionEngine in BackgroundWorker

本文关键字:BackgroundWorker in SpeechRecognitionEngine | 更新日期: 2023-09-27 18:25:42

我正在尝试使用Windows Forms和System.Speech编写一个C#应用程序,以将WAV文件转换为文本。我在网上看到了很多关于如何做到这一点的样本,但没有一个是非常稳健的。我希望编写一个应用程序,可以使用BackgroundWorker线程解析大型WAV文件的较小部分,但当我的线程的DoWork函数调用引擎时,我一直会遇到以下异常。识别():

"没有向该识别器提供音频输入。如果麦克风连接到系统,请使用方法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);
}

我正在启动多个运行此代码的BackgroundWorker线程。如果我使用一个线程,我看不出这个问题。

SpeechRecognitionEngine in BackgroundWorker

您可以尝试这种方法。我为控制台和Windows窗体应用程序类型测试了它。

class Program {
    public static void Main() {
        var r1 = new Recognizer(@"c:'proj'test.wav");
        r1.Completed += (sender, e) => Console.WriteLine(r1.Result.Text);
        var r2 = new Recognizer(@"c:'proj'test.wav");
        r2.Completed += (sender, e) => Console.WriteLine(r2.Result.Text);
        Console.ReadLine();
    }
}
class Recognizer {
    private readonly string _fileName;
    private readonly AsyncOperation _operation;
    private volatile RecognitionResult _result;
    public Recognizer(string fileName) {
        _fileName = fileName;
        _operation = AsyncOperationManager.CreateOperation(null);            
        _result = null;
        var worker = new Action(Run);
        worker.BeginInvoke(delegate(IAsyncResult result) {
            worker.EndInvoke(result);
        }, null);            
    }
    private void Run() {
        try {
            SpeechRecognitionEngine engine = new SpeechRecognitionEngine(new System.Globalization.CultureInfo("en-US"));
            engine.SetInputToWaveFile(_fileName);
            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);
            _result = engine.Recognize();
        }
        finally {
            _operation.PostOperationCompleted(delegate {
                RaiseCompleted();
            }, null);
        }
    }
    public RecognitionResult Result {
        get { return _result; }
    }
    public event EventHandler Completed;
    protected virtual void OnCompleted(EventArgs e) {
        if (Completed != null)
            Completed(this, e);
    }
    private void RaiseCompleted() {
        OnCompleted(EventArgs.Empty);
    }
}