【vc++精品源码栏目提醒】:文章导读:在新的一年中,各位网友都进入紧张的学习或是工作阶段。
网学会员整理了vc++精品源码-VC++基于微软语音引擎开发语音识别总结 - 其它资料的相关内容供大家参考,祝大家在新的一年里工作和学习顺利!
关于 SAPI 的简介API 概述 SAPI API 在一个应用程序和语音引擎之间提供一个高级别的接口。
SAPI 实现了所有必需的对各种语音引擎的实时的控制和管理等低级别的细节。
SAPI 引擎的两个基本类型是文本语音转换系统TTS和语音识别系统。
TTS 系统使用合成语音合成文本字符串和文件到声音音频流。
语音识别技术转换人类的声音语音流到可读的文本字符串或者文件。
文本语音转换 API 应用程序能通过 IspVoice 的对象组建模型COM接口控制文本语音转换。
一旦一个应用程序有一个已建立的 IspVoice 对象见Text-to-Speech 指南,这个应用程序就只需要调用 ISpVoice::Speak 就可以从文本数据得到发音。
另外,ISpVoice 接口也提供一些方法来改变声音和合成属性,如语速 ISpVoice::SetRate,输出音量 ISpVoice::SetVolume,改变当前讲话的声音 ISpVoice::SetVoice等。
特定的 SAPI 控制器也可以嵌入输入文本使用来实时的改变语音合成器的属性,如声音,音调,强调字,语速和音量。
这些合成标记在 sapi.xsd 中,使用标准的 XML 格式,这是一个简单但很强大定制 TTS 语音的方法,不依赖于特定的引擎和当前使用的声音。
ISpVoice::Speak 方法能够用于同步的(当完全的完成朗读后才返回)或异步的(立即返回,朗读在后台处理)操作。
当同步朗读(SPF_ASYNC)时,实时的状态信息如朗读状态和当前文本位置可以通过 ISpVoice::GetStatus 得到。
当异步朗读时,可以打断当前的朗读输出以朗读一个新文本或者把新文本自动附加在当前朗读输出的文本的末尾。
除了 ISpVoice 接口之外 SAPI 也为高级 TTS 应用程序提供许多有用的 COM 接口。
事件 SAPI 用标准的回调机制(Window 消息 回调函数 or Win32 事件)来发送事件来和应用程序通信。
对于 TTS,事件大多用于同步地输出语音。
应用程序能够与它们发生的实时行为例如单词边界,音素,口型或者应用程序定制的书签等同步。
应用程序能够用ISpNotifySource ISpNotifySink ISpNotifyTranslator ISpEventSink ISpEventSource 和 ISpNotifyCallback 初始化和处理这些实时事件。
字典 应用程序通过使用 ISpContainerLexicon ISpLexicon 和 IspPhoneConverter 提供的方法能为语音合成引擎提供定制的单词发音。
资源 查找和选择 SAPI 语音数据如声音文件及发音字典可以被下列 COM 接口控制: ISpDataKey ISpRegDataKey ISpObjectTokenInitISpObjectTokenCategory ISpObjectToken IEnumSpObjectTokens ISpObjectWithToken ISpResourceManager 和 IspTask。
音频 最后,有一个接口能把声音输出到一些指定目标如电话和自定硬件 ISpAudio ISpMMSysAudio ISpStream ISpStreamFormatISpStreamFormatConverter。
语音识别 API 就像 ISpVoice 是语音合成的主接口, 像 IspRecoContext 是语音识别的主接口。
ISpVoice 一样,它是一个 IspEventSource 接口,这意味着它是语音程序接收被请求的语音识别事件通知的媒介。
一个应用程序必须从两个不同类型的语音识别引擎ISpRecognizer中选择一种。
一种是可以与其它语音识别程序共享识别器的语音识别引擎,这在大多数识别程序中被推荐使用。
为了为 IspRecognizer 建立一个共享的 ISpRecoContext 接口,一个应用程序只需要用 CLSID_SpSharedRecoContext 调用 COM 的 CoCreateInstance 方法。
这种方案中,SAPI 将建立一个音频输入流,把它设置为SAPI 默认的音频输入流。
对于大型服务器程序,它可能在单独在一个系统上运行,性能是关键,一个 InProc 语音识别引擎更适合。
程序必须首先用 CLSID_SpInprocRecoInstance 调用 CoCreateInstance 为了为 InProc ISpRecognizer 建立一个 IspRecoContext,来建立属于它自己的 InProc IspRecognizer。
然后程序必须调用 ISpRecognizer::SetInput见 also ISpObjectToken来建立一个音频输入流。
最后程序可以调用 ISpRecognizer::CreateRecoContext 来得到一个 IspRecoContext。
因为 IspRecognizer 也是一个 IspEventSource, 下一步是建立程序感兴趣的事件通知, IspEventSource 实际上是 IspNotifySource,程序从它的 ISpRecoContext 可以调用 IspNotifySource 的一个方法来指出 IspRecoContext 的哪里的事件应该被报告。
然后它应该调用 ISpEventSource::SetInterest 来指出哪些事件应该通报。
最重要的事件是 SPEI_RECOGNITION,指出和 IspRecoContext 相关的IspRecognizer 已经识别了一些语音。
其他可用到的语音识别事件的详细资料参见 SPEVENTENUM。
最后,一个语音程序必须建立,加载,并且激活一个 IspRecoGrammar,本质上就是指出哪些类型的发言被识别,例如口述或一个命令和控制文法。
首先,程序用 ISpRecoContext::CreateGrammar 建立一个 IspRecoGrammar,然后程序加载适合的文法,下面两个方法中调用其中一个:口述模式的调用方法 ISpRecoGrammar::LoadDictation,命令和控制模式的则调用方法ISpRecoGrammar::LoadCmdxxx。
最后为了激活这些文法以开始进行识别,程序为口述模式调用 ISpRecoGrammar::SetDictationState或者为命令和控制模式调用调用 ISpRecoGrammar::SetRuleState 或者 ISpRecoGrammar::SetRuleIdState。
当识别依靠通知机制返回到程序,SPEVENT 结构的成员 lParam 将是一个 IspRecoResult,程序可以确定什么被识别和使用了IspRecoContext 的哪个 IspRecoGrammar。
一个 IspRecognizer,无论是否是共享的还是 InProc 的,都可以有多个 IspRecoContexts 和它关联,并且每个都可以通过它自己的事件通知方法通知 IspRecognizer。
从一个 IspRecoContext 可以建立多个 IspRecoGrammars,以便于识别不同类型的发言。
利用微软 Speech SDK 5.1 在 MFC 中进行语音识别开发时的主要步骤,以 Speech API 5.1VC6 为例: 1、初始化 COM 端口一般在 CWinApp 的子类中,调用 CoInitializeEx 函数进行 COM 初始化,代码如下:::CoInitializeExNULLCOINIT_APARTMENTTHREADED // 初始化 COM注意:调用这个函数时,要在工程设置(project settings)-C/C标签Category 中选 Preprocessor,在 Preprocessor definitions:下的文本框中加上“_WIN32_DCOM”。
否则编译不能通过。
2、创建识别引擎微软 Speech SDK 5.1 支持两种模式的:共享 和 (Share) 独 享 。
(InProc) 一般情况下可以使用共享型,大的服务型程序使用 InProc。
如下:hr m_cpRecognizer.CoCreateInstanceCLSID_SpSharedRecognizer//Sharehr m_cpRecognizer.CoCreateInstanceCLSID_SpInprocRecognizer//InProc如果是 Share 型,可直接进到步骤 3;如果是 InProc 型,必须使用 ISpRecognizer::SetInput 设置语音输入。
如下:CComPtr cpAudioToken //定义一个 tokenhr SpGetDefaultTokenFromCategoryIdSPCAT_AUDIOIN cpAudioToken //建立默认的音频输入对象if SUCCEEDEDhr hr m_cpRecognizer-SetInputcpAudioToken TRUE或者:CComPtr cpAudio //定义一个音频对象hr SpCreateDefaultObjectFromCategoryIdSPCAT_AUDIOIN cpAudio//建立默认的音频输入对象hr m_cpRecoEngine-SetInputcpAudio TRUE//设置识别引擎输入源 3、创建识别上下文接口调用 ISpRecogn
上一篇:
【精品】vc++6.0调试方法(附有快捷键)
下一篇:
青青子衿,悠悠我心