文本朗读器的设计与制作

文本朗读器的设计与制作



声音是携带信息的极其重要的媒体,是多媒体技术研究的一个重要的内容。而声音又包括人的话音、乐器声、动物发出的声音、及其产生的声音以及自然界声音。本实验设计一个文本朗读器,使计算机可以把文本转化为语音,即把文本内容朗读出来。这种技术有广泛的应用前景,比如IVR(Interactive
Voice
Response),电子政务,语音短信,以及计算机软件的语音交互。声音、图像、视频如果能够出现在软件的界面上,定为软件增色不少,增加界面的友好性。不少软件设计者花了很多时间在用户界面希望能做成更友好的界面,但未见有很大的改善。在软件编程中,要把界面做得更友好,声音是一种吸引用户的方式,特别是计算机能够根据文字朗读发声的程序。
文本朗读器,又称文语转换(TTS:
Text-To-Speech)系统,是语音合成技术的一个重要应用,其主要功能是把输入计算机的文本文件,通过扬声器朗读出来。一定的软硬件转换后由计算机或其他语音系统输出语音,并尽量使合成的语音有较高的可理解度和自然度。本实验通过可视化的编程语言,调用Microsoft公司开发出的语音合成引擎(TTS Engine),制作一个同时支持中英文的文语转换软件。
一、 实验目的:
通过本实验,能够学会利用Microsoft Visual C++和Visual
Basic两种高级语言编辑环境进行文本朗读器的设计与制作,并且能够理解语音在计算机中的表示方法以及计算机中文本转化为语音的基本原理。
二、 实验要求
1.硬件基本配置:
Intel Pentinum 级处理器;
256 M内存或更大;
VGA或更高分辨率显示器;
16位或更好的声卡和扬声器。
2.软件要求:
操作系统,Windows XP 或Windows 2000;
声卡、显卡驱动程序;
TTS引擎语音包。
3.实验学时:2小时。
4.熟悉掌握实验预备知识,能够理解TTS、SpeechAPI 、SpeechSDK等概念。
5.按照实验步骤认真完成实验,写出实验报告。
三、 实验预备知识
1. 语音合成技术简介
1.1语音编码的特性
声音在计算机中以数字的形式存储,通过声音数字化的编码之后,声音就可以以文件的形式存储在计算机中。声音数字化包括采样和量化,如图1-1所示。

图1-1 声音的采样和量化
语音波形有自己的特性,了解这些特性对声音数据的压缩编码、声音的识别、文本语音的转换都有很重要的意义。
当肺部中的空气沿着声道通过声门发出时,就产生了话音,压缩空气根据声门激励

声道滤波器。根据激励方式不同,发出的话音分成三种类型:
①浊音 (voiced sounds)
浊音是一种准周期脉冲激励所发出的声音,这种准周期脉冲是在声门打开然后关闭时中断肺部到声道的气流所产生的脉冲,浊音表现在音节上有高度的周期性。
②清音(unvoiced sounds)
清音是由不稳定的气流激励所产生的,这种气流是在声门处在打开状态下强制空气在声道里高速收缩产生的。
③爆破音(plosive sounds)
爆破音是在声道关闭之后产生的压缩空气然后突然打开声道所发出的声音。
虽然各种各样的话音都有可能产生,但是声道的形状和激励方式的变化相对较慢,因此话音在短时间周期里可以被认为是准定态的,也就是基本不变的,这是由于声门的准周期性的震动和声道的谐振所引起的。话音编码器就是企图揭示这种周期性,目的是为了减少数据率而又尽可能不牺牲声音的质量。
通常把已有的话音编码器分成以下三种类型:波形编译码器,音源编译码器,混合编译码器。一般来说,波形编译码器的话音质量高,但数据率也很高;音源编译码器的数据率很低,产生的合成话音的音质有待提高;混合编译码器使用音源编译码技术和波形编译码技术,数据率和音质介于它们之间。图1-2表示了这三种编译码器的音质与数据率

