共计 2631 个字符,预计需要花费 7 分钟才能阅读完成。
技术背景
语音识别技术在现代应用中越来越普及,最常见的场景包括语音助手(如 Cortana、Siri)、会议自动转录、智能家居控制等。对于 C# 开发者来说,.NET 提供了两套主要的语音识别 API:System.Speech 和 Windows.Media.SpeechRecognition。

- System.Speech:适用于传统桌面应用,支持.NET Framework 和.NET Core,功能全面但需要本地语音引擎支持
- Windows.Media.SpeechRecognition:专为 UWP 应用设计,深度集成 Windows 10 的语音服务,但对应用平台有限制
对于大多数开发者,如果目标是构建 Windows 桌面应用,System.Speech 是更通用和灵活的选择。
环境准备
开始之前,我们需要准备好开发环境:
- 安装 Visual Studio 2019 或更高版本
- 创建新的控制台应用或 WPF 项目
- 通过 NuGet 添加 System.Speech 包
在包管理器控制台中运行:
Install-Package System.Speech
麦克风权限配置也很重要:
- 确保麦克风已正确连接并设置为默认输入设备
- 在 Windows 设置中检查麦克风隐私权限是否开启
- 对于某些企业环境,可能需要管理员权限
核心实现
初始化 SpeechRecognitionEngine
-
首先创建识别引擎实例:
using System.Speech.Recognition; var recognizer = new SpeechRecognitionEngine(); -
设置基本参数:
// 推荐识别超时设为 500-1000ms recognizer.InitialSilenceTimeout = TimeSpan.FromMilliseconds(1000); recognizer.BabbleTimeout = TimeSpan.FromMilliseconds(500); recognizer.EndSilenceTimeout = TimeSpan.FromMilliseconds(300);
构建 Grammar 对象
语音识别的准确性很大程度上取决于语法配置。我们可以创建简单的命令语法:
var commands = new Choices();
commands.Add("开始");
commands.Add("停止");
commands.Add("退出");
var grammarBuilder = new GrammarBuilder(commands);
var grammar = new Grammar(grammarBuilder);
recognizer.LoadGrammar(grammar);
对于更自由的语音输入,可以使用 DictationGrammar:
recognizer.LoadGrammar(new DictationGrammar());
事件处理
完整的识别流程需要处理几个关键事件:
// 识别结果事件
recognizer.SpeechRecognized += (sender, e) =>
{Console.WriteLine($"识别结果: {e.Result.Text}");
// 注意:如果要更新 UI,需要 Invoke 回 UI 线程
};
// 识别完成事件
recognizer.RecognizeCompleted += (sender, e) =>
{if(e.Error != null)
Console.WriteLine($"识别错误: {e.Error.Message}");
// 可以在这里重新开始识别
recognizer.RecognizeAsync(RecognizeMode.Multiple);
};
开始识别
最后启动识别过程:
// 设置音频输入源(默认麦克风)recognizer.SetInputToDefaultAudioDevice();
// 开始异步识别(Multiple 模式会持续监听)recognizer.RecognizeAsync(RecognizeMode.Multiple);
避坑指南
在实际开发中,会遇到一些常见问题:
- 麦克风采样率问题 :
- 确保麦克风支持 16kHz、16 位、单声道格式
-
可以在控制面板的音频设置中检查
-
跨线程 UI 更新 :
-
在 WPF 中需要使用 Dispatcher.Invoke
Application.Current.Dispatcher.Invoke(() => {textBlock.Text = e.Result.Text;}); -
短语音识别失败 :
- 适当减少 EndSilenceTimeout 值(但不要小于 100ms)
- 对于非常短的命令,考虑使用 EmulateRecognize 进行测试
进阶优化
离线测试
使用 EmulateRecognize 可以在没有麦克风的情况下测试:
var result = recognizer.EmulateRecognize("测试命令");
Console.WriteLine(result.Text);
提高自由语音识别率
-
加载 DictationGrammar:
recognizer.LoadGrammar(new DictationGrammar()); -
添加自适应词汇:
recognizer.UpdateRecognizerSetting("AdaptationOn", 1); -
训练语音配置文件(需要用户配合):
recognizer.RequestRecognizerUpdate();
实践任务
建议尝试扩展基础 Demo,实现以下功能:
- 关键词唤醒功能 :
- 创建特定词汇的 Grammar
-
在 SpeechRecognized 事件中检查是否为唤醒词
-
性能指标采集 :
var stopwatch = new Stopwatch(); stopwatch.Start(); // ... 识别过程... stopwatch.Stop(); Console.WriteLine($"识别耗时: {stopwatch.ElapsedMilliseconds}ms"); -
识别结果记录 :
- 将结果保存到文件或数据库
- 添加时间戳和置信度信息
总结
通过本文,我们从头构建了一个基本的 C# 语音识别应用。虽然 System.Speech API 已经有些年头,但它仍然是 Windows 桌面应用实现语音功能的最简单方案。在实际项目中,你可能还需要考虑:
- 多语言支持(需要安装对应的语音包)
- 网络语音识别服务的集成(如 Azure Speech Services)
- 更复杂的自然语言处理
希望这篇指南能帮助你快速上手语音识别开发,避开初学者的常见陷阱。
