用技术‘ 文章编号:1674—9146(2016)12—0084—04 语音台成技术的I1】能设计和实现 韩超 (山西新闻出版广电局无线管理中心7402台,山西 昔阳045300) 械耍 筏要贪鳃7 S0K ̄g SAeX通 _裁玛示馘懒介绍 ISpV0iee接口的讯硪步骤和絮 飘方法 基专 \ 设诗妥现飞语音阈谖畚跷及实 k许 阚进飞。该轶译妥现她王要葫能。试论弋语普接镳诵礴的 4令类和闵读电容的存储方式 “ 。 |一 0 关键强 s 中圈 号 ;sA矾 乱孥 c 语莆合氓|I| 12.33≮TP317.52 ll 文献书 志码:Aj cIoI 1o0l969/j issr 1674_9l46;2016A2:084 1 语音合成技术简介 目前。语音合成技术已经十分广泛地应用到了 现在,随着电脑的普及和互联网的广泛应用, 网络上的资源越来越丰富、越来越全面,越来越多 爱好读书的人将目光从以前的纸制书本投向了电子 书籍,这不仅节省了寻找书本的时间,而且节省了 各个领域上。语音合成技术比较成熟的有美国微软 公司、我国科大讯飞公司等,其中微软已经公布了 部分语音合成及识别所调用的函数和相应的调用文 档,现在市面上一般的语音方面的产品也主要以微 软提供的SDK为根本。因此笔者以微软的SDK为 例,讲述如何完成文本到语音的转换。 2 SDK和SAPI 读书的开支。可是,问题也随之而来,长时间使用 电子设备看书对人们的视力影响极其不好,越来越 多的年轻人早早地戴上了厚厚的近视镜。如果有一 种方法,既能满足人们阅读网络上种类齐全、价格 便宜的电子书籍,又能很好地保护人们的视力。该 有多好。 2.1 SDK简介及其配置 Microsoft Speech SDK(微软标准语音开发工 具)是微软公司为开发Windows平台上的语音应用 利用语音合成就能满足人们的这个需求。语音 合成就是人T通过一定的机器设备产生出语音,它 是人机语音通信的重要组成部分。语音合成研究的 目的就是制造一种会说话的机器,解决的就是如何 能够让机器像人那样说话的问题,使一些以其他方 程序而提供的软件开发包,它主要兼容了Win32的 语音应用程序编程接口(Speech Application Pro— gramming Interface,SAPI)、编译和调试语音应用程 序的工具以及帮助文档。目前几乎所有的文本朗读 1=具都是使用这个SDK开发的,语音合成已经在 一式表示或者存储的信息能够转换成语音,让人们通 过听觉而方便地获得这些信息l1l。 现在,科学家们已经搜集并录制了大量的不同 语种的单词和词汇到合成的语音库中,一些技术成 熟的公司已经将所需的关键技术点封装成函数供语 音开发人员调用,编程开发人员只要掌握了调用该 函数的方法和相关的注意事项,通过相应的SAPI 接口正确调用函数就能够完成文本到语音的转换翻。 定程度上得到了广泛使用13J。 Microsoft Speech SDK可以在微软的官方网站上 免费下载,目前的版本是5.1,为了支持中文或者 其他语种如日文,还要把附加的语言包(Lang— Pack)一起下载。然后安装Microsoft Speech SDK version 5.1后在C:\Profram Files\Common Files\Mi— crosoft Shared\Speech目录下找到sapi.dl1.并将sapi. du复制到项目文件下。还有一种方法是使用向导将 收稿日期:2016-10一l0;修回日期:2016—1 1-15 作者简介:韩超(1990一),男,山西昔阳人,在读硕士,助理工程师,主要从事电子与通信工程研究 E~mail:hanchaol31@163.COIl1。 SCIi-TECH INNOVATION&PRODUCTIVITY 。’~…… 一 一084一 N l2Oec・2016,Total No.275 应用技 sapi.1ib手动添加到项目中去,如果下载不到sapi. //获取ISpVoice接口,接口指针存人pVoice中 HRESULT hr=CoCreateInstance(CLSID——SpVoice, NULL, dl1.可以采用添加sapi.1ib的方式下面介绍的例子 都是采用第二种方式,注意只有正确配置SDK才 能完成文本到语音的成功转化[41。 2.2 SAPI简介 SDK提供的Speech API(SAPI)的两种基本类 型是API for Text—to—Speech和API for Speech Recog— CLSCTXALL, ——IIDISpVoice, ——(void料)&pVoice); 读出”This is a system which can speak your text” , nition。其中API for Text—to—Speech就是文本语音 转换(Text To Speech,TTS)引擎,,rI’S可以将文 if(SUCCEEDED(hr)) 本中的字符或者文档合成为语音并“说”出来,通 过它可以很容易地建立功能强大的文本语音程序I5l。 应用程序可以通过ISpVoice COM接口控制使 用TTs。应用程序一旦建立了ISpVoice对象,它只 需调用ISpVoice::Speak来从文本数据生成语音。 另外.ISpVoice接口同样提供了多种方式来改变程 序所发出的声音、音调和其他属性,例如Is— pVoice::SetRate改变语音速度.ISpVoice::SetVol— ume改变语音音量等[61。 除了ISpVoice接口之外。SAPI同样提供更多 的高级1Trs应用——通过手动控制COM接口。 3 ISpVoice接口详解 3.1 ISpVoice接El调用步骤 ISpVoice是COM标准提供的一组对语音操控的 接口.它是由微软架构在COM之上的SAPI实现 的。调用ISpVoice接口大致分为5个步骤:一是初 始化COM(由于ISpVoice是COM标准中提供的接 口);二是获取指向ISpVoice接口的指针;三是通 过该指针控制,rrS引擎;四是释放指针;五是关闭 COM接口 。 3.2 ISpVoice接口调用代码示例 下面这段代码示例就是为了让大家更清晰更具 体地了解如何获取ISpVoice接口指针,并利用其操 作SAPI中的rrrS(文本合成语音)引擎,同时作为 初学者也可以在这个基础上练习如何使用此接口。 #include<sapi.h> //Colnitialize CoCreateInstance需要调用ole32.dll #pragma comment(1ib,”ole32.1ib”) Esapi.1ib在SDK的lib目录,必须正确配置 #pragma comment(1ib,”sapi.1ib”) int main(int argc,char argv[】) { //ISpVoice接口类型指针 ISpVoice pVoice=NULL; //COM初始化 if(FAILED(::CoInitialize(NULL))) return FALSE; { hr pVoice一>Speak(L”This is a system wh— ich can speak your text”,0,NULL); pVoice一>Release(); pVoice=NULL; } ,/千万不要忘记关闭COM接口 ::CoUninitialize(); return TRUE; ) 注意:一定要先释放指针,然后再关闭COM 接口,否则程序很有可能会发生崩溃。 3.3 IspVoice接口常用方法 成功调用ISpVoice接El后,接下来就可以使用 ISpVoice的主要函数控制语音阅读了.下面给出的 是ISpVoice的几种常用控制方法[8-91。 SetVoice():设置综合文本所使用声音的特 性。默认时,ISpVoice可以使用控制面板里面的语 言属性来进行设置里面的设定。 Speak():阅读文本或文档的内容,其中它的 第二个参数可以设置为同步或者异步,两者的主要 区别在于,同步不可以实现对语音的适时控制,而 异步则可以实现对语音的适时控制,大多数程序使 用的都是异步方式。 SetRate():设置实时阅读速度。 SetVolume():设置实时阅读音量。 SetVoice():设置发音人。 GetStatus():获取当前所读状态信息。 Pause():暂停发音。 Resume():恢复发音。 4语音阅读的实现 笔者基于微软Speech SDK中的SAPI内rrrS引 擎.设计实现了语音阅读系统及其软件。TTs引擎 可以根据输入的字符串自动合成与之相对应的语音 并输出。该语音阅读系统能够将接收到的文字(AN— sI或UNICODE标准)串或者字符串传人引擎内来 科拮刨葡与生产力l 2016 ̄-12月 警第 期一J一085— 用技术衄 完成文本到语音的转换。该语音阅读系统的界面开 发应用微软基础类(Microsoft Foundation Classes, MFC)完成 IOq2l。 该语音阅读软件主要实现对输入字符或从电脑 上载人的文本文档等进行汉语、英语、日语以及混 合发音的阅读,并且可以随意切换发音人,调节阅 读的语音音量和语音速度,还可以将音频保存到 WAV文件中 I 4.1 主要功能 要实现一款好的语音阅读软件.只是能够实现 文本到语音的转换是远远不够的,还需要具备其他 多种功能。图1为笔者设计的语音阅读软件的主要 功能 图1 语音阅读软件的主要功能 笔者设计的软件使用的主要开发工具是Mi— t.r( fl Visual Studio 2010,如果没有此开发系统, 也町以使川Microsoft Visual Studio 2008或者Vc++ 6.0进行开发,使刖MFC模式,建立基于对话框的 T程 4.2相关类介绍 语音I列读实际上就是对语音接口的成功调用, 之卡H关的主要行3个类:CSAPIWrapper, CSAPI4Wtapper和CSAPI5Wrapper。还有一个比较 重要的类川CSpeecbCoul ̄・oJlet类,以下对这4个类 分别予以介绍 4.2.1 CSAPI4Wrapper椰CSAPI5Wrapper 南l『CSAPl4Wrapper和CSAPI5Wrapper这两个 类结构相似,所以在这里将它们一并介绍,它们的 别在于第一个类使用的是SAPI4.其对TTS引擎 的渊用没有像SAPI5那样的方便.最主要应用到的 接口有I3TSCentral和ITTSAttributes.下面先来看 一看他们的相同点 它们都采用异步方式对文档内容进行阅读,以 便能够在阅读的同时对语音等进行控制.主要包含 以下操作 SpeakText():渎ff:输入的文本。 StopSpeak():停止读文本。 PauseSpeak():暂停读文本。 ResumeSpeak():恢复读文本 } SCI_TECH INN0vAT10N&PR0DUCTIVITY 2 一 一 No・12 Dec.2016,Total No.275 SetVolume():设置声音大小。 SetRate():设置语速。 ChangeVoice():改变发音者。 以上方法都是在CSAPl5Wrapper通过Is— pVoice*类型的成员变量m_pVoice指针来调用 SAPI5的rIYI、S引擎来实现发音的。而对于CSAPI4 Wrapper则略有不同。它需要调用多个接口。主要 有ITTSCentm】和ITrSAttributes。 通过ITl'SCentral接口可以控制1TrS引擎的阅 读、暂停等功能,主要包含以下操作。 TextData():读文本。 AudioPause():暂停。 AudioResume():恢复。 AudioReset():停止。 通过ITTSAttributes接口可以调用TTS引擎的 音量、语速等控制功能,主要包含以下操作。 SpeedSet():设置语速。 VolumeSet():设置音量。 4.2.2 CSAPIWrapper 它涵盖了以上两个类的所有操作,其作用就是 将操作细节封装起来,让对它的使用变得更方便而 不用在意下面是如何运行的。它对两个SAPI的集 成是通过一个枚举类型WRAPPERTYPE作为其私 有变量来完成的,当WRAPPERTYPE等于SAPI4 时则调用CSAPI4 Wrapper对象的方法,否则调用 CSAPI5 Wrapper对象的方法。 4.2.3 CspeechC0ntroller 这个类位于逻辑控制层,它提供了用户界面对 语音控制所需要的所有接口,其最重要的成员变量 就是CSAPI Wrapper对象m_cSAPIWrapperObj,该 对象会提供具体的执行动作。这个类主要包含以下 操作。 Play():播放。 Pause():暂停。 Resume():恢复。 Stop():停止。 ChangeAnn0uncer():变换发音人。 SaveFile():保存文件。 这个类会把用户进行的操作通过m_cSAPI— WrapperObj转换成具体的底层操作,转换过程都在 各个成员函数内部中进行。具体示例如下。 void CSpeechContr0ller::ChangeAnnouncer (int enTy— 应用技Il l pe) { m—cSAPIWrapperObj.StopSpeak(); cSAPIWrapperObj.ChangeVoice(enType); 开发中的工作。 4)分别讲述了语音合成开发语音方面的软件 使用的基本类和类中包含的函数以及该函数的功 能,进一步使读者了解了语音合成。 参考文献: m—return; ) [1】 王炳锡,王洪.变速率语音编码[M】.西安:西安电子科技大 该函数就把用户需要的变换发音人的操作转换 成了停止发音和设定新的发音人两个操作。这个类 学出版社,2004. 【2J刘幺和,宋庭新.语音识别与控制应用技术【M】.北京:科学 出版社.2008. 是为了联系上层界面和连接底层语音控制而设计 的.它与底层具有一对一的聚集关系。 4.3阅读内容的存储方式 笔者把阅读的内容存储在一个CString类型的 向量容器vector中.因为无论是CString还是vector [3】Moulines Eric.Charpentier Francis.Pitch—synchronous wav— eform processing techniques for text——to——speech synthesis us—— ing diphones[J].Speech Communication.1990(9):1—10. 【4】Sleepwom.VC使用TTS发声[EB/OL].[2010—05—18]. http://www.cppblog.com/sleepwom/archive/2010/05/18/ 1 15742.htm1. 都是通过动态分配内存存储的自动管理,所以不必 过分关注内存组织或异常情况。把每一次打开的文 件内容都先加载到一个临时CString中再存人vector 内并将其显示在主界面文本框中,在每一次重新读 文本时,都会用文本框的内容刷新当前所读CString 并换掉vector中相应位置元素。这样就实现了对文 本的修改与读音同步。这种存储方式不仅对文档的 内容进行了存储,还轻松地实现了对所加载的多篇 文档进行切换【 。 5结束语 【5]王立峰,梁智颖.微软产品集成[M].北京:科学出版社,2005. f61 杨家沅.语音识别与合成fM】.成都:四川科学技术出版社, 1994. 【7] 潘爱民,刘彤.COM原理与应用[M】.北京:清华大学出版 社,2002. 【8] 党建成,周晶.语音合成技术及其应用 计算机与信息技 术,2007(6):31—33. 【9] Microsoft Corporation.Microsoft Windows SDK orf Win— dows 7 and.NET Framework 4【EB/O L1.【2016—01—011. http://www.microsoft.corn/an—us/download/details.aspx? id=8279. 鉴于语音合成技术的广泛应用,笔者以微软的 SDK为例,为编程开发人员或者有一定软件相关基 础的初学者讲述了开发文本到语音转换相关系统的 些基本知识,设计了语音阅读系统的基本功能框 架。笔者的主要工作和成果如下。 一[1O】 赵常寿,昊红权,张玉忠.Vc++开发基于Microsoft Spee— ch SDK的TTS软件U]_电脑编程技巧与维护,2013(19): 13—18. [11】韩忠军..NET平台下SAPI语音接口的c#开发与应 用U].实验室研究与探索,2010(8):175—179. [12】 张艳.基于MFC平台下的语音识别系统的设计 电脑 与电信.2010(3):53—55. 1)讲述语音合成技术使用的SDK工具以及相 应接口。 2)列举文本到语音转换时经常用到的相应的 接口和相关的函数.使读者基本了解到要使用语音 合成开发语音方面的软件基本要做的工作。 3)设计语音阅读系统的基本功能框架。方便 读者根据股票功能框架了解基本的技术点,减少了 [13】 吴振宇.个性特征的语音合成与模拟技术研究【D】.上海: 华东师范大学,2011. [14】 Stanley B,Lippman Barbara E,Moo Jos∈e LaJoie.c++ Primer中文版 】.李师贤,译.4版,北京:人民邮电出版 社.2006. (责任编辑邸开宇) Functional Design and Implementation of Speech Synthesis Technology Han Chao (Wireless Administration Center 7024 Radio,Shanxi Administration of Press,Publication,Radio, Film and Television,Xiyang 045300 China) Abstract:This paper briefly introduces the speech synthesis technology,SDK and its configuration,SAPI.It introduces the steps and methods of invoking ISpVoice interface through code example,designs the voice reading system and software based on TTS engine.Then it describes the main functions of the software,discusses four classes of invoking voice interface and the storage mode of reading contents. Key words:Speech SDK;SAPI;TTS engine;MFC;speech synthesis 科接翻蕊与生产力f 2016#-12月总管27s翘一j—D8 —