图1-2 普通编译码器的音质与数据率
1.2语音合成技术的基本原理
TTS是Text To Speech的缩写,也成为Speech Synthesis
即语音合成,语音合成技术是把文本文件通过一定的软硬件转换后由计算机或其他语音系统输出语音,并尽量使合成的语音有较高的可理解度和自然度。这个过程的主要工作是经输入的文本按字或词分解为音素,并且对文本中的数字、货币单位、单词变形以及标点等要处理的符号进行分析,以及将音素生成数字音频,然后用扬声器播放出来或者存为声音文件以后用多媒体软件播放。这一技术在人机对话、电话咨询、自动播音、助讲助读、语音教学等方面有着广阔的应用前景。
国内外对语音合成技术的研究有几十年的历史,有了一些成熟的系统被研发出来。“微软”、“IBM”、“Motorola”等大公司,投入了大量的物力财力进行语音合成技术的研究,陆续出现了英语、日语、汉语、西班牙语等语种的TTS商品。例如,微软公司开发的TTS引擎以及SapiSDK语音应用开发工具包,对语音合成技术提供了强有力的支持,本实验也是在计算机中,以微软的语音合成技术为基础,制作一个会发音的文语转换软件。
语音合成技术的实现依赖于各种规则,包括语义学规则,词汇规

则,语音学规则。它首先接受键盘或者文件按照一定格式所输入的文本信息,然后按照所给定的语言学规则决定各字的发音基元序列以及基元组合时的韵律特性,从而决定了为合成整个文本所需要的言语码;在用这些代码控制机器在语音库中取出相应得语音参数,进行合成运算,得到语音输出。
一个成功的语音合成系统应该包括文本分析、合成语音以及韵律控制模块,最终输出音质清晰,自然流畅的语音。其原理如图1-3所示。
语音数据库

韵律控制

文本输入

文本分析

合成语音

语音输出

图1-3 语音合成系统框架

实现TTS的核心技术是非常复杂的,不是一般开发人员所能完成的,但是有了诸如微软公司开发的TTS引擎这样工具的帮助,只需要在应用程序中加入一些命令和操作,我们就可以创建具有TTS功能的应用程序。
2.TTS简介
 2.1 TTS概述
