微软TTS语音引擎(speech api sapi)深度开发入门
- 格式:docx
- 大小:39.39 KB
- 文档页数: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.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英文女声语音库。
Microsoft lili支持中英文混读。
二.SAPI SDK的下载和安装如果是在XP系统下进行开发则需要下载Microsoft Speech SDK 5.1,下载地址为:/download/en/details.aspx?id=10121。
根据微软下载说明,有几点需要注意:1.如果你想下载例子程序、文档、SAPI和用于开发的美国英文语音引擎,请下载SpeechSDK51.exe。
2.如果你想使用日文和简体中文引擎用于开发,请下载SpeechSDK51.exe和SpeechSDK51LangPach.exe。
3.如果你想将语音引擎集成到你的产品跟产品一起发布,就下载SpeechSDK51MSM.exe。
4.如果你仅想获得XP系统下的Mike和Mary语音,就下载Sp5TTIntXP.exe。
5.如果你只想要文档请下载sapi.chm。
下载完成后可先安装引擎SpeechSDK51.exe,再安装中文语言补丁包SpeechSDK51LangPach.exe,这样就可以使用其中的中文男声语音库了。
如果想要在Vista或Win7系统下使用Mike、Mary和Microsoft Simplified Chinese 中文男声语音库也可以下载相应的文件安装。
三.VC++环境配置如果是在XP系统下开发,先安装SpeechSDK51.exe再安装SpeechSDK51LangPach.exe,假设安装路径为默认的 C:\ProgramFiles\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:\ProgramFiles\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"<VOICE REQUIRED='NAME=Microsoft Sam'/>鸡啄米", SPF_DEFAULT | SPF_IS_XML, NULL);// 设置音量<VOLUME LEVEL='90'>鸡啄米</VOLUME>// 设置语言<lang langid='804'>鸡啄米</lang>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); // 设置当前语音token为pSpTokenpSpVoice->Speak(L"Hello Word 世界你好", SPF_DEFAULT, NULL); // 朗读中文和英文的混合字符串pSpToken->Release(); // 释放token}pSpEnumTokens->Release(); // 释放pSpEnumTokens接口}pSpVoice->Release();::CoUninitialize();鸡啄米通过调试和朗读效果得出结论,Vista和Win7上的Microsoft Lili语音库可以中英文混读,Microsoft Speech SDK 5.1中的中文男声Microsoft Simplified Chinese语音库朗读英文的时候只能一个字母一个字母的读,Anna、Mike、Sam只能读英文,中文略过。