(四)语音识别测试案例

     基于.NET的语音合成或语音识别应用相对都比较简单,基础类库已经帮我们做了大量的工作。我们只需要关注我们的需求即可。所以这里也是用一个最简单的案例来演示基于.NET的语音识别。Windows系统内置已经集成了语音识别引擎。该引擎没有独立的安装包,其包含在了系统语言包中。通常情况下简体中文的系统仅包括了中文识别,如果安装了额外的语言包,那么相对应也会有额外的语音识别引擎,所以我们在开发中尽可能指明当前使用的语音识别引擎。

首先创建一个窗体程序,添加System.Speech.Recognition引用,程序界面布局如下:

程序代码如下:

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;
using System.Globalization;

namespace Recognition
{
    public partial class FrmMain : Form
    {
       private SpeechRecognitionEngine recognizer;  //语音识别引擎
        private string engineId = "MS-2052-80-DESK"; //Win7下语音识别引擎编号
        private string currentCulture = "zh-CN"; //语言

        public FrmMain()
        {
            InitializeComponent();
        }

        private void FrmMain_Load(object sender, EventArgs e)
        {
            /*
             * 如果系统存在多个识别引擎,则初始化指定编号和语言的引擎
             * 关于其它引擎的编号可以从SpeechRecognitionEngine.InstalledRecognizers()中获取
             */
            CultureInfo cultureInfo = new CultureInfo(currentCulture); //当前地区文化
            foreach (RecognizerInfo recognizerInfo in SpeechRecognitionEngine.InstalledRecognizers())
            {
                if (recognizerInfo.Culture.Equals(cultureInfo) && recognizerInfo.Id == engineId)
                {
                    recognizer = new SpeechRecognitionEngine(recognizerInfo);
                    recognizer.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(Recognizer_SpeechRecognized);
                    break;
                }
            }

            //卸载所有语法
            recognizer.UnloadAllGrammars();

            //加载自然语法
            DictationGrammar dictationGrammar = new DictationGrammar();
            recognizer.LoadGrammar(dictationGrammar);
        }

        /// <summary>
        /// 开始聆听
        /// </summary>
        private void btnStart_Click(object sender, EventArgs e)
        {
            //设置语音输入设备(使用系统默认输入设备)
            recognizer.SetInputToDefaultAudioDevice();

            //启用连续语音识别模式
            recognizer.RecognizeAsync(RecognizeMode.Multiple);

            this.btnStart.Text = "聆听中...";
            this.btnStart.Enabled = false;
            this.btnStop.Enabled = true;
        }

        /// <summary>
        /// 停止聆听
        /// </summary>
        private void btnStop_Click(object sender, EventArgs e)
        {
            recognizer.RecognizeAsyncStop();

            this.btnStart.Text = "开始聆听";
            this.btnStart.Enabled = true;
            this.btnStop.Enabled = false;
        }

        /// <summary>
        /// 连续识别完成时引发
        /// </summary>
        private void Recognizer_SpeechRecognized(Object sender, SpeechRecognizedEventArgs e)
        {
            this.rtxtResult.Text = e.Result.Text;
        }
    }
}

在初始化引擎时,需要指明当前使用的识别引擎。如何查看系统安装的语音识别引擎的编号呢?可以使用SpeechRecognitionEngine.InstalledRecognizers()这个静态方法获取到系统安装的所有引擎。使用该方法预先了解下系统识别的引擎的的编号和语言。

根据已经了解的信息可以预先定义要使用的识别引擎如下:

private SpeechRecognitionEngine recognizer;  //语音识别引擎
private string engineId = "MS-2052-80-DESK"; //Win7下语音识别引擎编号
private string currentCulture = "zh-CN"; //语言

再根据上述信息初始化识别引擎:

CultureInfo cultureInfo = new CultureInfo(currentCulture); //当前地区文化
foreach (RecognizerInfo recognizerInfo in SpeechRecognitionEngine.InstalledRecognizers())
{
    if (recognizerInfo.Culture.Equals(cultureInfo) && recognizerInfo.Id == engineId)
    {
        recognizer = new SpeechRecognitionEngine(recognizerInfo);
        recognizer.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(Recognizer_SpeechRecognized);
        break;
    }
}

语音识别引擎比较重要的就是识别语法。一般分两种:一种是自然语法,一种是自定义语法。自然语法是语音识别引擎工作的基础语法。如果不加载自然语法识别准确度将会很低。而自定义语法,则是我们针对特定的需求或项目来编排用于提高识别精度的。上述案例仅仅使用的自然语法来进行识别。

//卸载所有语法
recognizer.UnloadAllGrammars();

//加载自然语法
DictationGrammar dictationGrammar = new DictationGrammar();
recognizer.LoadGrammar(dictationGrammar);

这里先卸载了所有语法,为了避免加载重复的语法。

