亓传伟 王合闯
摘要 微软TTS语音引擎技术在C#中实现文本朗读系统的方法,本系统虽以计算机自动点名为例,但可扩展实现所有文本文件的朗读。本系统的开发环境为:Windows XP(SP2)中文版+ .NET Framework 2.0+ Visual Studio .NET 2005。 关键词 TTS,文本朗读,NET,C# 一、 微软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语音引擎技术,巧妙的实现了一个点名系统,其实只要改变文本文件的内容,便可方便地实现所有中文文本的朗读。 参考文献: 1 赵卫伟.Visual C#.NET 面向程序设计教程.机械工业出版社.2006年5月第1版 2 Speech SDK自带的说明文档(SAPI.chm). 3 MSDN (msdn.microsoft.com).
|