
微软TTS语音引擎(speechapisapi)深度开发入门.docx
7页Windows TTS 开发介绍开篇介绍:我们都使用过一些某某词霸的英语学习工具软件,它们大多都有朗读的功能,其实这就是利用的 Windows 的 TTS(Text To Speech)语音引擎它包含在Windows Speech SDK 开发包中我们也可以使用此开发包根据自己的需要开发程序鸡啄米下面对 TTS 功能的软件开发过程进行详细介绍一.SAPI SDK 的介绍SAPI,全称是 The Microsoft Speech API就是微软的语音 API由Windows Speech SDK 提供Windows Speech SDK 包含语音识别 SR 引擎和语音合成 SS 引擎两种语音引擎语音识别引擎用于识别语音命令,调用接口完成某个功能,实现语音控制语音合成引擎用于将文字转换成语音输出SAPI 包括以下几类接口:Voice Commands API、Voice Dictation API、Voice Text API、Voice Telephone API 和 Audio Objects API我们要实现语音合成需要的是 Voice Text API目前最常用的 Windows Speech SDK 版本有三种:5.1、5.3 和 5.4。
Windows Speech SDK 5.1 版本支持 xp 系统和 server 2003 系统,需要下载安装XP 系统默认只带了个 Microsoft Sam 英文男声语音库,想要中文引擎就需要安装 Windows Speech SDK 5.1Windows Speech SDK 5.3 版本支持 Vista 系统和 Server 2008 系统,已经集成到系统里Vista 和 Server 2003 默认带 Microsoft lili 中文女声语音库和 Microsoft Anna 英文女声语音库Windows Speech SDK 5.4 版本支持 Windows7 系统,也已经集成到系统里,不需要下载安装Win7 系统同样带了 Microsoft lili 中文女声语音库和Microsoft Anna 英文女声语音库Microsoft lili 支持中英文混读二.SAPI SDK 的下载和安装如果是在 XP 系统下进行开发则需要下载 Microsoft Speech SDK 5.1,下载地址为: 根据微软下载说明,有几点需要注意:1.如果你想下载例子程序、文档、SAPI 和用于开发的美国英文语音引擎,请下载 SpeechSDK51.exe。
2.如果你想使用日文和简体中文引擎用于开发,请下载SpeechSDK51.exe 和 SpeechSDK51LangPach.exe3.如果你想将语音引擎集成到你的产品跟产品一起发布,就下载SpeechSDK51MSM.exe4.如果你仅想获得 XP 系统下的 Mike 和 Mary 语音,就下载Sp5TTIntXP.exe5.如果你只想要文档请下载 sapi.chm下载完成后可先安装引擎 SpeechSDK51.exe,再安装中文语言补丁包SpeechSDK51LangPach.exe,这样就可以使用其中的中 文男声语音库了如果想要在 Vista 或 Win7 系统下使用 Mike、Mary 和 Microsoft Simplified Chinese 中文男声语音库也可以下载相应的文件安装三.VC++环境配置如果是在 XP 系统下开发,先安装 SpeechSDK51.exe 再安装SpeechSDK51LangPach.exe,假设安装路径为默认的 C:\Program Files\Microsoft Speech SDK 5.1,则接下来需要配置 VC++,以 VS2010 为 例,在 Solution Exporer 中的工程名上点右键,在右键菜单中选择 properties,弹出 Property Pages 对话框,然后在左侧树中选择节点”VC++Directories“,在右侧列表的 Include Directories 处输入”C:\Program Files\Microsoft Speech SDK 5.1\Include“,Library Directories 处输入”C:\Program Files\Microsoft Speech SDK 5.1\lib\i386“。
VS2005、VS2008和 VC6.0 可以按照各自的方法设置最后,在程序中使用语音引擎以前包含头文件和 lib 库:#include "sapi.h"#include "sphelper.h"#pragma comment(lib, "sapi.lib")如果是在 Vista 或者 Win7 系统中开发的话,因为头文件和 lib 库所在路径已默认附加到编译器了,所以不需手动添加,直接在程序中包含头文件和lib 库即可四.SAPI 接口的使用说明1.基本朗读过程的实现 在使用语音引擎之前进行初始化:ISpVoice *pSpVoice; // 重要 COM 接口::CoInitialize(NULL); // COM 初始化// 获取 ISpVoice 接口CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_INPROC_SERVER, IID_ISpVoice, (void**)&pSpVoice);获取到 ISpVoice 接口以后,我们就可以通过 pSpVoice 指针调用 SAPI接口了我们可以设置音量:pSpVoice->SetVolume(80);。
SetVolume 的参数即音量的范围在 0 到 100 之间可以这样朗读字符串内容:pSpVoice->Speak(string, SPF_DEFAULT, NULL);这样 string 里的内容就会被朗读出来了,第二个参数 SPF_DEFAULT 表示使用默认设置,包括同步朗读的设置异步朗读可以设置成 SPF_ASYNC同步朗读表示读完 string 中的内容,speak 函数才会返回,而异步朗读则将字符串送进去就返回,不会阻塞使用完语音引擎后应执行:pSpVoice->Release();::CoUninitialize(); 这样资源被释放,语音朗读过程结束以上就完成了一个简单的语音合成朗读的功能2.ISpVoice 的成员函数鸡啄米再简单说明几个 ISpVoice 接口的成员函数:HRESULT Speak(LPCWSTR *pwcs, DWORD dwFlags, ULONG *pulStreamNumber);用于读取字符串 pwcs 里的内容参数 pwcs 为要朗读的字符串dwFlags 是用于控制朗读方式的标志,具体意义可以查看文档中的枚举 SPEAKFLAGS。
pulStreamNumber 为输出参数,它指向本次朗读请求对应的当前输入流编号,每次朗读一个字符串时都会有一个流编号返 回,异步朗读时使用HRESULT SetRate( long RateAdjust); // 设置朗读速度,取值范围:-10 到 10HRESULT GetRate(long *pRateAdjust); // 获取朗读速度 HRESULT SetVoice(ISpObjectToken *pToken); // 设置使用的语音库HRESULT GetVoice(ISpObjectToken** ppToken); // 获取语音库HRESULT Pause ( void ); // 暂停朗读HRESULT Resume ( void ); // 恢复朗读 // 在当前朗读文本中根据 lNumItems 的符号向前或者向后跳过指定数量(lNumItems 的绝对值)的句子HRESULT Skip(LPCWSTR *pItemType, long lNumItems, ULONG *pulNumSkipped);// 播放 WAV 文件HRESULT SpeakStream(IStream *pStream, DWORD dwFlags, ULONG *pulStreamNumber);// 将声音输出到 WAV 文件HRESULT SetOutput(IUnknown *pUnkOutput,BOOL fAllowFormatChanges); HRESULT SetVolume(USHORT usVolume); // 设置音量,范围:0到 100HRESULT GetVolume(USHORT *pusVolume); // 获取音量HRESULT SetSyncSpeakTimeout(ULONG msTimeout); // 设置同步朗读超时时间,单位为毫秒HRESULT GetSyncSpeakTimeout(ULONG *pmsTimeout); // 获取同步朗读超时时间因为在同步朗读时,speak 函数是阻塞的,如果语音输出设备被其他程序占用,则 speak 则会一直等待,所以最好设置好超时时间,超时后 speak 函数自行返回。
3.使用 XML 朗读在进行 TTS 开发时可以使用 XML,SAPI 可以分析 XML 标签,通过 XML 能够实现一些 ISpVoice 的成员函数的功能比如设置语音库、音量、语速等此时 speak 函数的 dwFlags 参数要设置为包含 SPF_IS_XML如:// 选择语音库 Microsoft SampSpVoice->speak(L"鸡啄米", SPF_DEFAULT | SPF_IS_XML, NULL);// 设置音量鸡啄米 // 设置语言鸡啄米804 代表中文,409 代表英文如果用函数 SpGetLanguageFromToken 获取语言时,0x804 表示中文,0x409 表示英文五.Microsofot Speech SDK 开发程序举例::CoInitialize(NULL); // COM 初始化CLSID CLSID_SpVoice;CLSIDFromProgID(_T("SAPI.SpVoice"), &CLSID_SpVoice);ISpVoice *pSpVoice = NULL;IEnumSpObjectTokens *pSpEnumTokens = NULL;// 获取 ISpVoice 接口if (FAILED(CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_INPROC_SERVER, IID_ISpVoice, (void**)&pSpVoice))){return -1;}// 列举所有的语音 token,可以通过 pSpEnumTokens 指向的接口得到if (SUCCEEDED(SpEnumTokens(SPCAT_VOICES, NULL, NULL, &pSpEnumTokens))){ISpObjectToken *pSpToken = NULL;// 依次获取每个 token 并朗读字符串while (SUCCEEDED(pSpEnumTokens->Next(1, &pSpToken, NULL)) && pSpToken != NULL){pSpVoice->SetVoice(pSpToken); // 设置当前。
