//1,生成动态连接库时,要#define USE_SPEECH_DLL,
// 并且#define LANE_SPEECH_EXPORTS
//2,使用动态连接库时,要#define USE_SPEECH_DLL
//3,声称和使用静态连接库时,什么都不需要
//4,另外主程序中静态连接库要调用的方式里要调用CoInitialize( NULL )和CoUninitialize(),
// 动态连接库就不用调用了。
#ifndef LANE_SPEECH_H
#define LANE_SPEECH_H
#include <windows.h>
#define _ATL_APARTMENT_THREADED
#include <atlbase.h>
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 <atlcom.h>
#include <sphelper.h> //sapi需要的头文件
//-----生成动态连接库和静态库的处理----------------
#ifdef USE_SPEECH_DLL //定义了USE_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,则不声明导出或导入类(LANE_SPEECH_DLL就为空)
#define LANE_SPEECH_DLL
#endif //USE_SPEECH_DLL
//***************************常量***********************
/公共常量-----------------
const DWORD SP_CHINESE = 0x0000; //简体中文.
const DWORD SP_ENGLISH = 0x0001; //英语.
/CTTS常量-----------------
const UINT WM_SPEAK = WM_USER + 4444; //触发事件产生的消息。
/SR常量-------------------
const UINT WM_RECOEVENT = WM_USER + 3333; //触发事件产生的消息。
const DWORD SR_INPROC = 0x0000; //独享类型的SR.
const DWORD SR_SHARE = 0x0001; //共享类型的SR.
//以下常量仅作例子用。
#define VID_TopLevelRule 9000 //顶级规则ID
#define VID_SubLevelRule1 9001 //子规则ID
#define VID_SubLevelRule2 9002 //子规则ID
#define VID_SubLevelRule3 9003 //子规则ID
//*************************类声明************************
class CSR;
///
///
//
// CTTS
//
///
///
class LANE_SPEECH_DLL CTTS
{
protected:
HWND m_hWnd; // 关联的窗口句柄。
CComPtr<ISpVoice> m_pVoice; // 声音对象的指针。
CComPtr<ISpObjectToken> m_pToken; // token对象的指针。
CComPtr<ISpAudio> m_pAudio; // 音频对象的指针。(用来保存原来默认的输入流)
CComPtr<ISpStream> m_pOutputStream; // 输出到文件的流对象。
public:
//********************************初始化部分********************
//功能: 保存与识别引擎关联的窗口句柄。
//参数: hWnd:要关联的窗口句柄。
//返回值: 无。
CTTS ( const HWND hWnd );
//功能: 释放所有的对象。
//参数: 无。
//返回值: 无。
~CTTS ();
//功能: 建立一个voice对象。设置要是别的语言种类,消息,通知事件。
//参数: dwLanguage:要朗读的语言种类,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,
const DWORD dwLanguage = SP_CHINESE );
//********************************设置部分***************************************
//功能: 设置朗读声音的语言种类。
//参数: dwLanguage:语言种类。SP_CHINESE为中文,SP_ENGLISH为英文。
//返回值: HRESULT类型。
HRESULT SetLanguage ( const DWORD dwLanguage );
//功能: 设置要处理的的事件。
//参数: ullInterest:来自enum SPEVENTENUM,要用SPFEI()转化为64bit的,
// 设置多个事件用运算符" | "。 用SPFEI_ALL_SR_EVENTS表示全部事
// 件都会收到通知。
//返回值: HRESULT。
HRESULT SetInterest ( const ULONGLONG ullInterest );
//功能: 设置朗读声音的音量。
//参数: usVolume:音量数值应该从0到100
//返回值: 无。
void SetVolume ( USHORT usVolume );
//功能: 得到朗读声音的音量。
//参数: 无。
//返回值: 音量数值,应该从0到100。
USHORT GetVolume ( );
//功能: 设置朗读声音的音速。
//参数: RateAdjust:音速,参数范围从-10到10。
//返回值: 无。
void SetRate ( LONG RateAdjust );
//功能: 得到朗读声音的音速。
//参数: 无。
//返回值: 音速,参数范围从-10到10。
LONG GetRate ( );
//功能: 设置朗读的声音流到.wav文件,如果不调用此函数则默认从音箱输出。
//参数: pszFileName:.wav文件的文件名。要用" L"" "转换。
//返回值: HRESULT。
HRESULT SetOutputWithWav ( const WCHAR *pszFileName = L"TtsOut.wav");
//功能: 设置朗读的声音从音箱输出。
//参数: 无。
//返回值: HRESULT。
HRESULT UnSetOutputWithWav ();
//**********************播放语音,文本到语音转换部分*****************************
//功能: 停止朗读。如果朗读为同步方式,则不能停止。
//参数: pwcs:要朗读的字符串,需用" L"" "转换,可以是包含xml标记
// 的字符串。dwFlags:朗读方式。SPF_ASYNC为异步,SVSFDefault为同步,
// SVSFIsXML为朗读带xml标记的文本。
//返回值: HRESULT。
HRESULT Speak ( const WCHAR *pwcs, const DWORD dwFlags = SPF_ASYNC );
//功能: 停止朗读。如果朗读为同步方式,则不能停止。
//参数: 无。
//返回值: 无。
void Stop ( );
//功能: 暂停朗读。如果朗读为同步方式,则不能暂停。
//参数: 无。
//返回值: 无。
void Pause ();
//功能: 从暂停的地方继续朗读。
//参数: 无。
//返回值: 无。
void Resume ();
//********************************处理事件部分***********************************
public:
//功能: 处理发生的事件。系统自动调用,不需要用户自己处理。
//参数: 无。
//返回值: 无。
void ProcessTTSEvent ();
//功能: 为虚函数。当输出流结束时要触发的动作,需要在派生类重载。
//参数: 无。
//返回值: 无。
virtual void OnStreamStart ();
//功能: 为虚函数。当输出流结束时要触发的动作,需要在派生类重载。
//参数: 无。
//返回值: 无。
virtual void OnStreamEnd ();
};
///
///
// CSR
//
///
///
class LANE_SPEECH_DLL CSR
{
protected:
HWND m_hWnd;
public:
CComPtr<ISpRecognizer> m_pSREngine; // 语音识别引擎(recognition)的接口。
CComPtr<ISpRecoContext> m_pSRContext; // 识别引擎上下文(context)的接口。
CComPtr<ISpRecoGrammar> m_pSRGrammar; // 识别文法(grammar)的接口。
CComPtr<ISpStream> m_pInputStream; // 流()的接口。
CComPtr<ISpObjectToken> m_pToken; // 语音特征的(token)接口。
CComPtr<ISpAudio> m_pAudio; // 音频(Audio)的接口。(用来保存原来默认的输入流)
public:
static ULONGLONG ullGrammerID