admin管理员组

文章数量:1530246

2024年7月15日发(作者:)

我们都使用过一些某某词霸的英语学习工具软件,它们大多都有朗读的功能,其实这

就是利用的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/?id=10121。

根据微软下载说明,有几点需要注意:

1.如果你想下载例子程序、文档、SAPI和用于开发的美国英文语音引擎,请下载

2.如果你想使用日文和简体中文引擎用于开发,请下载和

3.如果你想将语音引擎集成到你的产品跟产品一起发布,就下载

4.如果你仅想获得XP系统下的Mike和Mary语音,就下载。

5.如果你只想要文档请下载。

下载完成后可先安装引擎,再安装中文语言补丁包

,这样就可以使用其中的中 文男声语音库了。如果想要在

Vista或Win7系统下使用Mike、Mary和Microsoft Simplified Chinese中文男声语音

库也可以下载相应的文件安装。

三.VC++环境配置

如果是在XP系统下开发,先安装再安装

,假设安装路径为默认的 C:Program FilesMicrosoft

Speech 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和

VC6.0可以按照各自的方法设置。

最后,在程序中使用语音引擎以前包含头文件和lib库:

#include "sapi.h"

#include "sphelper.h"

#pragma comment(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();

这样资源被释放,语音朗读过程结束。

以上就完成了一个简单的语音合成朗读的功能。

ce的成员函数

鸡啄米再简单说明几个ISpVoice接口的成员函数:

HRESULT Speak(LPCWSTR *pwcs, DWORD dwFlags, ULONG

*pulStreamNumber);

用于读取字符串pwcs里的内容。参数pwcs为要朗读的字符串。dwFlags是用于

控制朗读方式的标志,具体意义可以查看文档中的枚举 SPEAKFLAGS。

pulStreamNumber为输出参数,它指向本次朗读请求对应的当前输入流编号,每次朗读

一个字符串时都会有一个流编号返 回,异步朗读时使用。

HRESULT SetRate( long RateAdjust); // 设置朗读速度,取值范围:-10

到10

HRESULT 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到100

HRESULT 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 Sam

pSpVoice->speak(L"鸡啄米",

SPF_DEFAULT | SPF_IS_XML, NULL);

// 设置音量

鸡啄米

// 设置语言

鸡啄米

804代表中文,409代表英文。如果用函数SpGetLanguageFromToken获取语言

时,0x804表示中文,0x409表示英文。

五.Microsofot Speech SDK开发程序举例

::CoInitialize(NULL); // COM初始化

CLSID CLSID_SpVoice;

CLSIDFromProgID(_T("e"), &CLSID_SpVoice);

ISpVoice *pSpVoice = NULL;

IEnumSpObjectTokens *pSpEnumTokens = NULL;

// 获取ISpVoice接口

if (FAILED(CoCreateInstance(CLSID_SpVoice,

CLSCTX_INPROC_SERVER, IID_ISpVoice, (void**)&pSpVoice)))

{

return -1;

NULL,

}

// 列举所有的语音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为

pSpToken

pSpVoice->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只能读英文,中

文略过。

那么Microsoft Simplified Chinese、Anna、Mike、Sam怎样实现中英文混读呢?

鸡啄米告诉大家,可以修改字符串,加入XML标记,将中文和英文分别处理,上面程序中

的字符串可以修改为:L"Hello Word

世界你好"。这样当前语音库不能读的语言会自动选择同性别的其他语音来读。

六.如何制作SAPI组件安装包

SAPI开发的程序想要正常运行,必须保证计算机上安装了SAPI组件,所以我们的

软件发布时最好同时发布SAPI核心组件的安装程序,如果需要安装新的语言,还要有语

言模块。这就需要用到讲SDK下载时提到的。

安装完以后会生成三个文件夹:1033、1041和2052。

其中,1033下主要是用于英文的TTS和SR 的.msm文件,1041下主要是用于日文SR

的.msm文件,2052下是用于中文TTS和SR的msm文件。

我们要开发 的是TTS程序,所以不需要SR的相关文件。英文TTS需要包含1033

下的这些文件:、、、 、

,如果需要Mike和Mary的语音还需文件。如果还

要支持中文TTS 则需再包含2052下的文件:、、

仍以VS2010为例,安装包制作的具体过程如下:

1.选择File->new->project,弹出New Project对话框,在左侧面板中的Installed

Templates下展开Other Project Types,继续展开起子节点Setup and Deployment,

最后选择Visual Studio Installer,右侧面板中选择Setup 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语音引擎编程入门的知识鸡啄米就总结完了,大家可以继续探

索,开发出各种有趣的语音程序。

本文标签: 语音朗读引擎需要