《2022年2022年集成微软语音识别与语音合成代码的类代码 .pdf》由会员分享,可在线阅读,更多相关《2022年2022年集成微软语音识别与语音合成代码的类代码 .pdf(26页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、基于 Microsoft Speech SDK 5.1的集成微软语音识别与语音合成代码的类代码(1)2009-02-24 13:37 / /1 ,生成动态连接库时,要#define USE_SPEECH_DLL, / 并且#define LANE_SPEECH_EXPORTS /2 ,使用动态连接库时,要#define USE_SPEECH_DLL /3 ,声称和使用静态连接库时,什么都不需要/4 ,另外主程序中静态连接库要调用的方式里要调用CoInitialize( NULL )和 CoUninitialize(),/ 动态连接库就不用调用了。/ #ifndef LANE_SPEECH_H
2、#define LANE_SPEECH_H #include #define _ATL_APARTMENT_THREADED #include extern CComModule _Module; /You may derive a class from CComModule and use it. if you want to override something,but do not change the name of _Module #include #include /sapi需要的头文件/-生成动态连接库和静态库的处理- #ifdef USE_SPEECH_DLL / 定义了 US
3、E_SPEECH_DLL,就按生成 DLL ,声明导出导入类#ifdef LANE_SPEECH_EXPORTS #define LANE_SPEECH_DLL _declspec(dllexport) #else #define LANE_SPEECH_DLL _declspec(dllimport) #endif / 这个警告我现在还没闹清楚是怎么回事了,估计是DLL和 com或 atl 有关/ 暂时只能屏蔽掉它,在静态库里就不会出现这个警告。#pragma warning( disable : 4251 ) #else /没定义 USE_SPEECH_DLL,则不声明导出或导入类(LAN
4、E_SPEECH_DLL就为空)#define LANE_SPEECH_DLL #endif /USE_SPEECH_DLL /*常量* /公共常量 - const DWORD SP_CHINESE = 0 x0000; / 简体中文 . const DWORD SP_ENGLISH = 0 x0001; / 英语. /CTTS常量- const UINT WM_SPEAK = WM_USER + 4444; / 触发事件产生的消息。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1
5、 页,共 26 页 - - - - - - - - - /SR常量- const UINT WM_RECOEVENT = WM_USER + 3333; / 触发事件产生的消息。const DWORD SR_INPROC = 0 x0000; / 独享类型的 SR. const DWORD SR_SHARE = 0 x0001; / 共享类型的 SR. / 以下常量仅作例子用。#define VID_TopLevelRule 9000 /顶级规则 ID #define VID_SubLevelRule1 9001 /子规则 ID #define VID_SubLevelRule2 9002 /
6、子规则 ID #define VID_SubLevelRule3 9003 /子规则 ID /*类声明 * class CSR; / / / / CTTS / / / class LANE_SPEECH_DLL CTTS protected: HWND m_hWnd; / 关联的窗口句柄。CComPtr m_pVoice; / 声音对象的指针。CComPtr m_pToken; / token对象的指针。CComPtr m_pAudio; / 音频对象的指针。 ( 用来保存原来默认的输入流) CComPtr m_pOutputStream; / 输出到文件的流对象。public: /*初始化部
7、分 * / / 功能: 保存与识别引擎关联的窗口句柄。/ 参数: hWnd :要关联的窗口句柄。/ 返回值:无。/ CTTS ( const HWND hWnd ); / / 功能: 释放所有的对象。/ 参数: 无。/ 返回值:无。/ CTTS (); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 26 页 - - - - - - - - - / / 功能: 建立一个 voice 对象。设置要是别的语言种类,消息, 通知事件。/ 参数: dwLanguage:要朗读的语
8、言种类, SP_CHINESE 为中文,/ SP_ENGLISH为英文。/ 返回值: HRESULT 类型。/ HRESULT Create( const DWORD dwLanguage = SP_CHINESE ); / / 功能: 从一个 SR引擎建立一个 voice 对象。设置要是别的语言种类,消息, / 通知事件。/ 参数: pSRContext :SR引擎的指针。 dwLanguage :要朗读的语言种类,/ SP_CHINESE为中文, SP_ENGLISH 为英文。/ 返回值: HRESULT 类型。/ HRESULT Create ( const CSR * pSR, con
9、st DWORD dwLanguage = SP_CHINESE ); /*设置部分 * / / 功能: 设置朗读声音的语言种类。/ 参数: dwLanguage:语言种类。 SP_CHINESE 为中文, SP_ENGLISH 为英文。/ 返回值: HRESULT 类型。/ HRESULT SetLanguage ( const DWORD dwLanguage ); / / 功能: 设置要处理的的事件。/ 参数: ullInterest:来自 enum SPEVENTENUM,要用 SPFEI()转化为 64bit 的,/ 设置多个事件用运算符 | 。 用 SPFEI_ALL_SR_EVE
10、NTS表示全部事/ 件都会收到通知。/ 返回值: HRESULT 。/ HRESULT SetInterest ( const ULONGLONG ullInterest ); / / 功能: 设置朗读声音的音量。/ 参数: usVolume:音量数值应该从0 到 100 / 返回值:无。/ void SetVolume ( USHORT usVolume ); / / 功能: 得到朗读声音的音量。/ 参数: 无。/ 返回值:音量数值,应该从0 到 100。/ USHORT GetVolume ( ); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - -
11、- - - - - - 名师精心整理 - - - - - - - 第 3 页,共 26 页 - - - - - - - - - / / 功能: 设置朗读声音的音速。/ 参数: RateAdjust :音速 , 参数范围从 -10 到 10。/ 返回值:无。/ void SetRate ( LONG RateAdjust ); / / 功能: 得到朗读声音的音速。/ 参数: 无。/ 返回值:音速, 参数范围从 -10 到 10。/ LONG GetRate ( ); / / 功能: 设置朗读的声音流到 .wav 文件,如果不调用此函数则默认从音箱输出。/ 参数: pszFileName :.wa
12、v 文件的文件名。要用 L 转换。/ 返回值: HRESULT 。/ HRESULT SetOutputWithWav ( const WCHAR *pszFileName = LTtsOut.wav); / / 功能: 设置朗读的声音从音箱输出。/ 参数: 无。/ 返回值: HRESULT 。/ HRESULT UnSetOutputWithWav (); /*播放语音,文本到语音转换部分* / / 功能: 停止朗读。如果朗读为同步方式,则不能停止。/ 参数: pwcs:要朗读的字符串,需用 L 转换,可以是包含xml 标记/ 的字符串。 dwFlags:朗读方式。 SPF_ASYNC 为异
13、步, SVSFDefault 为同步,/ SVSFIsXML为朗读带 xml 标记的文本。/ 返回值: HRESULT 。/ HRESULT Speak ( const WCHAR *pwcs, const DWORD dwFlags = SPF_ASYNC ); / / 功能: 停止朗读。如果朗读为同步方式,则不能停止。/ 参数: 无。/ 返回值:无。/ void Stop ( ); / / 功能: 暂停朗读。如果朗读为同步方式,则不能暂停。/ 参数: 无。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - -
14、- - - - - 第 4 页,共 26 页 - - - - - - - - - / 返回值:无。/ void Pause (); / / 功能: 从暂停的地方继续朗读。/ 参数: 无。/ 返回值:无。/ void Resume (); /*处理事件部分 * public: / / 功能: 处理发生的事件。系统自动调用,不需要用户自己处理。/ 参数: 无。/ 返回值:无。/ void ProcessTTSEvent (); / / 功能: 为虚函数。当输出流结束时要触发的动作,需要在派生类重载。/ 参数: 无。/ 返回值:无。/ virtual void OnStreamStart (); /
15、 / 功能: 为虚函数。当输出流结束时要触发的动作,需要在派生类重载。/ 参数: 无。/ 返回值:无。/ virtual void OnStreamEnd (); ; / / / CSR / / / class LANE_SPEECH_DLL CSR protected: HWND m_hWnd; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 26 页 - - - - - - - - - public: CComPtr m_pSREngine; / 语音识别引擎 (re
16、cognition)的接口。CComPtr m_pSRContext; / 识别引擎上下文 (context)的接口。CComPtr m_pSRGrammar; / 识别文法 (grammar)的接口。CComPtr m_pInputStream; / 流() 的接口。CComPtr m_pToken; / 语音特征的 (token) 接口。CComPtr m_pAudio; / 音频(Audio) 的接口。 ( 用来保存原来默认的输入流) public: static ULONGLONG ullGrammerID; / Grammer的标识符 , 64 位无符号整型每建立一个 Grammar
17、,加一。protected: /*辅助功能部分 * / /GrammarID 加一,每个 GrammerID必须不同。/ static void UpdateGrammerID ( ); public: / / 功能: 友员。 TTS中的从 SR引擎中建立 voice 对象。/ 参数: pSRContext :SR上下文对象的指针。/ 返回值: HRESULT 类型。/ friend HRESULT CTTS:Create ( const CSR * pSR, const DWORD dwLanguage ); /*初始化部分 * / / 功能: 保存与识别引擎关联的窗口句柄,更新Gramma
18、rID 。/ 参数: hWnd :要关联的窗口句柄。/ 返回值:无。/ CSR ( HWND hWnd ); / / 功能: 释放所有的对象。/ 参数: 无。/ 返回值:无。/ CSR ( ); / / 功能: 建立各个接口的对象。设置要是别的语言种类,消息,通知事件,/ 加载文法文件。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 26 页 - - - - - - - - - / 参数: SRType:识别引擎的类型, SR_INPROC 为独享类型, SR_SHARE
19、共享类型。/ pwcGramFileName:文法文件的文件名,要用 L 转换为 WCHAR型。/ dwLanguage:要是别的语言种类, SP_CHINESE 为中文, SP_ENGLISH 为英文。/ 返回值: HRESULT 类型。/ HRESULT Create (const DWORD SRType, const WCHAR *pwcGramFileName = Lgrammar.xml, const DWORD dwLanguage = SP_CHINESE ); /*设置部分 * / / 功能: 设置要处理的上下文接受的事件。/ 参数: ullInterest:来自 enum
20、SPEVENTENUM,要用 SPFEI()转化为 64bit 的,/ 设置多个事件用运算符 | 。 用 SPFEI_ALL_SR_EVENTS表示全部事/ 件都会收到通知。/ 返回值: HRESULT 。/ HRESULT SetInterest ( const ULONGLONG ullInterest ); / / 功能: 设置某个规则的状态(激活或者取消激活)。/ 参数: pszName :规则名,要用 L 转换。 bFlag:TRUE 表示激活,/ FALSE表示取消激活。/ 返回值: HRESULT 。/ HRESULT SetRuleState ( const WCHAR *ps
21、zName, const BOOL bFlag ); / / 功能: 设置识别引擎从 .wav 文件识别语音,如果不调用此函数则默认从麦克/ 风输入。/ 参数: pszFileName :.wav 文件的文件名。要用 L 转换。/ 返回值: HRESULT 。/ HRESULT SetInputWithWav ( const WCHAR *pszFileName = Lsr.wav ); / / 功能: 取消从 .wav 文件识别。恢复从麦克风识别。/ 参数: 无。/ 返回值: HRESULT 。/ HRESULT UnSetInputWithWav ( ); /*识别开始,结束,识别结果的处
22、理* / / 功能: 识别开始(将所有规则激活)。/ 参数: 无名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 26 页 - - - - - - - - - / 返回值:无。/ void StartRecognize ( ); / / 功能: 识别结束(将所有规则取消激活)。/ 参数: 无。/ 返回值:无。/ void EndRecognize ( ); public: / / 功能: 处理发生的事件。系统自动调用,不需要用户自己处理。/ 参数: 无。/ 返回值:无。/
23、void ProcessRecoEvent ( ); protected: / / 功能: 识别成功时要调用的函数。系统自动调用,不需要用户自己处理。/ 参数: pPhrase :ISpPhrase 类型。/ 返回值:无。/ void OnRecoSuccess ( ISpPhrase *pPhrase ); public: / / 功能: 识别成功后,根据规则的ID 决定动作。系统自动调用。虚函数,/ 需要在派生类重载。规则ID 必须以常量形式预先定义。/ 参数: ulRuleID:顶级规则的 ID。ulVal :子规则的 ID。/ 返回值:无。/ virtual void ExecuteC
24、ommand ( const ULONG ulRuleID, const ULONG ulVal ); / / 功能: 识别失败时的动作,系统自动调用。虚函数,需要在派生类重载。/ 参数: 无。/ 返回值:无。/ virtual void OnRecoFail (); / / 功能: 为虚函数。当输入流开始时要触发的动作,需要在派生类重载。/ 参数: 无。/ 返回值:无。/ virtual void OnStreamStart (); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第
25、8 页,共 26 页 - - - - - - - - - / / 功能: 为虚函数。当输入流结束时要触发的动作,需要在派生类重载。/ 参数: 无。/ 返回值:无。/ virtual void OnStreamEnd (); ; #endif /LANE_SPEECH_DLL_H / / / / 文件: LaneSpeech.cpp / 功能:封装的 speech sdk5.1 的文本语音合成 (TTS)和语音识别 (SR)功能/ 语音识别只支持命令模式,不支持连续模式/ 作者:吕宝虹( Lane), msn: , qq: 3619908 / 日期: 2004.10 / 版本: 1.2 / /
26、/ #include LaneSpeech.h /-生成动态连接库和静态库的处理- #ifdef USE_SPEECH_DLL / 定义了 USE_SPEECH_DLL,就按生成 DLL ,声明导出导入类BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) switch (ul_reason_for_call) case DLL_PROCESS_ATTACH: CoInitialize(NULL); break; case DLL_THREAD_ATTACH: break; ca
27、se DLL_THREAD_DETACH: break; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 26 页 - - - - - - - - - case DLL_PROCESS_DETACH: CoUninitialize(); break; return TRUE; #endif /USE_SPEECH_DLL / / / 功能: 弹出一个信息框。/ 参数: lpText :是对话框信息。 lpCaption :对话框标题。/ 返回值:无。/ inline vo
28、id ShowError ( const LPCTSTR lpText = ERROR, const LPCTSTR lpCaption = ERROR ) :MessageBox( NULL, lpText, lpCaption, MB_OK | MB_ICONERROR ); / / 功能: 检查一个 HRESULT 类型的值,如果是错误的值则,弹出信息框提示错误。/ 参数: hr: 要检查的 HRESULT 的引用。 lpText :是对话框信息。/ lpCaption:对话框标题。/ 返回值:有错则为 FALSE, 没错则返回 TRUE 。/ inline BOOL CheckHr (
29、 const HRESULT &hr, const LPCTSTR lpText = ERROR, const LPCTSTR lpCaption = ERROR ) if ( FAILED( hr ) ) ShowError ( lpText, lpCaption ); return FALSE; return TRUE; / / / / CTTS / / / 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 26 页 - - - - - - - - - / / 保存关
30、联窗口句柄。初始化COM 。/ CTTS:CTTS ( const HWND hWnd ) m_hWnd = hWnd; m_pVoice = NULL; m_pToken = NULL; m_pOutputStream = NULL; m_pAudio = NULL; / / 释放所有对象。/ CTTS:CTTS () if( m_pToken) m_pToken.Release(); m_pToken = NULL; if( m_pAudio ) m_pAudio.Release(); m_pAudio = NULL; if ( m_pOutputStream ) m_pOutputStr
31、eam.Release(); m_pOutputStream = NULL; if( m_pVoice ) m_pVoice.Release(); m_pVoice = NULL; / / 从 SR的上下文中得到voice 对象。此函数在CSR 中被声明一个友员。/ HRESULT CTTS:Create( const CSR * pSR, const DWORD dwLanguage ) HRESULT hr; hr = pSR-m_pSRContext-GetVoice ( &m_pVoice ); if ( !:CheckHr ( hr, pSRContext-GetVoice() )
32、) return hr; SetLanguage ( dwLanguage ); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 26 页 - - - - - - - - - hr = SpCreateDefaultObjectFromCategoryId ( SPCAT_AUDIOIN, &m_pAudio );/建立一个默认音频流if ( !:CheckHr ( hr, CreateDefaultObjectFodd() ) ) return hr; /SPEI_S
33、TART_INPUT_STREAM表示输出对象开始接受流输出SPEI_START_INPUT_STREAM /SPEI_END_INPUT_STREAM 表示完成流输出。hr = m_pVoice-SetInterest( SPFEI( SPEI_START_INPUT_STREAM ) | SPFEI( SPEI_END_INPUT_STREAM ), SPFEI( SPEI_START_INPUT_STREAM ) | SPFEI( SPEI_END_INPUT_STREAM ) ); if ( !:CheckHr ( hr, m_pVoice-SetInterest() ) ) retu
34、rn hr; / 设置通知消息hr = m_pVoice-SetNotifyWindowMessage( m_hWnd, WM_SPEAK, 0, 0 ); if ( !:CheckHr ( hr, m_pVoice-SetNotifyWindowMessage() ) ) return hr; return hr; / / 单独(相对于从 SR的上下文中得到 voice 对象)建立一个voice 对象。/ 并设置兴趣 , 设置通知事件。/ HRESULT CTTS:Create( const DWORD dwLanguage ) HRESULT hr; hr = m_pVoice.CoCre
35、ateInstance ( CLSID_SpVoice ); if ( !:CheckHr ( hr, m_pVoice.CoCreateInstance() ) ) return hr; SetLanguage ( dwLanguage ); hr = SpCreateDefaultObjectFromCategoryId ( SPCAT_AUDIOIN, &m_pAudio );/建立一个默认音频流if ( !:CheckHr ( hr, CreateDefaultObjectFodd() ) ) return hr; /SPEI_START_INPUT_STREAM表示输出对象开始接受流
36、输出SPEI_START_INPUT_STREAM /SPEI_END_INPUT_STREAM 表示完成流输出。hr = m_pVoice-SetInterest( SPFEI( SPEI_START_INPUT_STREAM ) | SPFEI( SPEI_END_INPUT_STREAM ), SPFEI( SPEI_START_INPUT_STREAM ) | 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 26 页 - - - - - - - - - SPFE
37、I( SPEI_END_INPUT_STREAM ) ); if ( !:CheckHr ( hr, m_pVoice-SetInterest() ) ) return hr; / 设置通知消息hr = m_pVoice-SetNotifyWindowMessage( m_hWnd, WM_SPEAK, 0, 0 ); if ( !:CheckHr ( hr, m_pVoice-SetNotifyWindowMessage() ) ) return hr; return hr; 基于 Microsoft Speech SDK 5.1的集成微软语音识别与语音合成代码的类代码(2)2009-02-
38、24 13:38 / / 设置语言,默认的语言为中文。SP_CHINESE 为中文, SP_ENGLISH 为英文/ HRESULT CTTS:SetLanguage ( const DWORD dwLanguage ) HRESULT hr; switch ( dwLanguage ) case SP_CHINESE: hr = SpFindBestToken( SPCAT_VOICES, Llanguage=804, NULL, &m_pToken ); if ( !:CheckHr ( hr, SpFindBestToken()错误, CTTS:SetLanguage ) ) retur
39、n hr; hr = m_pVoice-SetVoice( m_pToken ); if ( !:CheckHr ( hr, SpFindBestToken()错误, CTTS:SetLanguage ) ) return hr; break; case SP_ENGLISH: hr = SpFindBestToken( SPCAT_VOICES, Llanguage=409, NULL, &m_pToken ); if ( !:CheckHr ( hr, SpFindBestToken()错误, CTTS:SetLanguage ) ) return hr; hr = m_pVoice-Se
40、tVoice( m_pToken ); if ( !:CheckHr ( hr, SpFindBestToken()错误, CTTS:SetLanguage ) ) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 26 页 - - - - - - - - - return hr; break; default: :ShowError ( 设置中文请用 SP_CHINESE, 设置英文请用 SP_ENGLISH, CTTS:SetLanguage()参数错误 ); ret
41、urn hr; / / 设置要处理的事件。/ HRESULT CTTS:SetInterest ( const ULONGLONG ullInterest ) HRESULT hr; / 设置 pvoice 感兴趣的事件。hr = m_pVoice-SetInterest( ullInterest, ullInterest ); if ( !:CheckHr ( hr, m_pVoice-SetInterest(), CTTS:SetInterest() ) ) return hr; /*/设置通知消息hr = m_pVoice-SetNotifyWindowMessage( hWnd, WM
42、_SPEAK, 0, 0 ); if ( !:CheckHr ( hr, m_pVoice-SetNotifyWindowMessage(), CTTS:SetInterest() ) ) return hr; */ return hr; / / 设置朗读音量。音量数值应该从0 到 100 / void CTTS:SetVolume ( USHORT usVolume ) if ( (usVolume 100) | (usVolumeSetVolume( usVolume ); / / 取得音量的值。/ USHORT CTTS:GetVolume ( ) USHORT usVolume; m_
43、pVoice-GetVolume ( &usVolume ); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 26 页 - - - - - - - - - return usVolume; / / 设置语速。参数范围从 -10 到 10 / void CTTS:SetRate ( LONG RateAdjust ) if ( (RateAdjust 10) ) :ShowError ( SetRate()设置的数值必须在 -10 到 10 之间 ); return;
44、m_pVoice-SetRate ( RateAdjust ); / / 得到当前语速的数值。/ LONG CTTS:GetRate ( ) LONG RateAdjust; m_pVoice-GetRate( &RateAdjust ); return RateAdjust; / / 设置朗读的声音流到 .wav 文件,如果不调用此函数则默认从音箱输出。/ 并设置要处理的事件,应该包含对流的开始和结束。在Create() 中已经设置好了。/ HRESULT CTTS:SetOutputWithWav ( const WCHAR *pszFileName ) /,LONG Format = P
45、SF_22kHz16BitStereo) HRESULT hr; CSpStreamFormat sOutputFormat; CComPtr cpOldStream; m_pVoice-GetOutputStream( &cpOldStream ); sOutputFormat.AssignFormat( SPSF_22kHz16BitStereo ); /sOutputFormat.AssignFormat(cpOldStream); hr = SPBindToFile( pszFileName, SPFM_CREATE_ALWAYS, /SPFM_CREATE, /SPFM_OPEN_R
46、EADWRITE, &m_pOutputStream, &sOutputFormat.FormatId(), sOutputFormat.WaveFormatExPtr() ); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 26 页 - - - - - - - - - if ( !:CheckHr ( hr, SPBindToFile ) ) return hr; hr = m_pVoice-SetOutput ( m_pOutputStream, TRUE );
47、if ( !:CheckHr ( hr, m_pVoice-SetOutput() ) ) return hr; return hr; / / 设置朗读的声音从音箱输出。/ HRESULT CTTS:UnSetOutputWithWav () HRESULT hr; hr = m_pVoice-SetOutput ( m_pAudio, FALSE ); :CheckHr ( hr, UnSetOutputWithWav () ); m_pOutputStream-Close (); return hr; / / 朗读。 dwFlags 为 SPF_ASYNC时,指异步朗读。 SPF_DEFA
48、ULT为同步。/SPF_IS_XML指 pwcs中包含 xml 标签。按 xml 标签的设置朗读。/ HRESULT CTTS:Speak ( const WCHAR *pwcs, const DWORD dwFlags ) /WCHAR WTX = Ltext to wave; HRESULT hr; hr = m_pVoice-Speak ( pwcs, dwFlags, NULL); :CheckHr ( hr, CTTS:Speak ); return hr; / / 停止播放。 Speak() 为同步朗读时不能停止。/ void CTTS:Stop ( ) m_pVoice-Spea
49、k ( NULL, SPF_ASYNC, NULL ); / / 暂停朗读。/ void CTTS:Pause () 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 26 页 - - - - - - - - - m_pVoice-Pause (); / / 从暂停处继续朗读/ void CTTS:Resume () m_pVoice-Resume (); / / 从事件队列取得事件并处理。根据相应的事件调用相应的函数。/ void CTTS:ProcessTTSEven
50、t () CSpEvent event; / 事件助手类 / 循环处理事件当事件队列里有事件的时候。 while ( event.GetFrom(m_pVoice) = S_OK ) / 察看识别成功事件和识别失败事件 switch (event.eEventId) case SPEI_START_INPUT_STREAM: OnStreamStart (); break; case SPEI_END_INPUT_STREAM: OnStreamEnd (); break; case SPEI_VOICE_CHANGE: /OnVoiceChange (); break; case SPEI_