我们都使用过一些某某词霸的英语学习工具软件,它们大多都有朗读的功能,其实这就是利用的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,下载地址为:http://www.microsoft.com/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:\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     *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"<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为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"<lang langid='409'>Hello Word</lang> <lang langid='804'>世界你好</lang>"。这样当前语音库不能读的语言会自动选择同性别的其他语音来读。

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

SAPI开发的程序想要正常运行,必须保证计算机上安装了SAPI组件,所以我们的软件发布时最好同时发布SAPI核心组件的安装程序,如果需要安装新的语言,还要有语言模块。这就需要用到讲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.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 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语音引擎编程入门的知识鸡啄米就总结完了,大家可以继续探索,开发出各种有趣的语音程序。

原文地址:微软TTS语音引擎编程入门

微软TTS语音引擎编程入门相关推荐

  1. C#使用微软TTS语音引擎实现文字转语音示例

    转载:http://www.mzwu.com/article.asp?id=3845 在VS2012创建Windows窗体应用程序项目,添加引用COM组件Microsoft Speech Object ...

  2. 【VC++技术杂谈004】使用微软TTS语音引擎实现文本朗读

    本文主要介绍如何使用微软TTS语音引擎实现文本朗读,以及生成wav格式的声音文件. 1.语音引擎及语音库的安装 TTS(Text-To-Speech)是指文本语音的简称,即通过TTS引擎把文本转化为语 ...

  3. win7 微软语音服务器,win7 TTS修复工具(微软tts语音引擎修复)

    [实例简介] 当系统没有语音功能,无法运行时,使用win7 TTS修复工具(微软tts语音引擎修复) 现有的语音不好时,可心安装第三方语音,如:捷通华声 XiaoKun 女声 中英文.女音库Hui.L ...

  4. 微软TTS语音引擎(中文)5.1

    微软TTS语音引擎(中文)5.1 转自某人下载页的,早晚得用到,先收藏了. 下载地址:http://download.csdn.net/source/1278844 ================= ...

  5. TTS什么意思,缩写,微软TTS语音引擎(中文)5.1 “TTS”是“文本到语音(Text To Sound)”的简称

    微软TTS语音引擎(中文)5.1 "TTS"是"文本到语音(Text To Sound)"的简称,TTS语音引擎为我们提供清晰和标准的美语发音.TTS5.1目前 ...

  6. PhysX物理引擎(编程入门)

    PhysX物理引擎(编程入门) --PhysX,Hello World! Author: 华文广   E-MAIL: huawenguang@sina.com  DATE:06/7/20 Hi,大家好 ...

  7. 小米tts语音引擎下载_TTS语音模块:XFS5152CE语音合成模块详解

    TTS是Text To Speech的缩写,即"从文本到语音",是人机对话的一部分,让机器能够说话. 语音播报功能的实现方式 TTS语音模块,比如XFS5152.SYN6288等 ...

  8. 讯飞tts语音引擎9.0_使用科大讯飞语音转文字的服务进行电话录音分析

    # 需求 合规性质检:1)设定规则,实现自动质检,自动打分:2)如VOC文本质检可与语音文字进行匹配,自动判断是否合格:3)新媒体文本可自动质检4)可识别异常录音(指定标准外):5)诉求记录与语音内容 ...

  9. 微软的语音太逼真了,用来听小说舒服了

    苏生不惑第344 篇原创文章,将本公众号设为星标,第一时间看最新文章. 2020年分享过如何轻松的将文字转语音 ,今天说说微软的文字转语音,真的太逼真了,话说微软的edge浏览器很早就有大声朗读功能: ...

最新文章

  1. Java stackoverflowerror异常与outofmemoryerror异常区别
  2. js控制 html.textboxfor,javascript - Html.TextBoxFor regex is not working - Stack Overflow
  3. 课时105.边框属性下(掌握)
  4. typescript或javascript深拷贝Object json
  5. C++ static静态成员变量
  6. 面试题:判断字符串是否回文
  7. myeclipse的优化
  8. 36岁青椒的“我”想对26岁读博的“你”说些话
  9. 认证Authentication
  10. 双重差分法之PSM - DID
  11. 简易波形发生器通过单片机的Proteus仿真
  12. [论文笔记]Vision-based Control of 3D Facial Animation
  13. 目标检测——手把手带你实现SSD(Single Shot MultiBox Detector)训练和检测自己的数据集
  14. Android Studio 个性化主题配置。
  15. 免费的微信签到抽奖——微信大屏幕
  16. 薛兆丰经济学思维研究:权利在真实生活中的硬度
  17. photoshop CC制作gif动图
  18. 如果我是pm之 演出电影vr购票展示
  19. Android KaptExecution:Annotation processors discovery from compile classpath is deprecated
  20. Linux oracle 数据导出导入步骤:

热门文章

  1. 简单的记账方法有哪些?
  2. Intel(Altera)FPGA的SOF转JIC文件和下载详细教程
  3. MYSQL No space left on device
  4. matlab机器人,MATLAB机器人可视化
  5. php 截取取最后一个字符
  6. Spinner的setOnItemSelectedListener(
  7. AutoHotKey写一个改键的小脚本
  8. 学生信息管理系统 C++实现
  9. 软件质量与测试--第六周作业 软件测试与评估
  10. 21-4-21 USB接口