转自: http://blog.sina.com.cn/s/blog_4ab4a08d01009uch.html~type=v5_one&label=rela_prevarticle
摘 要:TTS技术已经越来越广泛地应用到现代计算机的各个领域,本文介绍了利用微软的Microsoft Speech SDK 5.1提供的TTS(text-to-speech)技术开发具有语音朗读功能的应用程序。
关键字:语音合成;TTS;发声引擎
中图分类号:TN912.33;TP311.52 文献标识码:A
Create speech-enableed Apllications with TTS Technology
Abstract: The TTS technology is more and more popular in modern computer, this article introduces How to Create speech-enableed Apllications use the Microsoft Speech SDK 5.1
Key word: Speech Synthesis;TTS;speech Engine
1.TTS技术概述
上世纪90年代中期以来,随着个人计算机的硬件和软件功能越来越强,和现代语音技术的发展,以前在科幻电影中才能看到的会说话的电脑已经成为现实。而TTS技术正是电脑能够说话的关键技术之一。
TTS是text-to-speech的缩写,英文也称Speech Synthesis即语音合成。语音合成就是一个将文本转化为语音输出的过程,这个过程的工作主要是将输入的文本按字或词分解为音素,并且对文本中的数字、货币单位、单词变形以及标点等要特殊处理的符号进行分析,以及将音素生成数字音频然后用扬声器播放出来或者存为声音文件以后用多媒体软件播放。
当应用程序需要发声的时候就调用语音合成引擎(SPEECH SYNTHESIS ENGINE)进行语言合成,将文本处理后通过扬声器用近似于人的声音“读”出来,通常还可以通过改变对语音引擎的设置改变“说话” 的速度,声音频率(低沉或者尖锐),声音大小,还能模拟口形、唇形和舌位的变化对声音的影响。面前计算机通过语音合成发出的声音效果听起来就象是录音磁带发出的声音。
与一些用预先录制的声音文件实现发声的应用程序相比,TTS的发声引擎只有几兆大小,不需要大量的声音文件支持,因此可以节省很大的储存空间,并且可以朗读预先未知的任何语句。现在已经有许多应用软件应用TTS技术实现语音功能,例如一些播音软件可以用来读小说或作校对工作,还可以朗读电子邮件,一些电子词典可以读出单词,还可以用于查询中心自动播放服务信息等。
2.关于Microsoft Speech SDK
实现TTS的核心技术本身是非常复杂的,不是一般开发人员所能完成的,但是有了
Microsoft Speech SDK这样的工具的帮助,只需要在应用程序中加入一些不太复杂的命令和操作,我们就可以创建具有TTS功能的应用程序了。
国内外有许多高科技公司和科研机构致力于TTS技术的开发和研究,如微软公司、IBM公司以及国内的科大迅飞公司都有较成熟的语音产品,并且任何人都可以获得微软公司免费提供的语音软件开发工具:Microsoft Speech SDK。
目前的Microsoft Speech SDK已经有4.0,5.1等几个版本,最近还推出了适合网络语音程序开发的The Microsoft Speech Application SDK的测试版,这些SDK主要包括语音应用程序编程接口SAPI(SAPI使我们象使用windows API一样方便地在程序中使用语音功能)和微软语音识别引擎和微软语音合成引擎,还提供了进行应用设计的例子。Microsoft Speech SDK 5.1 提供了英文和中文两种TTS引擎,即可以用它开发朗读中文和英文的应用程序,非常适合中国的开发者使用。
利用这些SDK,开发人员可以很容易地把TTS技术集成到应用软件中,并可以自由发布。另外Microsoft Speech SDK还提供了详细的文档帮助开发者进行程序开发。
3.实现TTS的条件准备
利用Microsoft Speech SDK进行TTS语音应用程序开发前要作一些软件和硬件的准备:
1) 去http://www.microsoft.com/speech/下载Microsoft Speech SDK 5.1或其它版本SDK,并且安装到自己的机器上。
2) Microsoft VC++ 6.0 ,service pack 3 或更新的版本。
3) 声卡和喇叭
4) 要实现该SDK的全部功能,则去http://www.microsoft.com/msdownload/platformsdk下载新的Platform SDK。
另外要注意的是SAPI 5.1不支持windows 95。
4.在应用程序中实现TTS功能
微软SAPI 5.1实现text-to-speech的核心是对COM接口IspVoice的应用,所以应用TTS技术最好要了解一下COM编程技术,但是即使从来没有用过COM编程,只要按照SDK的示例,也可以顺利的实现TTS的功能。
SAPI 的API接口封装得很好,我们不需要了解任何发声引擎底层的工作细节。例如一旦在程序中创建了一个IspVoice对象,就可以通过调用ISpVoice::Speak实现文本朗读,通过调用ISpVoice::SetRate实现对朗读速度的控制,以及通过调用ISpVoice::SetVoice实现对朗读声音的不同人物或语言控制(男声/女生,中文/英文)等。事实上掌握对这个接口的应用就可以实现大多数TTS的应用。
在下面介绍的程序中,用VC++6.0实现了Text-to-Speech的应用。
(1)创建一个工程
建立一个工程,Projects选项卡中选择MFC AppWizard (exe);下一步中选择Dialog based类型。
(2) 设置SAPI路径
应用TTS必须用到头文件sapi.h和sapi.lib,为了能编译通过必须设置SAPI路径:
a. 在选中tools菜单中的option子项。
b. 选中Directories选项卡。
c. 选中Show directries for列表框中选中include files项,并在Directories中添加sapi头文件路径:例如:"C:\Program Files\Microsoft Speech SDK 5.1\Include".
d. 选中Show directries for列表框中选中Library files项,并在Directories中添加sapi LIB文件路径:例
(3) 设计程序界面
添加如图所示的编辑框和命令按钮。
图2 程序界面
(4) 添加代码
双击speak按钮,添加朗读代码:
void CExe1Dlg::Onspeak()
{
UpdateData();
// 2) SAPI voice
ISpVoice * pVoice = NULL;
// 1)初始化COM
if (FAILED(CoInitialize(NULL)))
{
AfxMessageBox("Error to intiliaze COM");
return;
}
// 2)初始化SAPI
HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL,
CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);
if( SUCCEEDED( hr ) )
{
// 3)朗读编辑框中的文字
hr = pVoice->Speak(m_mytext.AllocSysString(), 0, NULL);
//完成发声后可以将声音对象释放
pVoice->Release();
pVoice = NULL;
}
// 1)与CoInitialize(NULL)成对使用,释放COM
CoUninitialize();
}
注:m_mytext是编辑框的变量名。
以上的代码中主要做了几件TTS最基本的事情:
1) 初始化COM ,因为SAPI是基于COM的应用,使用之前必须首先初始化COM。
2) 创建voice对象,即一个COM对象。
3) 实现朗读,即调用speak方法。
另外必须把头文件sapi.h加到前面:
#include <sapi.h>
编译通过后就可以运行程序了,在编辑框中输入一段文字,按speak按钮,我们就能听到电脑读出的令人兴奋的声音了。
Microsoft的TTS引擎提供了4种朗读文字的声音,其中三种英文声音:Mary(女),mike和sam(男)一种中文声音:simplyfied Chinese。因为默认的TTS引擎是英文发声,如果要想朗读中文或选择不同的人进行朗读,可以在朗读前调用ISpVoice::SetVoice方法进行声音的设定,或者在朗读前双击用控制面板中的语音图标(安装
Microsoft Speech SDK后自动添加的),选择文字-语音转换选项卡进行默认声音的设置。
如:"C:\Program Files\Microsoft Speech SDK 5.1\Lib\i386".
5.结束语
SPAI 5.1不仅适合用VC++进行开发,还可以用VB、c#等进行开发,具体方法可以参考SDK帮助文档。结合windows程序设计的其它技术,只要取得文本的内容,就可以实现对对word、IE、电子邮件等各种文字的朗读。
本人利用windows API剪贴板操作函数和模拟键盘的方法在朗读程序中实现了对任意文本内容的获取,包括IE、WORD、PDF等所有可以被鼠标选中的文本。另还外利用中英文内码的不同对所取得的文本进行中英文分析并按不同的语言分段,在朗读前利用ISpVoice::SetVoice方法进行中文或英文声音的设定,从而实现了中英文混合文本的朗读。合成这些方法和技术实现了一个电脑播音软件。
此外Microsoft Speech SDK 5.1的语音识别技术和语音识别引擎功能也很强大,可以用它开发具有语音识别功能的程序。
参考文献:
[1] Microsoft Corporation. MSDN Library Microsoft Corporation,2001-10
[2] Microsoft Corporation. Microsoft Speech SDK SAPI 5.1 Microsoft Corporation,2001
[3]Jagadish.G . Using Text to Voice Interfaces [EB/OL]. http://www.codeproject.com/audio/SpeakText.asp, 2002-09
[4]Agus Kurniawan. Simple Program for Text to Speech Using SAPI [EB/OL]. http://www.codeproject.com/audio/speech.asp ,2001-11