如何用C#的System.Speech实现PC音频实时转文本?
嘿,我来帮你搞定实时语音转文本的需求!你之前的代码能处理静态WAV文件,要实现实时识别(包括播放WAV时自动识别),咱们分情况来调整:
实时语音转文本实现方案
1. 核心思路转换
你之前用的SetInputToWaveFile是针对静态音频文件的一次性识别,要实现实时监听,得把输入源换成系统音频设备,并使用异步连续识别模式——因为同步的Recognize()只会阻塞等待一次识别结果,没法持续监听。
2. 实时麦克风语音识别(基础版)
这是最常见的实时场景:监听麦克风输入,说话时自动转文本。代码需要调整成事件驱动的异步模式,具体如下:
首先在窗体类里声明全局的识别引擎实例(不能是局部变量,否则会被GC回收,中断监听):
using System.Speech.Recognition; using System.Speech.AudioFormat; // 窗体类成员变量 private SpeechRecognitionEngine _realTimeRecognizer;
然后在启动逻辑(比如窗体加载、按钮点击)里初始化识别引擎:
private void StartRealTimeRecognition() { // 初始化引擎,指定识别语言(中文用zh-CN,英文用en-US) _realTimeRecognizer = new SpeechRecognitionEngine(new System.Globalization.CultureInfo("zh-CN")); // 加载听写语法,支持自由语音识别(不需要预设关键词) _realTimeRecognizer.LoadGrammar(new DictationGrammar()); // 设置输入为系统默认音频设备(麦克风) _realTimeRecognizer.SetInputToDefaultAudioDevice(); // 绑定识别成功的事件:每次识别到语音就触发 _realTimeRecognizer.SpeechRecognized += OnSpeechRecognized; // 可选:绑定识别失败的事件,用于调试 _realTimeRecognizer.SpeechRecognitionRejected += OnSpeechRecognitionRejected; // 启动异步连续识别模式——持续监听输入,直到手动停止 _realTimeRecognizer.RecognizeAsync(RecognizeMode.Multiple); } // 识别成功的处理逻辑(注意跨线程更新UI) private void OnSpeechRecognized(object sender, SpeechRecognizedEventArgs e) { // WinForms里跨线程更新控件需要用Invoke if (label1.InvokeRequired) { label1.Invoke(new Action(() => label1.Text += $"识别结果:{e.Result.Text}\n")); } else { label1.Text += $"识别结果:{e.Result.Text}\n"; } } // 识别失败的处理逻辑(可选) private void OnSpeechRecognitionRejected(object sender, SpeechRecognitionRejectedEventArgs e) { if (label1.InvokeRequired) { label1.Invoke(new Action(() => label1.Text += "无法识别当前语音\n")); } else { label1.Text += "无法识别当前语音\n"; } }
最后在窗体关闭时记得停止识别、释放资源,避免内存泄漏:
private void Form1_FormClosing(object sender, FormClosingEventArgs e) { if (_realTimeRecognizer != null) { _realTimeRecognizer.RecognizeAsyncStop(); _realTimeRecognizer.Dispose(); } }
3. 捕获系统播放的WAV音频并识别(进阶需求)
如果你的目标是当PC上播放某个WAV文件时,自动捕获播放的音频并转文本,上面的麦克风方案就不适用了——因为麦克风只能捕获外部声音,没法直接获取系统内部的播放音频。这时候需要借助虚拟音频设备来实现:
- 先安装一款免费的虚拟音频设备(比如VB-Cable)
- 在Windows声音设置里,把默认播放设备改成
CABLE Output,默认录音设备改成CABLE Input——这样系统播放的音频会被路由到虚拟输入设备 - 然后复用上面的代码,识别引擎会自动监听这个虚拟输入设备,实现播放WAV时的实时转文本
如果还想实现“启动WAV文件时自动触发识别”,可以配合FileSystemWatcher监控目标文件夹,当检测到WAV文件被打开/修改时,自动启动识别引擎:
private FileSystemWatcher _wavFileWatcher; private void SetupWavMonitoring(string targetFolder) { _wavFileWatcher = new FileSystemWatcher(targetFolder); _wavFileWatcher.Filter = "*.wav"; // 监听文件打开/修改事件 _wavFileWatcher.Changed += (s, e) => { // 这里可以加逻辑判断文件是否被播放(比如检查关联进程),然后启动识别 StartRealTimeRecognition(); }; _wavFileWatcher.EnableRaisingEvents = true; }
4. 关键注意事项
- 确保系统安装了对应语言的语音识别包(Windows 10/11可以在「设置-时间和语言-语音」里安装)
- 异步识别时,UI更新必须处理跨线程问题(上面的代码已经覆盖WinForms场景)
- 如果需要更高的识别精度,可以训练自定义语法规则,替换
DictationGrammar
内容的提问来源于stack exchange,提问作者user12041324
相关产品推荐
相关产品推荐

