共计 2234 个字符,预计需要花费 6 分钟才能阅读完成。
技术背景
语音识别技术在现代应用中越来越常见,比如语音助手、会议转录、语音控制等场景。在 C# 中,我们可以使用 System.Speech 和Windows.Media.SpeechRecognition这两个类库来实现语音识别功能。

- System.Speech:适用于传统的.NET Framework 应用,支持离线语音识别,适合需要稳定性和兼容性的场景。
- Windows.Media.SpeechRecognition:适用于 UWP 应用,依赖 Windows 10 的语音服务,支持在线识别,功能更丰富但需要联网。
本文主要介绍 System.Speech 的使用,因为它更适合入门学习,且不依赖网络。
环境准备
在开始之前,我们需要做一些准备工作:
- 安装 NuGet 包:
-
打开 Visual Studio,右键项目 -> 管理 NuGet 包 -> 搜索
System.Speech并安装。 -
麦克风权限配置:
- 确保麦克风已连接并正常工作。
- 对于 Windows 10/11,需要在系统设置中允许应用访问麦克风。
核心实现
1. 初始化 SpeechRecognitionEngine
首先,我们需要创建一个 SpeechRecognitionEngine 实例,并配置基本的识别参数:
using System.Speech.Recognition;
// 初始化语音识别引擎
SpeechRecognitionEngine recognizer = new SpeechRecognitionEngine();
// 设置识别超时(建议 300-1500ms)recognizer.InitialSilenceTimeout = TimeSpan.FromMilliseconds(1000);
recognizer.BabbleTimeout = TimeSpan.FromMilliseconds(500);
2. 构建 Grammar 对象
语音识别的核心是语法规则。我们可以通过 GrammarBuilder 定义简单的命令,或者加载预定义的语法文件:
// 创建一个简单的语法规则
GrammarBuilder builder = new GrammarBuilder();
builder.Append("你好");
builder.Append(new Choices("世界", "C#"));
Grammar grammar = new Grammar(builder);
recognizer.LoadGrammar(grammar);
3. 事件处理
语音识别是异步的,我们需要处理几个关键事件:
// 识别完成事件
recognizer.SpeechRecognized += (sender, e) =>
{
// 注意:此回调在非 UI 线程,跨线程访问控件需 Invoke
if (e.Result != null)
{Console.WriteLine($"识别结果: {e.Result.Text}");
}
};
// 识别失败事件
recognizer.SpeechRecognitionRejected += (sender, e) =>
{Console.WriteLine("识别失败,请重试");
};
// 开始识别
recognizer.SetInputToDefaultAudioDevice();
recognizer.RecognizeAsync(RecognizeMode.Multiple);
避坑指南
1. 麦克风采样率问题
- 确保麦克风的采样率与引擎兼容(通常 16kHz/16bit)。
- 可以在代码中检查麦克风支持的格式:
var audioDevices = recognizer.AudioDevices;
foreach (var device in audioDevices)
{Console.WriteLine($"设备: {device.Description}, 格式: {device.Format}");
}
2. 跨线程访问 UI 控件
在事件回调中直接更新 UI 会导致异常,需要使用Invoke:
recognizer.SpeechRecognized += (sender, e) =>
{this.Invoke((MethodInvoker)delegate
{labelResult.Text = e.Result.Text;});
};
3. 识别超时设置
- 过短的超时会导致语音被截断,建议 300-1500ms。
- 可以通过
InitialSilenceTimeout和BabbleTimeout调整。
进阶优化
1. 离线测试
使用 EmulateRecognize 方法可以模拟语音输入,方便测试:
var result = recognizer.EmulateRecognize("你好世界");
Console.WriteLine($"模拟识别结果: {result.Text}");
2. 提升自由语音识别率
对于自由语音(如听写),可以使用DictationGrammar:
recognizer.LoadGrammar(new DictationGrammar());
实践任务
尝试扩展你的 DEMO,实现以下功能:
- 关键词唤醒:当识别到特定关键词(如 ” 小助手 ”)时触发后续动作。
- 性能测试:记录识别延迟和准确率,优化超时参数。
结语
通过本文,你应该已经掌握了 C# 中语音识别的基本实现方法。虽然 System.Speech 的功能相对简单,但它足够稳定,适合快速开发和原型验证。后续可以尝试更高级的库(如 Azure Cognitive Services)来实现更复杂的场景。
如果你在实践过程中遇到问题,欢迎在评论区交流!
正文完
发表至: 编程开发
近两天内
