- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
嵌入式TTS汉语语音系统的解决方案
图2是"哎"音样本的时域波形。所有的采集样本除具有不同的波形包络外,均具有大体相同的结构,即一个完整的汉字发音均由前后两个静音部分和中间的发音部分组成。静音的采集值绝大多数为80H(一些轻微扰动可视为录音过程中的噪声,但尾音部分要另外处理),因而可将其统一为80H,以提高压缩比。另由图2可见,00H、01H、FFH、FEH这些边缘值的出现概率是很小的,这个特性亦可用于语音的压缩算法中。
本文根据上述静默值及边缘值的分布特点,提出了一种改进的游程编码用于语音数据的压缩,具体做法是:用00H代表游程压缩起始码,其后是被编码字符,再下一个字节是被编码字符的重复码,如:80 80 80 80 80可以表示为00 80 05。显然,游程长度小于等于3时没有编码的必要,因而不会出现值为00H、01H和02H的重复码。如上所述,在原始语音文件中,00H、01H这些边缘值是基本上不出现的。因为大量出现这些边缘值即意味着语音采集系统的动态范围设置错误。尽管如此,为确保原始语音文件中没有"多余"边缘值,需要将语音文件略做处理,将可能存在的00H和01H都改为02H,显然这样的处理并不会影响语音的实际播放效果。处理后的00H、01H即可作为特殊控制字符使用。图3是本文提出的改进流程压缩编码的流程图。编码前,1335种原始语音样本的大小为14978622字节,压缩后为7767112字节,压缩比超过50%。该语音库已经可以装入容量为8M字节的FLASH存储器中。
3 语音库的存储结构
本文以8Mbit×8位NAND型FLASH存储器K9F6408U0B为例,描述本系统语音库的存储结构。
语音库的基本内容分为两部分:前端是地址查找表,其后是压缩后的语音数据。地址表中,每4个字节代表一个地址项。GB2312汉字编码字符集中每个汉字在地址表中都有一个对应项,其内容指向该汉字对应读音的语音数据起始地址。GB码字符集*有94个区,每区94个字符,总计8836个汉字、英文字母和其它符号,其中实际使用了7445个,余下的作为预留区。本系统亦保留了这些预留区,以利于将来的扩充。这样,地址表的大小为94×94×4=35344字节。语音数据区共存储1335年发音,采用流程编码压缩存放,并在每段语音数据结尾添加01H作为结束控制符。
对不同的FLASH存储器,语音库需做一些针对性的处理。对于K9F6408U0B而言,要对其C区进行专门的处理。该芯片中,每个页面(Page)都有A、B、C三个区,其中A、B区各256字节,而C区仅有16字节。本设计中没有用到C区,因而在制作写入FLASH的二进制政府间库文件时必须注意对C区进行空白码(FFH)填充。考虑C区填充后,地址表对应的二进制语音库文件大小的计算方法改为:512×69+16=35344,表示当35344字节只占据A区和B区时共需69个页面,多出16字节。这意味着有69个C区需要填充,即写入FLASH的地址表的实际大小应该是35344+69×16=3*8。相应地,语音数据区需要进行同样的处理。
来源:维库开发网