打开并测试麦克风可用,运行上述代码,并尝试对着麦克风说话,结果如下:

TIPS:可以结合之前的语音合成来做一个简单的问答机器人程序。

上述案例源码:源码下载

时间: 2024-10-06 08:49:29

(四)语音识别测试案例的相关文章

(二)语音合成测试案例

上一章节大致描述了一下.NET Framework中的语音识别和语音合成的应用开发接口.接下来以一个测试案例来展示下SAPI的使用.以下案例均已VS2010 + Framework4.0为例. 用VS新建一个窗体应用程序.并添加引用. 测试程序界面布局如下: 下面是完成的代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.D

为初学者写ORM,ORM的原理及测试案例

提纲 一.什么是ORM.二.反射以及Attribute在ORM中的应用.三.创建一个数据库表和表对应的实体model.四.实体model如何映射出数据库表.五.组合ORM映射生成insert语句.六.测试ORM的插入映射.七.总结. 内容: 一 .什么是ORM? 概念: 对象关系映射(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换. 详细介绍:  让我们从O/R开始.字

nginx整合tomcat集群并做session共享----测试案例

最近出于好奇心,研究了一下tomcat集群配置,并整合nginx,实现负载均衡,session共享,写篇记录,防止遗忘.---------菜鸡的自我修炼. 说明:博主采用一个web项目同时部署到两台tomcat下,(tomcat-A,tomca-B),使用nginx做反向代理,按照设置的权值,将请求分发到后台的tomcatA/tomcat-B,并且实现session共享. 配置好本地域名指向:修改host文件:添加 127.0.0.1  www.domain.com.cn 新建项目:tiny-d

[测试案例]页面CPU使用率测试

1. 场景描述 测试网站某页面注册表单,该表单包含若干个文本输入框以及两个密码输入框:登录密码和确认密码.登录密码只能由数字或字母组成,并且长度在6-20个字符之间,确认密码必须与登录密码完全一致,当满足以上所有条件后,才能成功提交注册表单,否则提交时将在不符合要求的输入框右侧提示对应的错误信息. 2. 问题说明 在Chrome浏览器下对登录密码和确认密码输入框进行反复输入测试时,发现浏览器的CPU占有率会不断上升,导致页面出现卡顿.无响应的情况,但是在相同浏览器下测试其他文本输入框或在其他浏览

Hadoop入门进阶步步高(四)-测试Hadoop

四.测试Hadoop 一个简单的求每年温度最大值的程序. 1.准备两个文本测试数据 准备两个名为data1.txt及data2.txt的文件,用于做为计算的输入数据,将其放于/home/fenglibin/java/data目录下: data1.txt data2.txt 1999 10 1999 20 1999 25 2000 21 2000 22 2000 18 2000 40 2001 45 2001 65 2002 90 2002 89 2002 70 2003 40 2003 80 1

测试案例小问题

测试案例小问题

一个测试案例的分析

案例: 某软件公司在开发一个城镇居民保险系统时,在单元测试.集成测试阶段,为了追赶进度,开发人员与测试人员都没有介入测试工作. 系统测试阶段,测试小组借助缺陷管理工具和开发人员交互进行测试与缺陷修复工作.期间,发现"扭转文档无法归档"的严重错误,开发人员在修改时,认为难度太大,决定暂停修改,得到测试人员认可.在产品发布前,该问题在开发环境下得到解决. 回归测试结束后,开发人员把开发环境下的产品打包,发送给客户. 分析:在案例中,有几处显然不合理的地方: 1.测试介入太晚 2.回归测试做

软件工程--构建之法--功能测试 设计10个或者更多的测试案例完成对钉书钉的功能测试

设计10个或者更多的测试案例完成对钉书钉的功能测试 (1)使用不同的纸质材料厚度,使用相同规格钉书钉,查看钉书器是否正常工作 (2)使用不同规格的钉书钉,使用相同厚度的纸质材料,查看钉书器是否正常工作 (3)测试钉书器在不同的使用方式下使用,查看钉书器是否异常 (4)测试钉书器总的使用次数 (5)测试钉书器订材料后,美观次数 (6)测试钉书器钉材料后,不美观次数 (7)测试钉书器在不同温度条件下,查看钉书器是否正常工作 (8)测试钉书器在不同湿度条件下,查看钉书器是否正常工作 (9)使用不同材料

maven第四章背景案例

4.3简要设计 4.3.1接口设计 4.3.2模块结构 思想 先定义出核心接口,一个接口可以认为是一个功能,根据接口划分功能 设计模式就是一种思想,外观模式和代理模式,适配者模式三者的区别 http://blog.csdn.net/yhmhappy2006/article/details/7227017 http://blog.csdn.net/hguisu/article/details/7533759 http://www.cnblogs.com/wzh206/archive/2010/03