微软的TTS

来源:互联网 发布:极品飞车20优化 编辑:程序博客网 时间:2024/05/23 14:42

一、概述

        项目中需要将数据库中读出的文本记录通过电话播放给用户,这就需要将文本转换为语音,即所谓的TTS(Text To Speech)。目前TTS技术已相对比较成熟,TTS引擎也比较多,比较有名的有Microsoft Speech SDK 和IBM的ViaVoice还有开源的Festival等。本文仅对微软的TTS进行讨论。
       软件中的语音技术主要包括两方面的内容,一个是语音识别(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引擎的接口,通过它我们可以很容易地建立功能强大的文本语音程序。

二、如何配置

      首先要添加SAPI.DLL文件的引用,如果安装的VS 2010则会自带有该com 组件。在C#程序中右键点击引用,然后在COM组件里找到Microsoft Speech Object Library 5.4。我们可以从路径中看到,其实它就是SAPI.DLL。然后在程序中加入:using SpeechLib;。然后我们就可以进行编程了。
 
       如果你没有该DLL,则需要去微软的官网下载 Speech SDK安装(免费的),需要安装程序的有Speech SDK 5.1(68M)和5.1 Language Pack (81.5M)。网上经常会说添加DotNetSpeech.dll,而不是SAPI.DLL引用,其实前者是用Tlbimp.exe工具将该sapi.dll转换成.net平台下的Assembly---DotNetSpeech.dll,两者的本质是一样的。


注:如果你使用的是C++工程项目(VS 2010),则需要对项目属性进行配置:
1.在项目属性页->配置属性->c/c++c->常规,在附加包含目录中,添加你的SAPI的include目录,例如:C:\Program Files\Microsoft Speech SDK 5.1\Include
2..在项目属性页->配置属性->连接器->输入,在附加依赖项中,添加你的SAPI.lib库的路径,例如:C:\Program Files\Microsoft Speech SDK 5.1\Lib\i386\sapi.lib
3.在程序中添加引用:
#include <sapi.h>
#pragma comment(lib,"sapi.lib");

然后就可以进行编程了。C++的使用方法可以参考博客:http://www.cnblogs.com/eping/archive/2010/05/23/1742201.html,也可以在网上搜。

三、如何使用

        SAPI的TTS都是通过SpVoice对象来完成的。SpVoice类是支持语音合成(TTS)的核心类。通过SpVoice对象调用TTS引擎,从而实现朗读功能。 

      SpVoice类有以下主要属性:
  • Voice:   表示发音类型,相当于进行朗读的人,通常我们可以通过安装相应的语音引擎来增加相应的语音。
  • Rate:     语音朗读速度,取值范围为-10到+10。数值越大,速度越快。
  • Volume:音量,取值范围为0到100。数值越大,音量越大。
  SpVoice有以下主要方法:
  • Speak():完成将文本信息转换为语音并按照指定的参数进行朗读,该方法有Text和Flags两个参数,分别指定要朗读的文本和朗读方式(同步或异步等)。
  • Pause():暂停使用该对象的所有朗读进程。该方法没有参数。
  • Resume():恢复该对象所对应的被暂停的朗读进程。该方法没有参数。 

关于SpVoice更多的内容可以参考帮助文件,安装了Speech SDK就会有,也可以去网上下载,不过是5.1版本的。

//输出到音频:SpeechVoiceSpeakFlags ss = SpeechVoiceSpeakFlags.SVSFlagsAsync;//异步朗读模式SpVoice sp = new SpVoice(); voice.Volume= 80;//音量 voice.Rate = -3;//语速sp.Speak(string,ss);//string是要朗读的文本,可以是Edit控件里的文本或者数据库中的文本。


//输出到语音文件      SaveFileDialog dialog = new SaveFileDialog();dialog.Filter = "All files (*.*)|*.*|wav files (*.wav)|*.wav";dialog.Title = "Save to a wave file";dialog.FilterIndex = 2;dialog.RestoreDirectory = true;if (dialog.ShowDialog() == DialogResult.OK) {       SpeechStreamFileMode spFileMode = SpeechStreamFileMode.SSFMCreateForWrite;//写模式       SpFileStream spFileStream = new SpFileStream();//文件流       spFileStream.Open(dialog.FileName, spFileMode, false);       voice.AudioOutputStream = spFileStream;//voice设置输出对象为文件流       voice.Speak(txtText.Text.Trim(), flags);//speak到文件流中,这时音频不会有声音发出       voice.WaitUntilDone(5000);//直到输出完成或者超时       spFileStream.Close();}


这里输出文件格式除了.WAV还有别的格式,可以用
spFileStream.Format.Type = SpeechAudioFormatType.SAFTCCITT_ALaw_8kHzMono;//输出为A-LAW格式


进行更改。

//输出到内存                   SpMemoryStream spmemorystrem = new SpMemoryStream();//内存流                    spmemorystrem.Format.Type = SpeechAudioFormatType.SAFTCCITT_ALaw_8kHzMono;                    voice.AudioOutputStream = spFileStream;                    voice.Speak(InvName, SpFlags);                    voice.WaitUntilDone(50000);//等待完成或者超时


注:
        这里编译可以通过,运行时也没有音频输出,按理说是输出到内存中去了,但是不知道如何操作这个内存,比如返回一个指针什么的。SpMemoryStream 有GetData(),SetData()方法,分别是从内存中读取数据,和写数据。前者返回的是Object,后者没有返回值。所以没有办法从内存中得到音频流,然后用别的工具(比如语音卡的内存播发函数)进行播放。

        目前有一个折中的方案,先将数据库中的文本合成到语音文件,然后调用文件播放函数(语音卡的函数)加载后播放电话端。这样一次播放就进行了两次IO操作。


参考文章:
http://www.cnblogs.com/SkyD/archive/2008/08/28/1278478.html
http://www.cnblogs.com/pfs1314/archive/2011/01/11/1932870.html
http://q.cnblogs.com/q/8393/
http://tech.it168.com/a2011/0103/1145/000001145635_1.shtml
http://blog.csdn.net/callmeback/article/details/6838024
http://blog.csdn.net/yuanchunze/article/details/3850835

0 0
原创粉丝点击