你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:技术专栏 / Linux开发
文本朗读系统的实现
 

亓传伟 王合闯

摘要  微软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).

  推荐精品文章

·2024年12月目录 
·2024年11月目录 
·2024年10月目录 
·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089