想要在C#中实现语音识别或控制功能,可以通过微软提供的 System.Speech来实现。
下面通过一个例子讲解如何实现语音识别并控制程序执行操作。
一、安装System.Speech包
都做到这个功能了,应该不需要讲如何下载包了吧。
为了加深回忆,这里就简单描述一下下载过程:右键项目选择*“管理NuGet程序包”*,搜索System.Speech点击安装即可。
二、自由识别
好吧,直接上代码
/// <summary>
/// 初始化语音输入
/// </summary>
private void InitializeSpeech()
{
try
{
// 指定中文识别
recognizer = new SpeechRecognitionEngine(new CultureInfo("zh-CN"));
// 自由说话(听写模式)
recognizer.LoadGrammar(new DictationGrammar());
// 设置麦克风
// 这里是默认麦克风,如果识别不上可以看看系统是否限制了桌面应用使用麦克风
recognizer.SetInputToDefaultAudioDevice();
// 注册事件
recognizer.SpeechRecognized += Recognizer_SpeechRecognized;
// 开始识别
// RecognizeMode.Multiple支持连续识别
recognizer.RecognizeAsync(RecognizeMode.Multiple);
MessageBox.Show("语音识别已启动!");
}
catch (Exception ex)
{
MessageBox.Show("初始化失败:" + ex.Message);
}
}
private void Recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
string command = e.Result.Text;
Console.WriteLine("识别到命令: " + command);
// 这里就可以对识别到的命令进行操作啦
// 需要多说的一点是如果是进行UI操作,记得上UI线程,比如这样
this.Invoke(new Action(() =>
{
textBoxVoice.Text = command; // textBoxVoice记得自己定义啊
}));
}
是不是看代码的时候觉得很简单,建议不要直接复制,自己对着敲上去印象会比较深刻。
三、指定命令
指定命令,什么是指定命令呢?就是识别指定内容咯!
二话不说上代码!
private void InitializeSpeech()
{
try
{
// 指定中文识别
recognizer = new SpeechRecognitionEngine(new CultureInfo("zh-CN"));
// 命令词
Choices commands = new Choices();
commands.Add(new string[]
{
"打开窗口",
"关闭窗口",
"显示消息",
"退出程序"
});
// 语法构建
GrammarBuilder gb = new GrammarBuilder();
gb.Append(commands);
Grammar grammar = new Grammar(gb);
recognizer.LoadGrammar(grammar);
// 设置麦克风
recognizer.SetInputToDefaultAudioDevice();
// 注册事件
recognizer.SpeechRecognized += Recognizer_SpeechRecognized;
// 开始识别
recognizer.RecognizeAsync(RecognizeMode.Multiple);
MessageBox.Show("语音识别已启动!");
}
catch (Exception ex)
{
MessageBox.Show("初始化失败:" + ex.Message);
}
}
区别在哪里呢?区别就是语法构建这里不一样,其实也没多大区别。
然后对识别到的内容进行逻辑操作。
private void Recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
string command = e.Result.Text;
Console.WriteLine("识别到命令: " + command);
switch (command)
{
case "打开窗口":
//自己写对应逻辑即可
break;
case "关闭窗口":
break;
case "显示消息":
break;
case "退出程序":
break;
default:
break;
}
}
四、释放资源
为了避免占用和各种乱七八糟的BUG,关闭窗口时要记得释放资源
protected override void OnFormClosing(FormClosingEventArgs e)
{
if (recognizer != null)
{
recognizer.RecognizeAsyncStop();
recognizer.Dispose();
recognizer = null;
}
base.OnFormClosing(e);
}
OK,感谢看完全文!比心!
1万+



被折叠的 条评论
为什么被折叠?



