1、 我们都使用过一些某某词霸的英语学习工具软件,它们大多都有朗读的功能,其实这就是利用的 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 引擎两种语音引擎。语音识别引擎用于识别语音
2、命令,调用接口完成某个功能,实现语音控制。语音合成引擎用于将文字转换成语音输出。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 系统默认只带了个 Microsof
3、t Sam 英文男声语音库,想要中文引擎就需要安装 Windows Speech SDK 5.1。Windows 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 英文女声语音库。Mi
4、crosoft lili 支持中英文混读。二.SAPI SDK 的下载和安装如果是在 XP 系统下进行开发则需要下载 Microsoft Speech SDK 5.1,下载地址为:http:/ 和用于开发的美国英文语音引擎,请下载 SpeechSDK51.exe。2.如果你想使用日文和简体中文引擎用于开发,请下载SpeechSDK51.exe 和 SpeechSDK51LangPach.exe。3.如果你想将语音引擎集成到你的产品跟产品一起发布,就下载SpeechSDK51MSM.exe。4.如果你仅想获得 XP 系统下的 Mike 和 Mary 语音,就下载Sp5TTIntXP.exe。5.
5、如果你只想要文档请下载 sapi.chm。下载完成后可先安装引擎 SpeechSDK51.exe,再安装中文语言补丁包SpeechSDK51LangPach.exe,这样就可以使用其中的中 文男声语音库了。如果想要在 Vista 或 Win7 系统下使用 Mike、Mary 和 Microsoft Simplified Chinese 中文男声语音库也可以下载相应的文件安装。三.VC+环境配置如果是在 XP 系统下开发,先安装 SpeechSDK51.exe 再安装SpeechSDK51LangPach.exe,假设安装路径为默认的 C:Program FilesMicrosoft Speec
6、h SDK 5.1,则接下来需要配置 VC+,以 VS2010 为 例,在 Solution Exporer 中的工程名上点右键,在右键菜单中选择 properties,弹出 Property Pages 对话框,然后在左侧树中选择节点”VC+Directories“,在右侧列表的 Include Directories 处输入”C:Program FilesMicrosoft Speech SDK 5.1Include“,Library Directories 处输入”C:Program FilesMicrosoft Speech SDK 5.1libi386“。VS2005、VS2008和
7、 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 初始
8、化/ 获取 ISpVoice 接口CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_INPROC_SERVER, IID_ISpVoice, (void*)获取到 ISpVoice 接口以后,我们就可以通过 pSpVoice 指针调用 SAPI接口了。我们可以设置音量:pSpVoice-SetVolume(80);。SetVolume 的参数即音量的范围在 0 到 100 之间。可以这样朗读字符串内容:pSpVoice-Speak(string, SPF_DEFAULT, NULL);。这样 string 里的内容就会被朗读出来了,第二个参数 SPF_D
9、EFAULT 表示使用默认设置,包括同步朗读的设置。异步朗读可以设置成 SPF_ASYNC。同步朗读表示读完 string 中的内容,speak 函数才会返回,而异步朗读则将字符串送进去就返回,不会阻塞。使用完语音引擎后应执行:pSpVoice-Release();:CoUninitialize(); 这样资源被释放,语音朗读过程结束。以上就完成了一个简单的语音合成朗读的功能。2.ISpVoice 的成员函数鸡啄米再简单说明几个 ISpVoice 接口的成员函数:HRESULT Speak(LPCWSTR *pwcs, DWORD dwFlags, ULONG *pulStreamNumber
10、);用于读取字符串 pwcs 里的内容。参数 pwcs 为要朗读的字符串。dwFlags 是用于控制朗读方式的标志,具体意义可以查看文档中的枚举 SPEAKFLAGS。pulStreamNumber 为输出参数,它指向本次朗读请求对应的当前输入流编号,每次朗读一个字符串时都会有一个流编号返 回,异步朗读时使用。HRESULT SetRate( long RateAdjust); / 设置朗读速度,取值范围:-10 到 10HRESULT GetRate(long *pRateAdjust); / 获取朗读速度 HRESULT SetVoice(ISpObjectToken *pToken);
11、/ 设置使用的语音库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,
12、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 GetSyncSpeak
13、Timeout(ULONG *pmsTimeout); / 获取同步朗读超时时间因为在同步朗读时,speak 函数是阻塞的,如果语音输出设备被其他程序占用,则 speak 则会一直等待,所以最好设置好超时时间,超时后 speak 函数自行返回。3.使用 XML 朗读在进行 TTS 开发时可以使用 XML,SAPI 可以分析 XML 标签,通过 XML 能够实现一些 ISpVoice 的成员函数的功能。比如设置语音库、音量、语速等。此时 speak 函数的 dwFlags 参数要设置为包含 SPF_IS_XML。如:/ 选择语音库 Microsoft SampSpVoice-speak(L“鸡啄
14、米“, SPF_DEFAULT | SPF_IS_XML, NULL);/ 设置音量鸡啄米/ 设置语言鸡啄米804 代表中文,409 代表英文。如果用函数 SpGetLanguageFromToken 获取语言时,0x804 表示中文,0x409 表示英文。五.Microsofot Speech SDK 开发程序举例:CoInitialize(NULL); / COM 初始化CLSID CLSID_SpVoice;CLSIDFromProgID(_T(“SAPI.SpVoice“), ISpVoice *pSpVoice = NULL;IEnumSpObjectTokens *pSpEnumT
15、okens = NULL;/ 获取 ISpVoice 接口if (FAILED(CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_INPROC_SERVER, IID_ISpVoice, (void*)/ 列举所有的语音 token,可以通过 pSpEnumTokens 指向的接口得到if (SUCCEEDED(SpEnumTokens(SPCAT_VOICES, NULL, NULL, / 依次获取每个 token 并朗读字符串while (SUCCEEDED(pSpEnumTokens-Next(1, / 设置当前语音 token 为 pSpToke
16、npSpVoice-Speak(L“Hello Word 世界你好“, SPF_DEFAULT, NULL); / 朗读中文和英文的混合字符串pSpToken-Release(); / 释放 tokenpSpEnumTokens-Release(); / 释放pSpEnumTokens 接口pSpVoice-Release();:CoUninitialize();鸡啄米通过调试和朗读效果得出结论,Vista 和 Win7 上的 Microsoft Lili 语音库可以中英文混读,Microsoft Speech SDK 5.1 中的中文男声Microsoft Simplified Chines
17、e 语音库朗读英文的时候只能一个字母一个字母的读,Anna、Mike、Sam 只能读英文,中文略过。那么 Microsoft Simplified Chinese、Anna、Mike、Sam 怎样实现中英文混读呢?鸡啄米告诉大家,可以修改字符串,加入 XML 标记,将中文和英文分别处理,上面程序中 的字符串可以修改为:L“Hello Word 世界你好“。这样当前语音库不能读的语言会自动选择同性别的其他语音来读。六.如何制作 SAPI 组件安装包SAPI 开发的程序想要正常运行,必须保证计算机上安装了 SAPI 组件,所以我们的软件发布时最好同时发布 SAPI 核心组件的安装程序,如果需要安装
18、新的语言,还要有语言模块。这就需要用到讲 SDK 下载时提到的SpeechSDK51MSM.exe。SpeechSDK51MSM.exe 安装完以后会生成三个文件夹:1033、1041 和2052。其中,1033 下主要是用于英文的 TTS 和 SR 的.msm 文件,1041 下主要是用于日文 SR 的.msm 文件,2052 下是用于中文 TTS 和 SR 的 msm 文件。我们要开发 的是 TTS 程序,所以不需要 SR 的相关文件。英文 TTS 需要包含 1033 下的这些文件:Sp5.msm、Sp5Intl.msm、Sp5itn.msm、 Sp5TTInt.msm、SpCommon.
19、msm,如果需要 Mike 和 Mary 的语音还需Sp5TTIntXP.msm 文件。如果还要支持中文 TTS 则需再包含 2052 下的文件:Sp5Intl.msm、Sp5itn.msm、SP5TTINTr.msm。仍以 VS2010 为例,安装包制作的具体过程如下:1.选择 File-new-project,弹出 New Project 对话框,在左侧面板中的 Installed Templates 下展开 Other Project Types,继续展开起子节点Setup and Deployment,最后选择 Visual Studio Installer,右侧面板中选择 Setup
20、 Project,最后在对话框下部,设置好名称和路径点“OK”就生成工程了。对于没有集成 Visual Studio Installer 的老版本的编译器,可以在网上下载 Microsoft Visual Studio Installer。2.在 Solution Explorer 中的工程名上点右键,然后在右键菜单中选择Add-Merge Module,最后在弹出的对话框中选择上面提到的所要包含的.msm文件即可。3.编译运行工程,若是 Debug 模式则会在工程目录的 Debug 文件夹下生成相应的 msi 文件,若是 Release 模式则会在 Release 目录下声称 msi 文件。SAPI 安装包到此就制作好了,我们也可以将我们的应用程序 exe 文件也一同打到安装包里。这样运行安装程序后就会将应用程序和 SAPI 组件都装到目标主机里,应用程序可以直接运行。关于 Windows TTS 语音引擎编程入门的知识鸡啄米就总结完了,大家可以继续探索,开发出各种有趣的语音程序。