首页>>厂商>>软件开发商>>Microsoft

微软SAPI让你的软件能说会道

2011/01/06

  “没声音,再好的戏也出不来。”这虽然是一句广告,但是也说出了一个道理,我们所开发的软件,特别是一些多媒体软件,要是能够发出声音,能说会道,将为我们的软件增添不少光彩。同时,我们面临的是一个老龄化的社会,将会有越来越多的视力不太好的老年人成为我们的用户,开始使用我们的软件,如果我们的软件能说会道,可以用语音的方式提示用户进行操作,这将大大增加软件的可用性,从而获得用户的喜爱。

  那么如何才能让我们的软件能说会道呢?别着急,微软有解决办法,用微软提供的SAPI就可以让我们的软件能说会道。

  什么是SAPI?

  软件中的语音技术主要包括两方面的内容,一个是语音识别(speech recognition) ,另外一个是语音合成(speech synthesis),也即是文本语音转换系统(TTS)。TTS系统使用合成语音合成文本字符串和文件到声音音频流。而语音识别系统则是转换人类的声音语音流到可读的文本字符串或者文件。这两个工作,都是通过各种语音引擎来完成的。微软所提供的SAPI (全称The Microsoft Speech API),正是在应用程序和语音引擎之间提供一个高级别的接口,它实现了所有必需的对各种语音引擎的实时的控制和管理等低级别的细节。语音引擎通过DDI层(设备驱动接口)和SAPI进行交互,应用程序通过API层和SAPI通信。通过使用这些API,我们可以快速开发在语音识别或语音合成方面应用程序。SAPI 应用程序编程接口(API)明显的减少了构建一个使用语音识别和文本语音转换的应用程序所需要的高层代码,使语音技术更加容易使用并且更加扩大了应用的范围。虽然现在SAPI不是业界标准,但是应用非常广泛。

  SAPI包括以下组件对象(接口):

  (1)Voice Commands API。对应用程序进行控制,一般用于语音识别系统中。识别某个命令后,会调用相关接口是应用程序完成对应的功能。如果程序想实现语音控制,必须使用此组对象。

  (2)Voice Dictation API。听写输入,即语音识别接口。

  (3)Voice Text API。完成从文字到语音的转换,即语音合成。

  (4)Voice Telephone API。语音识别和语音合成综合运用到电话系统之上,利用此接口可以建立一个电话应答系统,甚至可以通过电话控制计算机。

  (5)Audio Objects API。封装了计算机发音系统。

  其中Voice Text API,就是微软TTS引擎的接口,通过它我们可以很容易地建立功能强大的文本语音程序,金山词霸的单词朗读功能就用到了这些API,而目前几乎所有的文本朗读工具都是用SAPI开发的。在这里,我们使用的主要就是Voice Text API。

  安装SAPI SDK

  要使用SAPI让我们的软件能说会道,我们首先需要下载并安装SAPI SDK。首先从微软的网站上下载开发包: http://www.microsoft.com/speech/download/sdk51

  下载完毕后,首先安装SpeechSDK51.exe,然后安装中文语言补丁包SpeechSDK51LangPack,If 如果我们想将SAPI作为我们软件的一部分,随着我们的软件重新发布,我们还需要安装SpeechSDK51MSM.exe。

  安装好SAPI SDK后,即可开始在VS2010中使用SAPI让我们的软件能说会道了。

  创建项目,添加SAPI的引用

  这里,我们将创建一个普通的WinForm程序,它可以利用TTS朗读文本,也可以将文本文件通过TTS转换为声音文件,真正是一个“能说会道”的软件。首先,我们在VS2010中创建一个WinForm程序,并且将窗体设计如下:

  Text Box用于显示我们要阅读的文本,而Combo Box控件用于显示系统中已经安装的所有语音,用户可以从中选择当前TTS使用的语音。

  要在我们的项目中使用SAPI,我们还需要给项目添加SAPI的引用。用VS2010提供的添加引用功能,在添加引用对话框的COM标签页面中找到Microsoft Speech Object Library,将其添加到项目中。

  SAPI所提供的各个类都在名字空间SpeechLib之下,所以在代码中我们还需要使用using SpeechLib,表示我们将使用这个名字空间。这样我们就可以使用SAPI所提供的各种类来实现语音合成或者是语音识别了。

  创建SpVoice对象,初始化SAPI

  SAPI的TTS都是通过SpVoice对象来完成的。SpVoice类是支持语音合成(TTS)的核心类。通过SpVoice对象调用TTS引擎,从而实现朗读功能。 SpVoice类有以下主要属性:      SpVoice有以下主要方法:      所以我们在窗体的构造函数中,首先需要完成SpVoice对象的创建,然后才能使用这个对象来朗读文本。 因为系统中可能有多个语音可供选择,所以我们在创建窗体的时候,同时需要用一个Combo Box控件列举出系统中所有的语音,并且选中默认的第一个语音。当窗体创建后,用户可以在这个Combo Box选择自己喜欢的语音来朗读文本。

  朗读文本

  完成窗体的初始化,创建SpVoice对象之后,接下来我们就可以利用这个对象的Speak()方法来阅读Text Box控件中的文本了。

  在这里我们使用了SpVoice对象的一个最重要的函数Speak(),它的第一个参数就是我们要朗读的文本,而第二个参数则是朗读的方式,有同步,异步,XML文件等等。 这样,通过SpVoice对象的一个简单函数,我们就可以朗读Text Box控件中的文本内容了。

  朗读文本文件

  更多时候,我们不是阅读Text Box控件中输入的文本,而是阅读某些文本文件中的文字,这样,读取文本文件并将文字填充到Text Box控件中就成为一种必要了。

  这样,我们就可以通过读取文本文件中的内容,将其显示到Text Box控件中,然后SpVoice就可以阅读Text Box控件中的内容,也就是间接地朗读了文本文件。

  将文本转换成声音文件

  除了直接朗读文本之外,更多的时候,我们还需要将文本转换成声音文件。这样我们可以将这些声音文件随身携带,想听就听。要将文本转换为声音文件,我们需要用到SpVoice的另外一个重要的函数SetOutput(),我们可以利用它将SpVoice的语音输出某个WAV文件,从而实现将文本文件转换为声音文件。

  因为 将一段比较长的文本转换成声音文件,通常是一个比较长的过程,所以在这里我们创建一个专门的工作者线程来负责文本的转换,而界面线程则负责显示转换的进度。

  跟直接朗读文本相似,我们仍旧使用SpVoice的Speak()函数朗读文本,只是我们通过指定SpVoice的AudioOutputStream属性,将语音输出到一个音频文件,这样就完成了文本文件到音频文件的转换。

  完成转换工作者线程的创建后,我们就可以利用它来完成具体的转换工作。在窗体的保存按钮的单击响应函数中,我们创建相应的工作者线程来进行文本的转换。

  除了创建线程进行文本的转换之外,为了让我们的软件更加易用,更加人性化,我们还需要响应线程事件,移动进度条的位置以反映转换的进度,免得用户以为软件在比较长的转换过程中死掉了。

  控制SpVoice的阅读

  到这里,一个能说会道的软件基本上已经完成了,但是,为了让我们的软件更加易用,我们还可以通过SpVoice提供的函数对SpVoice的行为进行控制,让她更加符合我们的心意。例如,我们可以控制SpVoice的暂停和继续。


  通过SpVoice提供的函数,对SpVoice的行为进行控制就是这么简单。除了阅读的暂停和继续之外,我们还可以通过SetRate()函数设置声音的语调,通过SetVolume()函数设置声音的音量等等。这些函数就不在这里一一介绍了,留给大家自己去尝试。

  现在,使用SAPI,即刻让你的软件能说会道。
共 3 页: 1  2  3 

IT168



相关阅读:
微软Mediaroom平台:实现电信级的电视服务 2010-12-29
徐工集团重构CRM提升企业客户关系管理 2010-12-22
微软发布新版iPhone客户端——必应2.0 2010-12-17
微软Lync整合统一通信 和辰信息顺势而为 2010-12-15
2011年:微软计划在CRM领域超越Salesforce 2010-12-14

热点专题:  语音合成TTS 语音识别ASR