You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:39:19