基于SPCE061A的通用汉字文本播音系统

[10-10 20:36:41]   来源:http://www.88dzw.com  电子制作   阅读:8205

文章摘要:用ResWriter工具V2.0可将压缩后的1 220个S480语音数据文件烧录入SPR4096A中。ResWriter根据文件总数和每个文件大小,在最低地址生成一个语音资源地址索引表。索引表分两大部分:第1部分14字节,是整个语音资源的总信息,包括4字节的标识码SPRW(Sunplus Read Write)4字节的起始地址、4字节的结束地址和2字节的文件总数;第2部分为每个文件的信息,共1 220项,分别对应一个文件,每项12字节,包括4字节的长度、4字节的起始地址和4字节的结束地址。所以此索引表的大小为14+12×1220=14 654字节。要根据文本中每个汉字内码找到语音数据

基于SPCE061A的通用汉字文本播音系统,标签:电子小制作,http://www.88dzw.com

  用ResWriter工具V2.0可将压缩后的1 220个S480语音数据文件烧录入SPR4096A中。ResWriter根据文件总数和每个文件大小,在最低地址生成一个语音资源地址索引表。索引表分两大部分:第1部分14字节,是整个语音资源的总信息,包括4字节的标识码SPRW(Sunplus Read Write)4字节的起始地址、4字节的结束地址和2字节的文件总数;第2部分为每个文件的信息,共1 220项,分别对应一个文件,每项12字节,包括4字节的长度、4字节的起始地址和4字节的结束地址。所以此索引表的大小为14+12×1220=14 654字节。

  要根据文本中每个汉字内码找到语音数据地址,还必须有汉字读音序号索引表。此表在语音库制作的同时生成,共6 763项,按GB 2312顺序每项对应一个汉字在1 220个读音文件的序号,用2字节表示,总大小为13 526字节,占用7个扇区。另编一个小程序,将此表写入Flash存储器最底部的7个扇区,即从地址0x7C800开始。Flash存储器还剩59个空白扇区,可供其他数据写入。

  汉字读音序号索引表、语音资源地址索引表和语音资源数据的总长度为392 kB,存储在SPR4096A中,结构如图2所示,所有地址和长度数据均为高字节在前,低字节在后,用十六进制表示。当然,汉字读音序号索引表也可存放在SPCE061A的内部Flash存储器中,这样编程较简单,但会多占用程序存储器空间。

  3软件流程

  3.1汉字语音资源地址的计算

  由汉字机内码计算汉字语音资源的起始地址和结束地址分为以下2步:

  a)由公式:(机内码高字节WH-0xB0)×94+(机内码低字节WL-0xA1),计算出汉字在汉字读音序号索引表中的偏移值(设为M),在0x7C800+2*(M-1)地址处查得汉字读音序号(设为N)。

  b)由汉字读音序号N,在语音资源地址索引表中从0x12+0xC*(N-1)地址开始查得该汉字的语音资源数据的起始地址和结束地址。

  3.2汉字语音资源播放
  
  以语音资源的起始地址和结束地址为参数,调用SACM_S480中相应的API函数就可实现语音播放,流程如图3所示。

  凌阳语音播放有自动和手动两种API,由于语音资源存储在外部SPR4096A中,需先读出并存入内部RAM中才能解码,故只能采用手动方式播放语音,初始化、读取资源数据、填充语音队列、解码、停止播放等都用相应的API实现,函数原型在流程图中有详细的表示。

        
 
  采用Compress Tool工具压缩的S480格式的语音资源带有48字节的文件头,所以语音资源首地址还要加48跳过此文件头,然后调用两个初始化函数进行解码列队和解码器的初始化,最后进入循环。手动或自动播放方式选择的初始化在主程序中进行,解码器初始化就是选择D/A通道,可用两个通道之一,也可两个通道全用。

  在循环中首先读取语音队列状态,返回值0或1表示语音队列空或满。若语音队列不满,判断地址是否超出语音资源的结束地址,若未超出结束地址,则从SPR4096A取语音资源,将语音资源填入语音队列中等待解码处理,地址指针指向下一个地址单元;若已经超出结束地址,则退出填充队列循环。在解码播放前要读取语音播放的状态,返回值1或0表示正在播放或已播放结束,若播放已结束,则调用停止播放函数,结束循环。

  实际的语音播放是在TMA_FIQ中断源的中断服务子程序中调用函数F_FIQ_Service_SACM_S480实现的,它将解码后的数据送人D/A通道播放。中断子程序的编程、播放函数的详细介绍和其他相关函数如音量控制、暂停播放、恢复播放等见文献[1]。

  3.3主程序流程

  主程序流程如图4所示,对硬件及播音函数初始化后,循环执行语音数据解码播放和其他操作。文本输入并写入循环缓冲区的操作在串行口中断子程序中进行。为了不互相影响,这3个操作都不能占用太长时间。

上一页  [1] [2] [3]  下一页


Tag:电子制作电子小制作维修教程知识 - 电子制作