基于MFC平台下的语音识别系统的设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.语音技术的概述
计算机语音技术是语音领域的一个重要部分,包括四 种技术,即语音分析技术、语音存储与再生技术、语音合成 技术和语音识别技术。从语音通信涉及的内容而言,语音技 术还应包括语音理解技术。但是,在学术上,由于历史的原 因,长期以来,语音识别和自然语言处理(包括语音理解)两 个研究领域是并行独立发展的。目前,主要的研究工作还是 语音识别。本文将重点介绍语音领域的语音识别。
应用技术与研究 学术探讨
基于 MFC 平台下的语音识别系统的设计
张艳
(南京信息职业技术学院电子信息学院,江苏 南京 210046) [ 摘 要] 对微软公司的语音软件开发包 Microsoft Speech SDK5.1 进行了研究,并且总结了利用该开发包基于 VC++ 6.0 实现语音识别系统(Speech R ecognition)的具体过程。通过对以上理论的研究和探索,设计开发了一个具有语音录入功能 的语音识别软件。 [ 关键字] 计算机语音技术;语音识别;MFC
2.语音识源自文库基本原理
图 1 语音识别原理图
3.语音识别系统的设计与实现 3.1 关于 Microsoft Speech SDK5.1 微软的 Speech SDK 5.1 是微软视窗环境的开发工具 包。这个 SDK 中含有语音应用设计接口(SAPI)、微软的连 续语音识别引擎(MCSR)以及微软的串联语音合成(又称语 音到文本(TTS))引擎等等。SAPI 中还包括对于低层控制和 高度适应性的直接语音管理、训练向导、事件、语法编译、资 源、语音识别(SR)管理,其中应用程序接口(API)和设备驱 动接口(DDI),结构如图 2 所示。
RecoCtxt); (4) 设置识别消息和感兴趣事件 调用函数 SetNotifyWindowMessage,告诉 Windows 哪个
是我们的识别消息,需要进行处理。在这里定义的消息 WM_SREVENT 用于指示语音识别时间,该消息将通知到初 始化函数指定的响应窗口。然后设置我们感兴趣的事件,其 中最重要的事件是“SPEI_RECOGNITION”。
最后,应用程序必须创建、装载并激活一个 IspRecoGrammar 接口。该接口从本质上说明了什么语音类 型,即口述或命令和控制语法。应用程序首先应调用 ISpRecoContext::CreateGrammar 方 法 创 建 一 个 IspRecoGrammar 接口;然后装载合适的语法,调用 ISpReco Grammar::LoadDictation 方法可装载口述语法;最后,为了激 活语法并启动识别,应用程序应该调用 ISpRecoGrammar:: SetDictationState 方 法 设 置 口 述 状 态 ,或 者 调 用 ISpReco Grammar::SetRuleState 方法或 ISpRecoGrammar::SetRuleIdState 方法设置命令和控制状态。
应用技术与研究 学术探讨
航空航天大学出版社,2002. [5] 杨尚国,杨金龙.语音识别技术概述[J].福建电脑,2006,8:
50-51.
图 3 系统的功能结构框图
程序的主要函数功能的实现及功能流程图如图 4 所 示。
3.4 系统测试 经过调整麦克风配置和进行语音训练后,运行并使用本 程序。经过对不同的语音输入的测试,我们发现设计的程序 对常用的孤立词汇的识别准确率可以达到百分之百,对一 些生僻的孤立词汇的识别准确率能达到百分之八十以上。 4.结论 综上所述,通过测试,我们对语音识别在孤立词汇的识 别效果满意,但在小词汇和连续词汇的识别还不能满足要 求。如果系统中能够加入语音控制程序的话,那么系统功能 将更为全面。
— ——— ———— ———— —— — —— —— —— —— —— —— 作者简介:张艳,女,湖北黄石人,博士研究生,讲师,研究方向:语言信号处理及信道编码。
— 53 —
学术探讨 应用技术与研究
应用程序共享语音识别引擎。为了创建一个可共享语音识 别引擎的 ISpRecoContext 对象,应用程序只需调用 COM 的 CoCreateInstance(CLSID_SpSharedRecoContext)函 数 即 可 。 这样的话,SAPI 将设置音频输入流为默认模式。对于一个大 型的服务程序来说,它一般要单独运行于系统上,其工作状 况成为关键,则独占式语音识别(InProc Speech Recognition) 引擎就显得更合适。为了创建一个独占式语音识别引擎的 ISpRecoContext 对 象 , 应 用 程 序 首 先 要 调 用 COM 的 CoCreateInstance(CLSID_SpInprocRecoContext)函 数 去 创 建 独占的识别引擎。然后还要调用 ISpRecognizet::SetInput 函 数 来 设 置 音 频 输 入 。 最 后 , 再 调 用 ISpRecognizet:: CreateRecoContext 函数去得到一个 ISpRecoContext 对象。
语音识别的基本过程,根据实际中的应用不同,语音识 别系统可以分为:特定人与非特定人的识别、独立词与连续 词的识别、小词汇量与大词汇量以及无限词汇量的识别。但 无论那种语音识别系统,其基本原理和处理方法都大体类 似。
如图 1 所示,识别有意义、有内容的语音信息的基本方 法是:预先分析出语音特征,按照要求送给机器储存起来, 这 个 语 音 参 数 库 中 的 语 音 参 数 称 为 “ 模 板 (Template-based Approach)”,而这一过程称为“训练(Training)”。接着,送来识 别的语音(又称待识语音)经过与训练时相同的分析,得到 语音参数,将它与库中的参考模板一一比较,并采用判决的 方法找出最接近语音特征的模板,得出识别结果,这一过程 就称为“识别(Recognition)”。当然,在进行比较时要有个标 准,这就是计量语音参数矢量之间的“失真测度(Distortion Measures)”,即 :失 真 最 小 的 那 个 模 板 所 代 表 的 内 容 就 是 识 别的结果。
hr = m_cpRecoEngine.CoCreateInstance (CLSID_Sp SharedRecognizer);
} else {
hr = m_cpRecoEngine.CoCreateInstance (CLSID_Sp InprocRecognizer);
} (3) 创建一个识别上下文(Recognition Context) // 定义全局变量 CComPtr<IspRecoContext> m_cpRecoCtxt; // 创建命令识别上下文 hr = m_cpRecoEngine->CreateRecoContext (&g_cp
下一步需要为应用程序感兴趣的事件设置通知消息。 IspRecognizer 也是一种 IspEventSource 接口。因此,应用程 序能够从其 IspRecoContext 接口中调用 IspNotifySource 的 方法来指定 IspRecoContext 所需的消息应通知到何处。调用 ISpEventSource::SetInterest 方法可以设定什么样的事件需 要被通知。最重要的事件是 SPEI_RECOGNITION,它标识了 IspRecognizer 已 从 IspRecoContext 中 识 别 了 一 些 语 音 。 Speech SDK 文档中 SPEVENTENUM 的说明提供了其它语 音识别事件的详细说明。
图 2 SAPI 结构图
应用程序通过 API 层和 SAPI(Speech API)通信,语音 引擎则通过 DDI 层和 SAP(I Speech API)进行交互。通过使 用这些 API,可以加快在语音识别或语音合成方面应用程序 的开发。我们所要重点介绍是语音识别 API。
ISpRecoContext 是语音识别的主要接口。它是语音应用 程序接受消息通知和处理语音识别事件的传输媒介。应用程 序有两种不同的语音识别引擎可供选择。一种是共享式语音 识别(Shared Recognition),它可以供其它可接受的语音识别
— 54 —
经过上面所述的各个步骤,我们已经完成了语音识别的 准备工作,接着就可以响应程序的各种事件了。
3.3 系统分析 Stenotypist 是在设计过程中基于 MFC 平台开发的一个 具有语音识别功能语音识别软件,其能够让计算机进行语 音录入,并且将识别结果显示在界面中。下面将对该系统进 行详细分析和测试。图 3 是系统的功能结构框图:
(5) 载入语法和规则 最后一步主要的初始化步骤是载入语法—语音识别引 擎所能识别的一种专门的语法。应用程序必须创建、装载并 激活一个 IspRecoGrammar 接口。语法规则是语音识别的灵 魂,必须要设置。语音识别的语法规则分为两种,一种是听 说式(dictation),一种是命令式(command and control)。本次 程序设计采用可以运用相当大的语言词汇的听说式语法规 则。IspRecoGrammar 接口从本质上说明了什么语音类型,即 口述或命令和控制语法。应用程序首先应调用 ISpRecoContext::CreateGrammar 方 法 创 建 一 个 IspRecoGrammar 接 口 。 然 后 装 载 合 适 的 语 法 , 调 用 ISpRecoGrammar:: LoadDictation 方法可装载口述语法,最后,为了激活语法并 启 动 识 别 , 应 用 程 序 应 该 调 用 ISpRecoGrammar:: SetDictationState 方法设置口述状态。 (6) 响应各种事件
if ( FAILED ( CoInitialize ( NULL ) ) ) { m_sError=_T("Error intialization COM"); return FALSE;
} (2) 创建语音识别对象(Recognizer Object) 创建 Recognizer Object,这个对象提供了访问语音识别 引擎的方法。 // 定义全局变量 CComPtr<IspRecognizer> m_cpRecoEngine; // 创建一个语音识别引擎 If(bIsShared) {
对于人类语音发生过程的研究可以追溯到很早的年 代。那时,人们研究人类发声的物理过程及其数学表达方式 和模型。另一方面,人们还研究语言语音学,了解语音的分 类、性质、表示方式等。语音技术最早和最重要的一种应用 是 Homer Dudley 在 1930 年发明的声码器。对语音识别的研 究,可以追溯到 50 年代。1952 年 Davis 等人研制成功了第一 个识别 10 个英文数字发音的实验系统。1960 年 Denes 等人 研制成功了第一个计算机语音识别系统。
当应用程序通过请求的通知机制得到通知消息时, SPEVENT 结构的 lParam 成员包含了一个 IspRecoResult 接 口 , 应 用 程 序 能 从 中 确 定 用 IspRecoContext 中 的 哪 个 IspRecoGrammar 接口已识别了什么语音。
3.2 实现 SR 的过程 语音识别编程涉及到 IspRecognizer,IspRecoContext 和 IspRecoGrammars 等多个语言识别引擎极口。我们首先构造 一个操作语音识别的类 CSpeechRecognition,然后基于该类 实现一个语音识别程序。在 CSpeechRecognition 类中封装了 语音识别操作所需要的几个接口,使用它进行语音识别更加 方便、简洁。在类 CSpeechRecognition 中定义了 3 个接口指针 m_cpRecoEngine,m_cpRecoCtxt 和 m_cpDictationGrammar,分别用 于 引 用 语 音 识 别 引 擎 的 3 个 重 要 接 口 IspRecognizer, ISpRecoContext 和 IspRecoGrammar。 (1) 初始化 COM 库 在 Dll 中调用 COM 时必须先用 CoInitialize (NULL)初 始化 COM 库。