C#开发语音程序入门之语音识别

来源:互联网 发布:剑灵韩国捏脸数据库 编辑:程序博客网 时间:2024/04/30 05:43
用语音识别最麻烦的就是训练计算机适应你的口音。但是,如果用模板匹配的方式基本上普通话基本标准就可以正常识别。模板匹配的另一个好处就是精心设计的语法文件使得程序不会识别出无效的命令。例如你希望用嘴巴控制四轴上升下降那么程序就应该对你说的“左转”没有反应。

1.
首先添加语音识别库的引用:

在代码里添加命名空间:
using System.Speech.Recognition;

2.
无论操作系统是否系统启动语音识别程序,你都希望你的命令被你希望的程序而不是其他程序响应,例如你有一个命令叫“开始”,那么希望的结果是你的程序执行一个叫“开始”的过程而不是操作系统自动打开“开始菜单”。因此需要创建一个识别引擎的新实例而不是和系统共用一个。
创建一个System.Speech.Recognition.SpeechRecognitionEngine对象吧。

3.
来畅想下我们这个语音识别程序能做什么,简单点,我说“选择红色”那么窗体的背景就应该变红,“选择绿色”那么窗体的背景就应该变绿。恩,就这样,其他颜色视为无效命令程序无响应。
那么命令就是“选择(红色/绿色)”这样的结构,在这个句子中,“选择”是固定的,“红色”和“绿色”是可选择的,这几个词汇的组合就被称为语法,用System.Speech.Recognition.Grammar来表示。词汇的选择用System.Speech.Recognition.Choices来表示。
创建语法推荐用:System.Speech.Recognition.GrammarBuilder
=========================================================
GB.Append("选择");
GB.Append(new Choices(new string[] { "红色", "绿色" }));
Grammar G = new Grammar(GB);
=========================================================
OK,上面的代码就创建了“选择(红色/绿色)”的语法。
在这条命令被识别后会触发System.Speech.Recognition.Grammar的SpeechRecognized事件。添加一个事件处理程序,在程序中处理这条命令吧(执行命令)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Speech.Recognition;

namespace 语音识别测试 {
        public partial class Form1 : Form {
                private SpeechRecognitionEngine SRE = new SpeechRecognitionEngine();

                public Form1() {
                        InitializeComponent();
                }

                private void Form1_Load(object sender, EventArgs e) {
                        SRE.SetInputToDefaultAudioDevice();         <=======默认的语音输入设备,你可以设定为去识别一个WAV文件。
                        GrammarBuilder GB = new GrammarBuilder();
                        GB.Append("选择");
                        GB.Append(new Choices(new string[] { "红色", "绿色" }));
                        Grammar G = new Grammar(GB);
                        G.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(G_SpeechRecognized);
                        SRE.LoadGrammar(G);
                        SRE.RecognizeAsync(RecognizeMode.Multiple); <=======异步调用识别引擎,允许多次识别(否则程序只响应你的一句话)
                }

                void G_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) {
                        Text = e.Result.Text;
                        switch (e.Result.Text) {
                                case "选择红色":
                                        BackColor = Color.Red;
                                        break;
                                case "选择绿色":
                                        BackColor = Color.Green;
                                        break;
                        }
                }
        }
}
原创粉丝点击