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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 06:15:12