1、1不用 Windows Speech SDK 的“语音合成 ”方案 -风轻云淡“语音合成 ”,在电脑上实际上是完成“字符转变为语音”这个功能的。我个人也就沿用这个“语音合成 ”这个概念吧。笔者就此事情,了解了一下“语音识别和语音合成”程序设计方面的事情,好像都是要借助于“微软 Windows Speech SDK”这个开发包。假如要甩开这个“SDK” ,是否有可能呢?笔者通过实验注 来看是可以的。但它是否能推广到一般呢?是否可以仿此推广到其它的语种呢?是否可以多语种的混合使用?是否可以在 Liunx系统中仿照方法也能够实现呢?诸如此类的种种问题,有待于广大程序员的辛勤和努力工作。下面,把我以中
2、文为对象,在 VB 里的做过的实验过程大概的说一下:先制作发音文件:中文发音文件,根据现代汉语词典商务印书馆 1981 年北京版这部词典来制作的。根据 【音节表】制作1331 个中文音节发音音频文件,是 MP3 格式, 【每个音节做成一个音频文件,包括汉语拼音的四声,分别命名为编号. MP3】 。其序号从 1 开始一直排到 1331.。每个音频文件的名称就成了 xxx.mp3,注:xxx 表示 11331 之间的任意整数 。2为说明和理解的方便,暂时把这些发音文件理解成一个文件,即“读音文件” 。关于这种文件的制作,有条件的可以自己录音制作,笔者也赞成这样,做好的发音文件要经过修剪的。因为笔者
3、是为了实验,也就暂时借助于其它的语音合成软件合成了供实验用的材料。【思考和讨论:笔者采用格式的原因是文件占用空间比较小,相对于 wav 格式,那么是否还有其它的格式可供采用呢?特别是数字格式的,即:用一个数字来表示,或者一个数组来表示,为何要考虑其它格式,原因很简单,就是想考虑和以后的语音识别能否共用这些文件,这点至关重要】 。第二个文件是“汉字发音编号索引”文件,文件内容的格式是: 汉字+ 空格+发音编号。例如:猜 80。这里的空格也可以用其它符号。也就是说:一个汉字对应着一个发音编号。那么,下面说说建立这个文件步骤:1 :建立一个零时字库文件,建立这个文件,当然是选择的独立汉字越多越好;建
4、立字库文件,可以设计一个小工具来从文章里筛选得到。我选择了大概有 4000 多个,这个数字在现实中是完全不够用的,但目前只是实验,笔者也就没有再继续做这方面的工作了。32:把字库文件的每一个汉字进行读音标注,这个工作也只能借助于软件来完成。3:音节发音文件与汉字读音文件合并成一个文件,暂且命名为:hanziduyinbianhao汉字读音编号,这样就成了【汉字+ 空格+发音编号】这样的文件。在合并时要这样做:把每一个汉字转换为 ASCII 码,以这个 ASCII 码作为记录号写入随机文件。因为以后查阅的时候,仍然是根据其 ASCII码来查找的,这样速度快。当然,不反对使用数据库的方案。这项工作
5、也得由软件来完成,笔者也只得自己设计一个这样的小工具了。这个工具也很简单,用字符匹配函数和字符运算就够了。上面的两个文件制作好后,就存放在一定的文件夹下:我这里放在 D:shiyai 文件夹下,这个文件夹下有还有一个 文件夹,这个是存放音节发音文件的,我这里命名为yinpinmp3,它里面存放了 1331 个 MP3 音频文件。如果再把hanziduyinbianhao.dat 这个文件方的 D:shiyai 文件夹下,那么在 shiyan 就有一个文件 hanziduyinbianhao.dat 和一个文件夹 yinpinmp3。如果要他们进行操作的话,就先写出路径,写法如下:D:shiya
6、ihanziduyinbianhao.dat【hanziduyinbianhao.dat 是:“汉字读音编号” 】4D:shiyai yinpinmp3xxx.mp3 【xxx.mp3 是:“读音文件” 】上面的两个文件做好以后, 【“汉字读音编号”和“读音文件” 】就可以进行程序的设计了。现在先看看这个程序的思路流程:以“我们的国家是一个伟大的国家”这句话为例。分析:计算机要把这一句话说出来,只能是按照先后顺序一个字一个字的说,人们说话或者听话的习惯也是如此,那么,就得把这句话拆分成单个的汉字,这样就得设计一个拆分过程;:计算机本身是不能够识别字符的,更不知道它该读什么音,那么在计算机内就得
7、预先存放有很多字符以及其读音的数据文件,这个数据文件就是前面提到的“hanziduyinbianhao.dat” 这个文件。计算机 根据前面已经分解过的单个字符,逐个在“hanziduyinbianhao.dat”文件中查找其对应的读音编号,然后写入到一个文件,这里命名为“bf.txt ”, :读出部分。这部分是利用一个列表框顺序播放器来完成。综合 1、2、3 所述,程序的流程如下:5拆分成单个的字符把字符逐个转换为 ascii,并查找出读音编号,然后写入 bf.txt 文件,sehll 播放器.exe,自行退出列表框播放器首先读取 bf.txt文件并加入列表框,开始播放,完毕后自行退出上面的
8、框图只是程序的总流程框图,具体到每一步那就要多一些,笔者暂时无暇顾及,没有写出,望谅解。值得说明的是:从框图上可以看出,笔者是按两个程序进行设计的,也可以合并为一个程序。我之所有这样做的原因:一个是在试验阶段为了方便,另一个更重要的原因是为了其它地方的应用方便而有意这样做的,主要是根据我自己的情况来决定的,再就是考虑日后其它应用程序的应用接口以及通用性问题。我这里暂时的接口是:把要读出的字符首先写入文件:然后调用“字符分解程序”就完了。实验后看到的缺陷有:1:建立的字库所含汉字少;62:没有写出错处理程序3:读音间隔长,原因可能主要是读音文件的问题,需要对那 1331 格式的 mp3 音频文件
9、进行剪辑,才能解决问题。通过这次的实验,完全可以得出一个结论,不用“Windows Speech SDK”是完全可以的。也许 “Windows Speech SDK”也和实验过程有相仿或类似之处吧。通过这次的实验,不由得我想起了“语音识别”这个课题,它是否也有同样的道理呢?即是不是也可以撇开“Windows Speech SDK”呢?所以,笔者也诚恳的希望广大的程序员能够提供和上传“语音识别”的文章。我一定会拜读的。最后,由于笔者的水平所限,文章写得有些紊乱,请谅解!注:笔者是在 VB6.0 环境下,只通过一些实验对中文进行了一些实验,是可以行的通的,在 Delphi 中的实验暂时还没有完成。7