我正在尝试使用 Windows 窗体和 System.Speech 编写 C# 应用程序,将 WAV 文件转换为文本。我在网上看到了大量关于如何执行此操作的示例,但没有一个非常可靠。我希望编写一个应用程序,可以使用BackgroundWorker线程解析大型WAV文件的较小部分,但当它调用engine.Recognize()时,我在线程的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 线程。如果我使用单线程,我不会看到这个问题。
最佳答案
你可以尝试这个方法。我针对控制台和 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);
}
}
关于c# - BackgroundWorker 中的语音识别引擎,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9423682/