C# Windows Form实现按钮控制语音识别启停的解决方案
C# WinForm语音转文字:实现按钮启停识别功能
你当前的代码使用RecognizeOnceAsync()只能完成单次语音识别,且按钮点击会阻塞UI线程,无法实现“点击开始、再次点击停止”的连续识别控制。下面是具体的实现方案:
核心修改点
- 用连续识别模式替代单次识别,通过
StartContinuousRecognitionAsync和StopContinuousRecognitionAsync控制启停 - 新增类级变量保存识别器实例和当前状态,避免UI线程阻塞
- 处理跨线程UI操作(因为语音识别事件在后台线程触发)
修改后的完整代码
using Microsoft.CognitiveServices.Speech; using Microsoft.CognitiveServices.Speech.Audio; using System; using System.Windows.Forms; namespace WindowsFormsApp5 { public partial class Form1 : Form { // 类级变量:保存识别器实例和当前识别状态 private SpeechRecognizer _speechRecognizer; private bool _isRecognizing = false; public Form1() { InitializeComponent(); // 初始化按钮文本 button1.Text = "开始识别"; } // 初始化语音识别配置并绑定事件 private void InitializeSpeechRecognizer() { var config = SpeechConfig.FromSubscription("你的密钥", "你的区域"); _speechRecognizer = new SpeechRecognizer(config); // 绑定识别结果事件 _speechRecognizer.Recognized += (s, e) => { if (e.Result.Reason == ResultReason.RecognizedSpeech) { // 跨线程发送按键(因为事件在后台线程触发) this.Invoke(new Action(() => { SendKeys.SendWait(e.Result.Text); })); } else if (e.Result.Reason == ResultReason.Canceled) { var cancellation = CancellationDetails.FromResult(e.Result); MessageBox.Show($"识别取消:{cancellation.Reason}\n错误详情:{cancellation.ErrorDetails}"); } }; // 绑定识别会话停止事件 _speechRecognizer.SessionStopped += (s, e) => { this.Invoke(new Action(() => { button1.Text = "开始识别"; _isRecognizing = false; })); // 释放识别器资源 _speechRecognizer.Dispose(); _speechRecognizer = null; }; } private async void button1_Click(object sender, EventArgs e) { if (!_isRecognizing) { // 开始识别逻辑 button1.Text = "停止识别"; _isRecognizing = true; InitializeSpeechRecognizer(); await _speechRecognizer.StartContinuousRecognitionAsync(); } else { // 停止识别逻辑 _isRecognizing = false; await _speechRecognizer.StopContinuousRecognitionAsync(); } } } }
关键说明
- 状态控制:用
_isRecognizing变量标记当前是否在识别状态,按钮点击时切换逻辑 - 连续识别:通过
StartContinuousRecognitionAsync启动持续监听,StopContinuousRecognitionAsync停止监听 - 跨线程处理:识别事件在后台线程触发,使用
this.Invoke确保UI操作(如发送按键、修改按钮文本)在主线程执行 - 资源清理:会话停止时释放识别器资源,避免内存泄漏
内容的提问来源于stack exchange,提问作者Babar Ali
相关产品推荐
相关产品推荐