如前所述,TTS(Text-To-Speech)是微软公司出品的一套文字朗读引擎,它是基于COM/DCOM技术之上的一种能够将文本内容转化为语音的工具。利用它可以实现文本内容的流畅朗读。因为TTS技术是建立在阅读规则上的语音合成技术,并不是将单词或者文字一个一个机械地进行朗读,因此在语气的转折和单词的连接上非常自然,问句和祈使句的升降调也能够表现出来。此外,它还可以由使用者自己设定男女发音、调节音量和朗读速度。
微软的TTS引擎是免费提供给用户的,TTS引擎所需要的Microsoft Text to Speech Engine与Microsoft
Speech
API软件(文件名分别为mstts.exe与spchapi.exe)都可以到微软的站点免费下载(https://www.360docs.net/doc/378718140.html,/speech)。而在微软的Windows
2000和Windows
XP操作系统中已经集成了TTS5.0的引擎,无须另行安装。安装完TTS引擎以后,在操作系统的Windows目录下会生成一个Speech子目录。Speech子目录中的Xvoice.dll和Vtxt.dll文件就是TTS控件对应的文件,它们对应的控件的名称分别是:Microsoft
Direct Text-to-Speech 和 Microsoft Voice
Text。这两种控件的用法、功能以及外表的形式完全一样,我们都把它称为TTS控件,不过这种TTS控件只能对英文字符和阿拉伯数字读音。如果朗读中文,还得安装Speech
SDK5.1以及简体中文语言包Language Pack。此时会产生另一个Speech文件夹(C:\Program Files\Common
Files\Microsoft Shared\Speech)以及安装路径(C:\Program Files\Microsoft Speech SDK
5.1)。
Microsoft Speech
SDK5.1是微软中国研究院推出的支持中文语音应用程序开发的工具包。它也是采用COM标准开发,底层协议都以COM组件的形式独立于应用

程序层。因此,我们在实现语音合成软件的时候,只需考虑系统的功能实现和页面控制,不用考虑复杂的语音技术的实现算法。Microsoft
Speech SDK5.1包含与微软Win-32兼容的语音应用程序编程接口Speech
API(SAPI),SDK包括微软连续语音识别引擎(Microsoft continuous speech recognition
engine)和微软串联语音合成引擎(Microsoft concatenated speech synthesis
engine(也称TTS引擎))。SR(Speech
Recongnition)就是语音识别,是一种令人振奋的技术,但由于目前语音识别技术准确度和识别速度不太理想,还未达到广泛应用的要求。SS(Speech
Synthesis)就是语音合成,通过它可以很容易地建立功能强大的文本语音程序,实现文本的朗读功能。可以使用Windows的编程语言来开发具有语音识别或语音合成功能的应用软件。Speech
API结构在应用程序和语音引擎之间,提供了一系列的接口,它本身并不能做任何事情,因此利用API编写的程序需要语音引擎的支持才能运行。它们之间的关系如图1-4所示,DDI(Device
Driver Interface)。

图1-4 应用程序调用语音引擎
安装Microsoft Speech SDK5.1再安装Microsoft Speech language pack
(简体中文语言包),这时你的计算机就具有中英文语音能力了。安装好之后,电脑上也同时安装好了语音编程接口SAPI。
SAPI包括以下一些高级组件对象(接口)。
①Voice Commands API:
功能是对应用程序进行控制,一般在语音识别系统,识别了一个命令后,会调用此接口使某个应用程序完成一定的功能,如果你的程序想使用语音控制功能就必须使用此组对象。
②Voice Dictation API(API for Speech Recongnition): 功能是进行听写输入,即语音识别。
③Voice Text API(API for
Text-To-Speech):此组对象完成从文字到语音的转换功能,即语音合成,本次实验会用到此对象。
④Voice Telephone API:
它把语音识别和语音合成综合利用到了电话系统上,利用此对象可以建立一个电话应答系统,甚至可以通过电话控制你的计算机。
⑤Audio Objects API:主要封装了计算机的发音系统。
当应用程序需要发声的时候,就调用TTS引擎以及Microsoft Speech
SDK进行语音合成,将文本处理后通过扬声器用近似于人的声音“读”出来,通常还可以对语音引擎进行设置来改变“说话”的速度、声音频率、声音大小,还能模拟口形、唇形和舌位的变化对声音的影响,这些设置通过改变属性和方法即能够实现。
下面是对语音合成的核心类,以及属性和方法的介绍:
SpVoice
是支持语音合成(TTS)的核心类。通过SpVoice对象调

用TTS引擎,从而实现朗读功能。语音应用程序可以创建任意多个SpVoice对象,彼此之间独立但又有相互联系。SpVoice类常用的属性方法介绍:
属性:
①voice:表示发音类型,相当于进行朗读的人,包括Microsoft simplified Chinese、 Microsoft Mary、
Microsoft mike、 Microsoft sam 四种。
②Rate:语音朗读速度,取值范围从-10至+10。
③Volume:表示音量大小,取值范围从0到100。
方法:
①speak:完成将文本信息转换成语音并按照指定的参数进行朗读,有Test和Flags两个参数,分别指定朗读的语气内容和语气优先级。
②Pause:暂停使用该对象的所有朗读进程。
③Resume:恢复该对象所对应的被暂停的朗读进程。
SpVoice(Event)自动化对象定义了SpVoice对象能够从TTS引擎接受到的消息类型。主要有:StartStream
表示TTS引擎开始朗读文本流;Endstream 表示TTS引擎朗读完文本流。
2。2 Speech API与COM
与微软其他的API一样,SAPI是架构在COM(Component Object
Model)组件基础之上,用对象的方式提供编程接口。COM是编写Windows程序的基础,比较复杂,所以SAPI编程需要懂得COM编程与使用的原理。另外,在COM组件基础之上微软还提供了ActiveX
Control控件(ActiveX控件是以COM组件技术为基础的一种组件控件,可以嵌入到浏览器以及Office中使用),这样就方便我们在网页上使用SAPI的功能,使网页可以发声,用兴趣的同学可以自己制作发声网页。
四、 文本朗读器的Visual C++实现
1. 在VC6.0中配置SAPI SDK的两种方法
一个是在VC6.0环境中进行配置,这样VC6.0中开发的所有的应用程序都可以调用其中的相关文件。另一个是在建立的应用程序中,加入SAPI
SDK的动态链接库。这两种方法只能用其中的一种进行配置。
1.1环境配置
假设Sapi5.1 SDK安装路径是:C:\Program Files\Microsoft Speech SDK
5.1,那么在建立VC6.0工程之前,必须要进行附加包含路径和附加库路径的设置。
附加包含路径的设置主要告诉VC工程在哪里可以找到编译程序所需要的SAPI头文件。设置方式如图1-5所示,选择菜单Project-Settings或者按下快捷键Alt+F7弹出设置界面,如图1-5所示,然后在C/C++属性页的Preprocessor分类的“附加包含路径”下输入C:\Program
Files\Microsoft Speech SDK 5.1\Include就可以了。

图1-5 附加包含路径的设置

附加库路径的设置是告诉VC工程在哪里可以找到链接程序所需要的SAPI lib文件。设置方式如下图1-6
所示,在设置界面的Link属性页的Input分类下的“附加库路径”下输入C:\Program Files\Microsoft Speech SDK
5

.1\Lib\i386,在链接时就能找到所需要的Sapi.lib库文件。

图1-6 附加库路径的设置
1.2向应用程序中加入动态链接库
①新建工程
选择菜单File—New—Projects—MFC AppWizard(exe)。在Project
Name中输入新建工程的名字TTS,勾选Create New
Workplace,在Location选项中选择工程存放的位置,本例存放在E:\CD\TTS目录,点击ok,如下图1-7-1。

图1-7-1 新建工程设置
在此,勾选Dialogue Based项,表明此工程是基于对话框的项目,如图1-7-2。

图1-7-2 新建工程设置
点击下一步,勾选Automation项,如图1-7-3,点击下一步,直到结束。

图1-7-3 新建工程设置
②在程序中导入动态链接库sapi.dll
选择菜单View—Class Wizard打开MFC ClassWizard设置界面,在Automation选项卡中,点击右边的Add
Class按钮,选择From a Type Library。如图1-8-1所示。

图1-8-1 添加动态链接库Sapi.dll
打开C:\Programe Files\Common Files\Microsoft
Shared\speech文件夹下的动态链接库文件sapi.dll。按住shift选择所有类,如图1-8-2所示,点击ok。这样就可以在ClassView中看到所加入的类。

图1-8-2 添加动态链接库Sapi.dll
2. 界面布局设计
这里实现一个利用Visual
C++开发出能够根据文字内容朗读的实例,可以朗读一段文字或者一篇文章。可以选择中文或者英文进行朗读,也可以选择不同类型的人物语音进行朗读,另外还可以改变语音朗读的速度和音量大小。如图1-9所示:

图1-9 文本朗读器的运行界面
在窗体界面中,添加10个Button控件,4个Statistic Text控件,3个Edit Box控件,1个Combo
Box控件,各控件所占的空间和布局如上图所示。
2.1各控件的属性设置与功能介绍
①窗体
设置Caption属性:右键单击窗体选择“Properties”在对话框中进行如下设置。
Caption=“TTS”//把窗体的名称改为TTS
② 按钮控件
⑴按钮Speak English 和Speak
Chinese,用于朗读英语和汉语的发音实例,英语为“Apple”,汉语为“苹果”。用于检测能否正常发音,这两个控件的属性设置如下:
Button1:ID=”IDC_BUTTON_Speak”;Caption=”Speak English”
Button2:ID=”IDC_BUTTON_SpeechChs”;Caption=”Speak Chinese”
⑵按钮English和Chinese,用于选择发音的语言种类,然后就可以朗读英语或者汉语。其属性设置为:
Button3:ID=“IDC_BUTTON_Eng”;Caption=“English”
Button4:ID=“IDC_BUTTON_Chs”;Caption=“Chinese”
⑶按钮Read和Stop,用于朗读和停止朗读文本中的内容,其属性设置如下:
Button5:ID=“IDC_BUTTON_Read”;Caption=“Rea

d”
Button6:ID=“IDC_BUTTON_Stop”;Caption=“Stop”
⑷下面一对“+”“-”按钮,用来改变朗读的速度和音量大小
Button7:ID=“IDC_BUTTON_RAdd”;Caption=“+”
Button8:ID=“IDC_BUTTON_RDel”;Caption=“-”
Button9:ID=“IDC_BUTTON_VAdd”;Caption=“+”
Button10:ID=“IDC_BUTTON_VDel”;Caption=“-”
③ 静态文本控件
此类控件在程序中,用于显示功能提示文字:
Statistic Text1:ID=“IDC_STATIC”;Caption=“Input Text:”
Statistic Text2:ID=“IDC_STATIC”;Caption=“Rate:”
Statistic Text3:ID=“IDC_STATIC”;Caption=“Volume:”
Statistic Text4:ID=“IDC_STATIC”;Caption=“Voice:”
④ 可编辑的文本框控件
Edit Box1:ID=”IDC_EDIT_Input” 用于接收朗读的文本
Edit Box2:ID=“IDC_EDIT_Rate”用于显示朗读的速度大小
Edit Box3:ID=“IDC_EDIT_Vol”用于显示朗读的音量大小
⑤ 复选框控件
Combo
Box:ID=“IDC_COMBO_Voice”,用于显示可以选择的朗读语音类型,注意在设计时要拉大复选框的高度,以便可以显示所用的语音类型描述。
2.2声明成员变量
与控件相关的成员变量,在Visual C++中我们可以在对话框中进行声明设置。选择菜单View – Class Wizard – Member
Variables ,弹出如图1-10所示的对话框:
图1-10 与控件相关的变量声明
在控件列表中设置以下变量,方法是双击要设置变量的控件,给变量的类型和名称赋值:如下表:
ID
Type
Category
Member

IDC_EDIT_Input
CString
Value
m_Input

IDC_EDIT_Rate
Long
Value
m_Rate

IDC_EDIT_Vol
Long
Value
m_Vol

IDC_COMBO_Voice
CComboBox
Control
m_Voice

3. 控件代码编写
3.1声明SpeechAPI相关对象变量
首先在对话框头文件TTSdlg.h中,导入Speech应用程序接口头文件,即在文件TTSdlg.h中添加命令行#include
"sapi.h",这样程序就可以引用sapi.h中的对象。
然后在类CTTSdlg(TTSdlg.h文件)中,声明SpeechAPI对象变量:
class CTtschenDlg : public CDialog
{ public:
CLSID CLSID_SpVoice; // CLSID_SpVoice 是SAPI SpVoice对象的唯一Class ID
LPDISPATCH pDisp; //为类对象分配接口,此处定义一个自动化接口属性
ISpeechVoice voice; /*
ISpeechVoice是SpVice对象的接口,此语句是定义voice为接口IspeechVoice的类对象实例*/
ISpeechObjectTokens voiceList; /*定义一个语音对象列表,容纳所有的语音类型对象,本例有四个:
英文Microsoft Sam[speech sdk5.1]
英文Microsoft Mary[speech sdk5.1]

英文Microsoft Mike[speech sdk5.1]
中文Microsoft Simplified Chinese [speech sdk5.1]*/
ISpeechObjectToken recoObject; //定义一个语音对象,接受当前语音类型对象
……
}
3.2 应用程序界面初始化编程
文件TTSdlg.cpp中,在函数CTTSDlg::OnInitDialog()(// TODO: Add extra initialization
here)处加上如下初始化代码:
CLSIDFromProgID(L"SAPI.SpVoice", &CLSID_SpVoice);
voice.CreateDispatch(CLSID_SpVoice);
pDisp = voice.m_lpDispatch;
HRESULT hr = pDisp->QueryInterface(CLSID_SpVoice,
(void**)&voice.m_lpDispatch);
if (hr == S_OK) {
pDisp->Release();
}
else {
voice.AttachDispatch(pDisp, TRUE);
}
/*以上是SpeechSDK 为MFC调用sapi对象专用的初始化代码,用于实现对sapi接口的自动调用,在这里就不作具体的解释了。*/
m_Rate=0;
voice.SetRate(m_Rate);
// voice.SetRate(m_Rate)此方法用于把参数值设为朗读速度的大小
m_Vol=100;
voice.SetVolume(m_Vol);
/*给变量m_Vol赋值,然后通过方法voice.SetVolume(m_Vol)把变量m_Vol的值设为朗读声音的大小*/
voiceList=voice.GetVoices(NULL,NULL);
/*此方法用于获得SpeechSDK中的所有语音类型描述,赋给对象集变量voiceList*/
int nList=0;
nList=voiceList.GetCount();
for(int i=0;i{
recoObject=voiceList.Item(i);
m_Voice.AddString(recoObject.GetDescription(NULL));
}
/*以上代码用于把所有的语音类型,加载到组合框IDC_COMBO_Voice 中去显示*/
m_Voice.SetCurSel(0);
nList=m_Voice.GetCurSel();
voice.SetRefVoice(voiceList.Item(nList));
//选择语音类型列表中的第一项作为初始语音类型
m_Input="Fortune favors the brave.";
//设置文本框初始化时的内容
UpdateData(FALSE);
/*把变量的值传给对应的控件,并显示。UpdateData(TRUE)作用相反*/
3.3组合框选择语音类型事件代码
void CTtschenDlg::OnSelchangeCOMBOVoice()
{
int nList=0;
nList=m_Voice.GetCurSel();
//获得当前选择的语音类型
voice.SetRefVoice(voiceList.Item(nList));
//设置当前选择的语音类型为发音对象
}
3.4各按钮控件功能实现
双击相应控件进入代码编辑窗口:
void CTtschenDlg::OnBUTTONSpeak()
{
voice.SetRefVoice(voiceList.Item(0));
m_Voice.SetCurSel(0);
//选择语音类型列表中的第一项作为发音对象
UpdateData(FALSE);
voice.Speak("Apple", 1);
//Speak方法,朗读范例单词Apple的发音
}
void CTtschenDlg::OnBUTTONSpeechC

hs()
{
voice.SetRefVoice(voiceList.Item(3));
m_Voice.SetCurSel(3);
UpdateData(FALSE);
voice.Speak("苹果", 1);
}
void CTtschenDlg::OnBUTTONEng()
{
m_Input="Fortune favors the brave.";
voice.SetRefVoice(voiceList.Item(0));
m_Voice.SetCurSel(0);
//把第一项语音类型Microsoft Sam[speech sdk5.1]作为英语朗读的默认值
UpdateData(FALSE);
}
void CTtschenDlg::OnBUTTONChs()
{
m_Input="白日依山尽,黄河入海流,欲穷千里目,更上一层楼.";
voice.SetRefVoice(voiceList.Item(3));
m_Voice.SetCurSel(3);
/*把第四项语音类型Microsoft Simplified Chinese [speech sdk5.1]作为中文朗读的默认值*/
UpdateData(FALSE);
}
void CTtschenDlg::OnBUTTONRead()
{
UpdateData(TRUE);
//将控件的状态传给与其相关联的变量
voice.Speak(m_Input, 1);
//朗读文本编辑控件中输入的文本内容
}
void CTtschenDlg::OnBUTTONStop()
{
voice.Speak("", 2);
//把发音的内容设置为空,即停止朗读
}
void CTtschenDlg::OnBUTTONRAdd()
{
long lT=0;
lT=voice.GetRate();
if( lT < 10 )
{
voice.SetRate(++lT);
m_Rate=lT;
}
//增大语音朗读速度
UpdateData(FALSE);
}
void CTtschenDlg::OnBUTTONRDel()
{
long lT=0;
lT=voice.GetRate(); if( lT > -10 )
{
voice.SetRate(--lT);
m_Rate=lT;
}
//降低语音朗读速度
UpdateData(FALSE);
}
void CTtschenDlg::OnBUTTONVAdd()
{
long lT=0;
lT=voice.GetVolume();
if( lT < 100 )
{
lT+=10;
voice.SetVolume(lT);
m_Vol=lT;
}
//增加语音朗读音量
UpdateData(FALSE);
}
void CTtschenDlg::OnBUTTONVDel()
{
long lT=0;
lT=voice.GetVolume(); if( lT > 9 )
{
lT-=10;
voice.SetVolume(lT);
m_Vol=lT;
}
//降低语音朗读速度
UpdateData(FALSE);
}
五、 文本朗读器的Visual Basic实现
1. Microsoft Visual Basic环境配置
启动VB之后,选择菜单“工程”-“引用”,如图1-11,在对话框中勾选“可用的引用”项“Microsoft Speech Object
Library”,这样就把Win32 speech API中的对象库加入到Microsoft Visual
Basic编译环境中,可以直接调用语音引擎库中的对象。

图1-11 调用语音引擎中的对象库

2. 朗读器界面设计
2.1添加控件
如图1-12所示,在窗

体中添加以下控件:两个按扭,两个滚动框,六个标签,一个文本,一个组合框。

图1-12 文本朗读器VB程序运行界面

2.2各控件的属性设置及功能介绍
①窗体:改变窗体FORM1的Caption属性:Caption=“中英文文本朗读器”,作为窗体的名称。
②标签控件:以下是对标签控件的Caption属性进行设置,它们主要用来显示功能提示文字。
LABEL1:Caption=“输入文本”
LABEL2:Caption=“请选择朗读语言”
LABEL3:Caption=“播放速度”
LABEL4:Caption=“播放音量”
LABEL5:Caption=“存放速度大小”
LABEL6:Caption=“存放音量大小”
③水平滚动条:两个水平滚动条用于调节音量和音速,把两个水平滚动条的“名称”属性,分别设置成SpeedChange 和
VolumeChange,然后对这两个滚动条的最小值、最大值属性进行如下设置:
SpeedChange: min= -10;max=10
VolumeChange: min=0;max=100
④文本框控件:文本框控件用于输入要朗读的文本, TEXT1属性设置为:
Text=“Please input english text”
ToolTiptext=“请输入或粘贴英文文档”
MultiLine=True
ScrollBars=3-Both
⑤按钮控件:两个按钮控件用于控制朗读文本或者退出程序,属性设置如下:
COMMAND1:Caption=“朗读”
Command2:Caption=“退出”
3.控件代码编写
要使所设计的界面能够通过SAPI实现文字语音朗读的功能,在VB中编程的步骤如下:
3.1声明SpVoice对象变量
前面已经介绍过,SAPI是构架于COM组件基础之上的,所以首先声明文本朗读声音实现的对象变量:
Dim sp As SpVoice
Dim speakFlags As SpeechVoiceSpeakFlags
SpVoice 是SpeechLib(即Microsoft Speech Objects
Library)中用于发音的类,SpeechVoiceSpeakFlags也是SpeechLib的成员,用于指明语音朗读的风格。
3.2SpVoice对象的属性和方法
文本朗读器的实现主要利用SpVoice对象的实例,控制相应的属性和方法,实现朗读、音量、音速的控制等功能。
在VB中,选择菜单“视图-对象浏览器”,搜索到SpVoice对象,可以看出SpVoice是SpeechLib的成员,选择SpVoice后,在右边的对话框中,可以看到SpVoice类相应的属性和方法,下面是对相应的属性和方法进行介绍:
SpVoice.GetVoices()方法用于获得所有的语音类型,SpeechSDK中包括以下几种语音:
英文Microsoft Sam[speech sdk5.1]
英文Microsoft Mary[speech sdk5.1]
英文Microsoft Mike[speech sdk5.1]
中文Microsoft Simplified Chinese [speech sdk5.1]
SpVoice.Speeak 用于朗读文本中的内容的方法。
Spvoice.Voice

是SpVoice的一个属性,用于表示当前朗读所用的语音类型,可以从语音类型列表中选择一个值赋给Voice属性,从而改变朗读的语音。
SpVoice.Rate 是SpVoice的一个属性,用于表示语音朗读的速度,通过改变此属性的值,可以改变语音朗读的速度。
SpVOice.Volume 是SpVoice的一个属性,用于表示语音朗读的音量,通过改变此属性的值可以改变语音朗读的音量大小。
3.3其它对象的属性和方法
GetDescription()是ISpeechObjectToken成员的一个方法,用于获得语种语音的描述信息,如下:
英文Microsoft Sam[speech sdk5.1]
英文Microsoft Mary[speech sdk5.1]
英文Microsoft Mike[speech sdk5.1]
中文Microsoft Simplified Chinese [speech sdk5.1]
SpeechVoiceSpeakFlags用于指明SpVoice.Speak方法语音朗读的风格的成员,它的实例是一个枚举类型,共有以下几种值:

SpeechVoiceSpeakFlags.SVSFDefault;
SpeechVoiceSpeakFlags.SVSFIsFilename;
SpeechVoiceSpeakFlags.SVSFIsNotXML;
SpeechVoiceSpeakFlags.SVSFIsXML;
SpeechVoiceSpeakFlags.SVSFlagsAsync;
SpeechVoiceSpeakFlags.SVSFNLPMask;
SpeechVoiceSpeakFlags.SVSFNLPSpeakPunc;
SpeechVoiceSpeakFlags.SVSFPersistXML;
SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak;
SpeechVoiceSpeakFlags.SVSFUnusedFlags;
SpeechVoiceSpeakFlags.SVSFVoiceMask;
当将其设置为SVSFDefault(默认值)时,则SpVoice.Speak方法的第一个就是要读的文本,若将其设置为SVSFIsFilename时,SpVoice.Speak方法的第一个参数就是所要读的文本的文件名,而不是要读的内容。
3.4相关事件代码及注释
本程序包括一下几个事件:
① Form_Load():作用是在窗体加载时对各个控件的初始化设置。
Private Sub Form_Load()
Set sp = New SpVoice
’首先创建SpVoice的对象实例
Dim Token As ISpeechObjectToken
For Each Token In sp.GetVoices
Combo1.AddItem (Token.GetDescription())
’ 窗体加载时把所有语言类型的描述加入到组合框
Next
Combo1.ListIndex = 0
’初始化组合框的值
SpeedChange.Value=0
VolumeChange.Value=50
’设置两个滚动条的默认值,分别是朗读音量和语速的初始值
End Sub
② Command1_Click():执行输入文本内容的朗读功能
Private Sub Command1_Click()
If(Text1.text<>””) then
Command1.enabled=false
’如果用户在控件Text1中输入了文字,则设置控件Command1不再响应任何事件,这样可以防止Sp对象朗读文本时,用户又点击控件Command1。
sp.Speak Text1.Text, speakFlags
’使

用SpVoice对象朗读Text1文本框中的文本内容,并且按照speakFlags指定的朗读方式进行朗读
Command1.enabled=true
’恢复控件Command1对事件的响应
Else
MsgBox “请输入要朗读的短语或句子!”
End If
End Sub
③Command2_Click()执行退出程序的功能
Private Sub Command2_Click()
Set Sp=nothing
Me.hide
Unload Me
End Sub
④ Combo1_Click()用于选择一种用于朗读的语音类型
Private Sub Combo1_Click()
'这里只能用click不能用change事件,该组合列表框允许用户从系统当前支持的语言/语音中选择朗读文本的语音/语言
Set sp.Voice = sp.GetVoices().Item(https://www.360docs.net/doc/378718140.html,bo1.ListIndex)
’设置朗读文本的语言/语音为组合列表中的当前表项指示的语言/语音
End Sub//选择语音
⑤SpeedChange_Change() 响应改变滚动条的值的事件,用于控制语音朗读的速度大小
Private Sub SpeedChange_Change()
sp.Rate = SpeedChange.Value
’把滚动条的值赋给SpVoice对象的Rate属性,这样可以动态改变播放的速度
Label5.Caption = SpeedChange.Value
’标签控件用于显示语音播放速度值的大小
End Sub
⑥ VolumeChange_Change()相应改变滚动条的值的事件,用于控制语音朗读音量的大小
Private Sub VolumeChange_Change()
sp.Rate = VolumeChange.Value
’把滚动条的值赋给SpVoice对象的Volume属性,这样可以动态改变播放的音量
Label6.Caption = VolumeChange.Value
’标签控件用于显示语音播放音量值的大小
End Sub
六、总结
随着计算机性能的提高,使语音技术有了发挥其优势的硬件基础,语音技术会成为计算机应用领域的一个热点。本次程序介绍微软的一个语音程序开发包SpeechSDK,在Visual
Basic以及Visual
C++开发环境中,通过该开发包实现将文字转化为声音的功能。这对许多计算机使用者来说是不可思议的,但自己从底层开发声音软件,难度非常大,而SpeechAPI则刚好满足这一需求。著名的翻译软件金山词霸就利用了该开发包实现了中英文单词的朗读。
本文来自: [多媒体技术资源网] 详细出处参考:href=https://www.360docs.net/doc/378718140.html,/mmt/showart.asp?id=23>https://www.360docs.net/doc/378718140.html,/mmt/showart.asp?id=23

下一篇:基于Speech SDK开发中英文混合朗... 最近读者:登录后,您就出现在这里。

nxhujiee 2009年07月02日 上午 11:00 | 回复 选择一种用于朗读的语音类型
Private Sub Combo1_Click()
'这里只能用click不能用change事件,该组合列表框允许用户从系统当前支持的语言/语音中选择朗读文本的语音/语言
Set sp.Voice = sp.GetVoices().It

em(https://www.360docs.net/doc/378718140.html,bo1.ListIndex)
’设置朗读文本的语言/语音为组合列表中的当前表项指示的语言/语音
End Sub//选择语音
-------------------------------------------------------
本文作者
天津 赵先芝


相关文档
最新文档