当前位置: 首页 > news >正文

C#实现连续语音转文字

一、基础实现方案(System.Speech)

1. 环境配置

// 安装NuGet包
Install-Package System.Speech// 添加语言包(控制面板)
控制面板 -> 语言 -> 添加中文语音包

2. 核心代码实现

using System.Speech.Recognition;
using System.Windows.Forms;public class ContinuousRecognizer : IDisposable
{private SpeechRecognitionEngine _engine;private bool _isRunning;public ContinuousRecognizer(){InitializeEngine();}private void InitializeEngine(){_engine = new SpeechRecognitionEngine(new System.Globalization.CultureInfo("zh-CN"));// 加载默认语法(连续识别模式)var grammar = new DictationGrammar();_engine.LoadGrammar(grammar);// 配置音频输入_engine.SetInputToDefaultAudioDevice();// 注册事件处理器_engine.SpeechRecognized += OnRecognized;_engine.SpeechRecognitionRejected += OnRejected;_engine.RecognizeAsyncStop();}public void StartRecognition(){if (!_isRunning){_engine.RecognizeAsync(RecognizeMode.Multiple);_isRunning = true;}}public void StopRecognition(){if (_isRunning){_engine.RecognizeAsyncStop();_isRunning = false;}}private void OnRecognized(object sender, SpeechRecognizedEventArgs e){if (e.Result.Confidence > 0.7){string text = e.Result.Text;// 更新UI(需跨线程)Application.Current.Dispatcher.Invoke(() => txtResult.AppendText(text + Environment.NewLine));}}private void OnRejected(object sender, SpeechRecognitionRejectedEventArgs e){txtResult.AppendText("[识别失败]" + Environment.NewLine);}public void Dispose(){_engine?.Dispose();}
}

二、性能优化

1. 音频预处理

// 添加降噪模块(使用NAudio)
public class AudioPreprocessor
{private readonly WaveInEvent _waveIn;private readonly SpeechRecognitionEngine _engine;public AudioPreprocessor(SpeechRecognitionEngine engine){_engine = engine;_waveIn = new WaveInEvent();_waveIn.DataAvailable += OnDataAvailable;}private void OnDataAvailable(object sender, WaveInEventArgs e){// 应用WebRTC降噪算法byte[] denoisedData = WebRTCNative.NoiseSuppress(e.Buffer, e.BytesRecorded);// 转换为流格式using (var ms = new MemoryStream(denoisedData)){_engine.SetInputToWaveStream(ms);_engine.Recognize();}}
}

2. 多线程处理

// 使用生产者-消费者模型
public class RecognitionProcessor
{private BlockingCollection<byte[]> _audioQueue = new BlockingCollection<byte[]>();private Thread _processingThread;public RecognitionProcessor(){_processingThread = new Thread(ProcessAudio);_processingThread.Start();}public void Enqueue(byte[] audioData){_audioQueue.Add(audioData);}private void ProcessAudio(){foreach (var chunk in _audioQueue.GetConsumingEnumerable()){using (var stream = new MemoryStream(chunk)){var recognizer = new SpeechRecognitionEngine();recognizer.LoadGrammar(new DictationGrammar());recognizer.Recognize(stream);}}}
}

三、高级功能实现

1. 自定义语法识别

// 创建SRGS语法文件
var grammarBuilder = new GrammarBuilder();
grammarBuilder.Append(new Choices("打开", "关闭", "保存"));
grammarBuilder.Append(new SemanticResultKey("action", "操作类型"));var grammar = new Grammar(grammarBuilder);
_recognizer.LoadGrammar(grammar);// 事件处理
_recognizer.SpeechRecognized += (s, e) => 
{if (e.Result.Semantics["action"].Value.ToString() == "打开"){OpenApplication();}
};

2. 实时转写服务

// 结合WebSocket实现流式传输
public class StreamingTranscriber
{private readonly SpeechRecognizer _recognizer;private readonly ClientWebSocket _webSocket;public StreamingTranscriber(ClientWebSocket webSocket){_webSocket = webSocket;_recognizer = new SpeechRecognizer();_recognizer.SpeechRecognized += OnRecognized;}private async void OnRecognized(object sender, SpeechRecognizedEventArgs e){var json = JsonSerializer.Serialize(new {Text = e.Result.Text,Timestamp = DateTime.Now});await _webSocket.SendAsync(new ArraySegment<byte>(Encoding.UTF8.GetBytes(json)),WebSocketMessageType.Text,true,CancellationToken.None);}
}

四、部署与调试

1. 硬件要求

组件 最低配置 推荐配置
CPU i5-4代(4核) i7-10代(8核)
内存 8GB 16GB+
声卡 普通USB声卡 支持ASIO的专业声卡
麦克风 16kHz采样率 高信噪比指向性麦克风

2. 调试技巧

// 启用详细日志
public static void EnableDebugLogging()
{var config = SpeechConfig.FromSubscription("YourKey", "YourRegion");config.SetProperty("SpeechServiceResponse_DebugLog", "true");config.SetProperty("SpeechServiceResponse_ProfanityOption", "Raw");
}// 性能监控
public void LogPerformance(TimeSpan duration, int wordCount)
{Debug.WriteLine($"识别速度: {wordCount/duration.TotalSeconds}字/秒");
}

五、扩展应用场景

1. 会议记录系统

// 结合语音识别与PPT同步
public class MeetingRecorder
{private ContinuousRecognizer _recognizer;private PptxBuilder _pptBuilder;public MeetingRecorder(){_recognizer = new ContinuousRecognizer();_pptBuilder = new PptxBuilder();_recognizer.SpeechRecognized += (s, e) => {_pptBuilder.AddSlide(e.Result.Text);};}
}

2. 工业设备控制

// 关键指令处理
public class VoiceController
{private ContinuousRecognizer _recognizer;public VoiceController(){_recognizer = new ContinuousRecognizer();_recognizer.SpeechRecognized += (s, e) => {if (e.Result.Text.Contains("紧急停止")){Machine.Stop();}};}
}

参考代码 语音转文字连续识别的C#小程序 www.youwenfan.com/contentcnj/70643.html

六、常见问题解决

  1. 识别率低 添加领域特定词汇表 调整InitialSilenceTimeoutEndSilenceTimeout参数 使用SetProperty("Adaptation", "True")启用自适应训练

  2. 内存泄漏 实现对象池模式管理识别引擎 限制同时处理的音频流数量 定期调用GC.Collect()

  3. 多设备冲突

    // 显式指定音频设备
    var deviceEnumerator = new MMDeviceEnumerator();
    var inputDevice = deviceEnumerator.GetDefaultAudioEndpoint(DataFlow.Capture, Role.Communications);
    _engine.SetInputToDefaultAudioDevice(inputDevice);
    
http://www.gsyq.cn/news/24902.html

相关文章:

  • 如何把研究性学习糊弄过去
  • Collections集合工具类和可变参数
  • 一文读懂零知识证明Plonk 协议
  • 2025 年国内连接器厂家经销商最新推荐榜:聚焦优质品牌,助力企业精准采购,实力企业深度解析住友/日端/HRS连接器经销商推荐
  • 2025.10.19 零试
  • CF2154 Codeforces Round 1060 (Div. 2) 游记
  • C#转java的最好利器easy-query就是efcore4j sqlsugar4j freesql4j
  • CF2128D Sum of LDS
  • 物联网设备漏洞及其对国家安全的影响分析
  • 完整教程:华硕NUC 15Pro 系列 舒适办公新体验的理想之选
  • CSP-S模拟35
  • 解密prompt系列62. Agent Memory一览 - MATTS CFGM MIRIX
  • k8s api server
  • PRISMS Senior Varsity Training 20250922
  • 232
  • 231
  • ww
  • 高级语言:面向过程和面向对象
  • Codeforces Round 1060 (Div. 2)
  • Luogu P14260 期待(counting) 题解 [ 蓝 ] [ 前缀和 ] [ 组合计数 ]
  • mochi-mqtt/server golang mqtt 包
  • 有了异步i/o的话,还需要协程么
  • 完全免费的 claude 工具,真香!
  • shell编程学习笔记005之until循环
  • 2026 NOI 做题记录(七)
  • GPT/Claude中转API部署实战指南_一文读懂AI聚合架构
  • C#中Yolo开发环境
  • Diccionario del estudiante
  • 洛谷比赛做题记录
  • 蒙特卡洛保形预测技术解析