新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 嵌入式TTS汉语语音系统的解决方案

嵌入式TTS汉语语音系统的解决方案

作者:时间:2010-03-15来源:网络收藏

  在PC上制作写入的Flash的数据文件时,首先将地址表放在最前面,其后将压缩后的语音文件逐一写入,并将每个文件的起始地址转换成对Flash存储器操作的命令字写入地址表相应项中,每写完一个文件要加上01H结束码,并在写入过程中完成对C区的填充。在综合完1335个语音文件、地址查找表、C区填充码及文件结束码之后,得到Flash存储器的二进制映像文件,其大小为8047776字节。写入后,Flash中尚余后333KB可用空间,联合地址表中的预留项,可用于对系统语音库做进一步的扩充。上述语音库的存储结构见图4。

  4 码字转换及高效MCU代码的实现

  本文中的码字转换有两类。一类GB码到语音库起始字节数的转换,用于MCU收到串口输入的GB码后,确定相应读音在地线表中对应项的起始地址。该类码字转换主要依据GB2312标准及语音库地址表的结构进行。本文中,该码制转换的算法为:((GB码高字节-161)×94+(GB)码低字节-161))×4。另一类是将上述地址转换为Flash读取数据的命令字。这类转换与语音库存储结构及所用Flash存储器的读写操作及时序相关。由于在语音库生成时已由PC机将语音数据的起始地址转换为操作命令字并存储到了地址表对应项中,即大部分的计算及时序控制操作在使用PC制作Flash的二进制映像文件时已经完成,因而避免了系统运行中的大量计算,从而保证了语音播放的实时性。计算命令字的方法与具体的Flash存储器型号相关且较为繁琐。限于篇幅,本文不再给出具体的算法。有兴趣的读者可以参阅K9F6408U0B的数据表。

  本文中的MCU型号为AT89S52,使用22.1484MHz的晶振。根据AT89S52数据表,每播放一个汉字,所需指令周期数为(1/11025)/(12/22.1184)=167.2。因此设置一个计时器中断,中断值为256-167=89,在每两个中断之间完成如下工作:

  (1) 从缓冲区中取得GB码并将之转换为地址表对应项地址;

  (2) 从地址表对应项中取得对应语音数据区存储地址;

  (3) 取得对应语音数据区数据;

  (4) 完成游程解码并播放。

 

  此外,由于完成有可能在语音播放过程收以输入字符,因而串口亦应工作于中断方式,串口波特率为9600bps,其优先级高于定时器中断。本系统中,此缓冲区能满足使用都 量多一次输入60个汉字。以上操作均在约168个指令周期中完成,大约相当84条双周期指令。因而在代码编写中,必须把代 码效率放在第一位,灵活地运用编程技巧来完成。

 本文给出了一种的实现方案。由于采用了易于解码的改进游程算法、多重查找表及Flash存储器操作命令这了的预先存储技术,使得该方案可以在罗低要求的硬件平台上实现,以AT89S52 MCU为核心的系统不同于基于PC的,该系统体积小、功耗低、成本低廉、适用范围很广。经测试其语音清晰、连贯,可发音字节涵盖GB码所有汉字、26个英文字节,一次可输入多达60个汉字的整句,足以满足大部分应用场合的需要。如以高档MCU或ARM处理器为平台,还可以增加更多的算法,以进一步改进系统性能。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)

存储器相关文章:存储器原理



上一页 1 2 下一页

评论


相关推荐

技术专区

关闭