系统采用串行口与外界交互,任何具有标准串口设备均可与本系统相连。欲发音汉字国标码由串口送入MCU,MCU将其映射为Flash存储器地址表中对应项地址,然后根据此地址取得对应项中命令字,由MCU根据该命令字读取该汉字发音对应语音数据,连续读出语音数据并以游程码解码算法解码后,按照语音采样时固定速率通过D/A转换和功率放大播放。
一、原始语音数据采集和处理
本系统共采集了1335种发音,内含1306个流字发音,26个英文字母发音及3个停顿音,语音采集卡AD转换整编11025B/s,分辨率8位,样本值域0~255,静默值为80H。原始语音以WAV文件格式保存在PC机中。所有采集样本除具有不同波形包络外,均具有大体相同结构,即一个完整汉字发音均由前后两个静音部分和中间发音部分组成。静音采集值绝大多数为80H,因而可将其统一为80H,以提高压缩比。
二、语音库存储结构
本文以8Mbit×8位NAND型Flash存储器K9F6408U0B为例,描述本系统语音库存储结构。语音库基本内容分为两部分:前端是地址查找表,其后是压缩后语音数据。地址表中,每4个字节代表一个地址项。GB2312汉字编码字符集中每个汉字在地址表中都有一个对应项,其内容指向该汉字对应读音语音数据起始地址。GB码字符集中共有94个区,每区94个字符,总计8836个汉字、英文字母和其它符号,其中实际使用了7445个,余下作为预留区。本系统亦保留了这些预留区,以利于将来扩充。这样,地址表大小为94×94×4=35344字节。语音数据区共存储1335年发音,采用流程编码压缩存放,并在每段语音数据结尾添加01H作为结束控制符。
对不同Flash存储器,语音库需做一些针对性处理。对于K9F6408U0B而言,要对其C区进行专门处理。该芯片中,每个页面都有A、B、C三个区,其中A、B区各256字节,而C区仅有16字节。本设计中没有用到C区,因而在制作写入Flash二进制政府间库文件时必须注意对C区进行空白码填充。考虑C区填充后,地址表对应二进制语音库文件大小计算方法改为:512×69 16=35344,表示当35344字节只占据A区和B区时共需69个页面,多出16字节。这意味着有69个C区需要填充,即写入Flash地址表实际大小应该是35344 69×16=36448。相应地,语音数据区需要进行同样处理。
三、码字转换及高效MCU代码实现
本文中码字转换有两类。一类GB码到语音库起始字节数转换,用于MCU收到串口输入GB码后,确定相应读音在地线表中对应项起始地址。该类码字转换主要依据GB2312标准及语音库地址表结构进行。本文中,该码制转换算法为:((GB码高字节-161)×94 (GB)码低字节-161))×4。另一类是将上述地址转换为Flash读取数据命令字。这类转换与语音库存储结构及所用Flash存储器读写操作及时序相关。由于在语音库生成时已由PC机将语音数据起始地址转换为操作命令字并存储到了地址表对应项中,即大部分计算及时序控制操作在使用PC制作Flash二进制映像文件时已经完成,因而避免了系统运行中大量计算,从而保证了语音播放实时性。计算命令字方法与具体Flash存储器型号相关且较为繁琐。
采用波形编辑法
嵌入式TTS系统由于成本低、性能完善、自然度高,随着波形修改算法不断提出以及微处理器和非易失性存储介质功能不断增强,正日益受到人们关注。在基于Atmel公司AT89S52单片机上成功实现了一个TTS语音系统,经测试取得了令人满意效果。该系统应用简便,具有很小尺寸和很低功耗及通用串行接口,可以广泛用于有关汉语语音应用系统中。