前言 今年,我参加学校举办的的一个嵌入式比赛,我的作品中需要用到中文文本语音转换的功能,由于是使用linux系统,所以不能使用MS提供的语音开发包,虽然linux上也有很多TTS功能的软件,但都只支持英语文本的转换,不支持中文的转换,当然支持中文语音转换的也有,但都需要money的,而且我们对语音的要求不高,所以就由我自己来实现。 我实现的中文TTS现有功能如下: - 基于中文二级字库,语音库的语音元素使用的是MS的语音库语音元素。
- 合成语音文件的格式为 WAV, 所以合成语音可以直接在声卡上播放。
- 提供简单的函数调用接口,支持程序开发
附: 我实现的中文TTS 需改进的N点: - 没有自己的语音播放功能(我是FORK 播放器进程来读语音文件的)需要在TTS中增加播放功能模块,才能算是完整的TTS系统,网上有很多LINUX上播放器的代码,由于时间关系我暂时没做,但以后我一定会加上去的,我也希望能有朋友能帮我完成这功能
- 语音库文件太大(没压缩前有40M左右,使用普通的压缩程序压缩后只有2M多点)我的发音元素是采用WAV格式的,所以有点大, 解决方法我暂时还没想到,我打算对压缩文件进行操作,但不知道行不行,自己没把握。
- 提供的函数功能太简单
3.1): 现在只提供了将GBK/GB2312编码 的中文文本转换, 如果程序使用的编码是其它格式的话,还需先自己转换成GBK/GB2312的编码 才能使用我提供的函数,我想在中文TTS中封装编码转换函数,这样能使应用程序更方便的使用。 3.2): 其他很多功能的实现: 太多功能需要来实现,写都写不来了。。比如说读数字的处理等等,太多了,所以暂时空着 - 读音效果
我想这点应该是评价一个TTS系统的最关键的因素,也是我自己认为最难的一点,我想这可能超出了我的知识范围,我的头脑中只存在着编程逻辑,对其他的知道得甚少,我想我自己得突破这点。了解其它学科的知识。 现在我只能说一句, 现在的读音效果超差,一听就知道是机器在读,没有一点人情味。 - 不支持中英文混读
现在只能读中文,英文是一个一个字母的读,虽然有很多关于英语转换的TTS软件是开源的,但要完成这功能还是需要一定的工作量的,想想如果让我一个人来做,就头晕,天哪,要看N多的代码....... - 多音字的处理
我想这可能要用到中文分词了.... 实现原理 采用波形拼接的语音生成方法来实现本系统。这种方法预先建立一个庞大的语音数据库,在合成时采用恰当的技术手段挑选出所需的语音基元进行拼接,从而形成语音输出。因此,语音拼接的重点是基本语音单元的拼接,我们选取字作为基本的语音拼接单位,语音数据库由若干以字为单位的WAV样本文件组成。[1] 所以实现本汉语TTS系统主要完成两项工作: 第一:建立一个语音库,语音库中记录了普通话中所有汉字的读音; 第二:建立汉字机内码到汉字读音的访问方法,实现由输人的汉字机内码得到该汉字的读音。并且合成WAV声音文件。[2] 语音库的实现 语音库保存着常用汉字的发音(多音的汉字只记录其一种发音,这也是本系统的一个缺陷,需要以后完善),所以先要得到一汉字集,这个汉字集包含了大部分常用的汉字,然后在根据这个汉字集,来一个个的取得汉字的发音,并且按一定的规则保存到语音库中。 所以实现语音库可以分为三步: - 取得常用汉字的集合
- 根据汉字集,使用一些朗读软件生成该汉字集的语音文件
- 处理汉字集语音文件的格式,使它能符合我们的要求
1.1根据汉字编码规则获取汉字字符集的文本文件 1.1.1编码知识: 所谓编码,是以固定的顺序排列字符,并以此作为记录、存贮、传递、交换的统一内部特征。一个汉字有ASC II码、区位码等与之对应。ASC II码中对应于码值161到254的字符用于表示汉字,每个汉字用两个ASC1I码值对应的字符表示。区位码用4位数字表示,前两位从01到94称区码,后两位从01到94称位码。一个汉字的前一半是 ASC II码为“160+区码”的字符,后一半是ASCII码为“160+位码”的字符。例如:“刘”的区位码是3385,其意为区码33和位码85,它是由 ASCII码为160+33=193和160+85=245的两个字符组成。
该文所说的汉字字符集一般是指ISO 10646.1 即GB13000.1。在Windows 95/98/2000中,微软提供了“汉字扩展内码规范(GBK)”以解决汉字的收字不足、简繁共存、简化代码体系间转换等汉字信息交换的瓶颈问题,利用 GBK可以方便解决“ |