我们都使用过一些某某词霸的英语学习工具软件,它们大多都有朗读的功能,其实这就是利用的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,下载地址为:www.microsoft/download/en/details.aspx?id=10121
      根据微软下载说明,有几点需要注意:
      1.如果你想下载例子程序、文档、SAPI和用于开发的美国英文语音引擎,请下载。
sdk       2.如果你想使用日文和简体中文引擎用于开发,请下载和。
      3.如果你想将语音引擎集成到你的产品跟产品一起发布,就下载。
      4.如果你仅想获得XP系统下的Mike和Mary语音,就下载。
      5.如果你只想要文档请下载sapi.chm。
      下载完成后可先安装引擎,再安装中文语言补丁包,这样就可以使用其中的中 文男声语音库了。如果想要在Vista或Win7系统下使用Mike、Mary和Microsoft Simplified Chinese中文男声语音库也可以下载相应的文件安装。
       三.VC++环境配置
       如果是在XP系统下开发,先安装再安装SpeechSDK51LangPach.e
xe,假设安装路径为默认的 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到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    *pulStr
eamNumber);
      // 将声音输出到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"<VOICE REQUIRED='NAME=Microsoft Sam'/>鸡啄米", SPF_DEFAULT | SPF_IS_XML, NULL);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。