一、微软TTS语音引擎概述
Microsoft Speech SDK提供一套关于语音处理的应用程序编程接口SAPI(Speech Application Programming Interface)。SAPI提供了实现文字-语音转换(Text-To-Speech)和语音识别(Speech Recognition)的方法,其功能结构如图1所示。语音引擎通过DDI层(设备驱动接口)和SAPI进行交互,应用程序通过API层和SAPI通信。通过使用这些API,用户可以快速开发在语音识别或语音合成方面应用程序。SAPI最基本的语音引擎为Text-To-Speech(TTS),TTS 通过合成声音来朗读文本字符串和文本文件。本系统采用微软TTS5.1语音引擎(中文),其中内置简体中文语音包(SimpChinese Speech Package),是一个简便实用的SAPI。
图 1 SAPI功能结构图
二、导出托管动态连接库
在安装完TTS(SAPI)以后,会在D:\Program Files\Common Files\Microsoft Shared\Speech\下面找到sapi.dll,这里面定义了SAPI的COM对象。这时可以利用.NET Framework自带的工具TlbImp.exe把sapi.dll导出到托管动态连接库中,以便在.NET中使用。其方法是在命令提示符下,进入sapi.dll所在目录,然后输入如下命令:
Tlbimp sapi.dll /out: DotNetSpeech.dll
注:DotNetSpeech.dll为导出的托管动态连接库文件名。
导出时会提示出现错误和警告,但不影响使用,可以忽略。
三、引用托管动态连接库
新建一个Windows应用程序解决方案,打开解决方案资源管理器,在引用上右单击选择添加引用,在浏览选项卡中找到刚才导出的DotNetSpeech.dll。并在窗体的程序CS文件代码段中添加引用using DotNetSpeech; 这样就实现了SAPI SDK的导入。
四、语音朗读函数的原型及其测试
在TTS语音引擎中,关键的文本朗读函数为Speak,其原型如下:
int ISpeechVoice.Speak (string Text,SpeechVoiceSpeakFlags Flags);
其中参数string Text 为要朗读的文本,如"我有一个梦,我梦想……";
SpeechVoiceSpeakFlags Flags为一枚举类型数据,共有以下几种值:
SpeechVoiceSpeakFlags.SVSFDefault;
SpeechVoiceSpeakFlags.SVSFIsFilename;
SpeechVoiceSpeakFlags.SVSFIsNotXML;
SpeechVoiceSpeakFlags.SVSFIsXML;
SpeechVoiceSpeakFlags.SVSFlagsAsync;
SpeechVoiceSpeakFlags.SVSFNLPMask;
SpeechVoiceSpeakFlags.SVSFNLPSpeakPunc;
SpeechVoiceSpeakFlags.SVSFPersistXML;
SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak;
SpeechVoiceSpeakFlags.SVSFUnusedFlags;
SpeechVoiceSpeakFlags.SVSFVoiceMask;
我们用以下代码进行测试:
SpeechVoiceSpeakFlags spFlags = SpeechVoiceSpeakFlags.SVSFlagsAsync;
SpVoice voice = new SpVoice();
voice.Speak("我有一个梦,我梦想……", spFlags);
五、生成WAV文档
若在一些其他的场合无法用计算机,或不方便用计算机进行文本朗读,可以用TTS生成WAV文档,可用软件压缩成MP3文档,放在MP3播放设备中进行播放,或者用录音机录制在磁带上用录音机播放。代码如下:
SpeechVoiceSpeakFlags spFlags = SpeechVoiceSpeakFlags.SVSFlagsAsync;
SpVoice voice = new SpVoice();
SpFileStream spfs = new SpFileStream();
spfs.Open("c:\\mystream.wav", SpeechStreamFileMode.SSFMCreateForWrite, false);
voice.AudioOutputStream = spfs;
voice.Speak("我有一个梦,我梦想……", spFlags);
voice.WaitUntilDone(1000);
spfs.Close();
MessageBox.Show("生成成功,位于c:\\mystream.wav\n 点击播放按钮播放。");
this.button1.Visible = true;
六、计算机点名(文本朗读)系统
考虑到在点名过程中人员名单的改动性较大,因此没有采用数据库技术,而直接采用纯文本来存放名单,将名单放在res目录下。这样方便用户修改名单,或从其他数据源中导出数据到本系统,因此须添加引用using System.IO。
为了能够在点名过程中看到所点的名字,在窗体上添加两个ListBox,一个用于显示正在点播的名单,而另一个用于显示正在点播的文档,并添加三个Button按钮,一个开始点名,一个暂停按钮,一个继续按钮。并用一个timer控件实现自动按顺序点名。实现的核心代码如下:
int items;
Timer atimer = new Timer();
int i=0;
SpeechVoiceSpeakFlags spFlags = SpeechVoiceSpeakFlags.SVSFlagsAsync;
SpVoice voice = new SpVoice();
private void button2_Click(object sender, EventArgs e)
{
this.button2.Enabled = false;
this.button4.Enabled = true;
this.button5.Enabled = true;
items = this.listBox1.Items.Count;
atimer.Interval =(int)this.numericUpDown1.Value;
atimer.Tick += new EventHandler(atimer_Tick);
atimer.Start();
}
void atimer_Tick(object sender, EventArgs e)
{
if (i >= items)
{
atimer.Stop();
i = 0;
this.listBox1.SelectedIndex = i;
voice.Speak("点名完毕!", spFlags);
return;
}
this.listBox1.SelectedIndex = i;
string s = this.listBox1.SelectedItem.ToString();
voice.Speak(s, spFlags);
i++;
}
最终实现界面如图2所示:
图 2 点名系统界面
七、配置TTS引擎当前所处理语言
直接编译运行所设计的应用程序,点击“开始点名”按钮,发现并没有声音发出,这是因为还没有配置TTS引擎当前所处理语言。其配置方法如下:
“控制面板”→“声音、语音和音频设备”→“语音”→“语音-文字转换”→“语音选择”下拉列表中选择“ Microsoft Simplified Chinese ”(简体中文),当然还可以根据预听语音效果,调节语音速度,以达到满意效果。
微软TTS语音引擎技术在Windows XP下朗读的声音并不十分悦耳,且只有男声,在简体中文下对西文的朗读为单个字母方式,而非单词方式,而在Windows Vista中的女声文本朗读有很大改进,不但声音好听,且中英文能混合朗读。本文借助微软的TTS语音引擎技术,巧妙地实现了一个点名系统,其实只要改变文本文件的内容,便可方便地实现所有中文文本的朗读。
本系统的开发环境为:Windows XP(SP2)中文版+ .NET Framework 2.0+ Visual Studio .NET 2005。
|