新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于SPCE061A的通用汉字文本播音系统

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

作者:黄丽敏,林洪艺,林聪仁时间:2008-05-14来源:《电子工程师》收藏

  0引言

本文引用地址:http://www.amcfsurvey.com/article/82556.htm

  语音播放系统应用日益广泛。播放的方法有录音芯片法、语音合成芯片法及库法等。Flash容量不断增大,利用Windows的Speech SDK可以方便地提取文件,因此汉字语音库法得以广泛应用。

  汉字语音库法可分为专用语音播放和通用语音播放两类。专用语音播放系统只存储少量固定的语音资源,只需较小的存储容量,但应用范围有限。通用语音播放系统存储所有不同读音汉字的单字语音资源,可实现任意文本组合的语音播放,适用于播放内容经常更新的场合。本系统由1220个不同读音汉字读音文件构成语音库,存于一片Flash中,实现了基于SPCE061A的通用汉字文本语音播放系统。系统硬件简单,使用方便,成本低廉,适用于公交车报站器等应用系统中。

  1硬件原理

  直接由汉字的wave读音文件构成的语音库占存储空间很大,语音文件压缩后,可使语音库数据占Flash空间大大减小。凌阳为语音播放提供了多种压缩算法,本系统采用码激励线性预测(CELP)编码的SACM_S480压缩算法,其压缩比例为80:3。压缩后的语音资源数据可存放在一片512 kB的Flash存储器中。

  普通为核心的语音播放系统硬件上需要较多的外围器件和电路,如存储器、D/A转换器等,软件上语音解压缩速度不快会影响其他操作。而若采用微处理器实现语音播放系统则成本太高。凌阳16位SPCE061A是一个最佳的选择,它带有DSP指令,将嵌入式语音系统所需的A/D、D/A等功能模块都集成在一个芯片中,具有很强的可编程音频处理功能。凌阳还提供SACM_LIB语音库(本系统使用SACMV26e.lib)可实现录音、播放和语音识别等功能。

  本系统硬件原理如图1所示,主要由SPCE061A和外部Flash存储器SPR4096A两个芯片组成。SPCE061A运行所有语音解码播放及其他操作的软件功能,它的D/A输出经音频功放SPY0030接扬声器。SPR4096A存储包括汉字读音序号索引表、语音资源地址索引表和语音资源数据的所有语音信息。

        
 
  通用文本语音播放有预先存储固定文本播放、接收文本后播放和实时文本播放等3种工作方式。实时文本播放方式对系统的软件处理能力的要求最高,最能检验系统的语音播放操作与其他操作的配合情况,故本系统采用实时文本播放的方式进行程序调试,即串行口输入汉字的同时进行文本播放,硬件上SPCE061A的UART与PC机的RS-232连接。

  SPCE061A有内置ICE(在线仿真器)调试接口,可实现在线仿真、调试和下载,程序调试非常方便,这也是选择SPCE061A的主要原因之一。硬件上ICE调试接口与PC机并行口连接。SPCE061A除可编程音频处理功能外,还具有丰富的I/O口、时钟源及中断源,Flash存储达32 k字,RAM有2 k字,在语音播放的同时还能进行复杂的控制操作。

  SPR4096A容量为512 k×8位,分256个扇区,每个扇区为2 kB,可配置为BMI(总线存储器接口)或SIF(串行接口总线)。为节省I/O口,本系统使用串行接口。此串行接口是凌阳自行定义的SIO接口,也用SCK和SDA两根信号线,但数据格式与I2C或SPI略有不同,SPCE061A的IOB0为时钟信号SCK,IOB1为数据信号SDA。

        
 
  2 Flash存储器数据结构

  GB 2312中的6 763个汉字有1 300多个不同读音,用Speech SDK制作汉字语音库可生成1 220个大小为20 kB的wave读音文件,其音频格式为PCM8 kHz 16 bit Mono,符合凌阳单片机对语音文件格式的要求。在保证读音完整性的前提下,每个wave读音文件裁减为6.5 kB。汉字语音库的制作,本文不做详细介绍,将另文发表。用凌阳的CompressTool工具将6.5 kB的wave读音文件压缩成S480格式(语音压缩编码类型为4.8 kbit/s)的语音文件,每个压缩语音数据文件包括文件头48字节和实际语音资源数据258字节共306字节,所以语音库数据总的大小为306×1 220=373 320字节。

  用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个操作都不能占用太长时间。

        
 
  文本输入与语音播放必须很好地配合,系统采用环形缓冲区来协调这两个操作。串行口中断子程序每接收一个汉字就填人环形缓冲区,并移动写入指针。语音播放前先利用读出指针和写入指针判断环形缓冲区内是否有2字节或2字节以上的数据,若无则可进行其他操作;若有再判断该数据是否为汉字机内码。若不是只移动读出指针;若是则移动读出指针,并调用汉字语音播放函数进行单个汉字的语音播放。因为主程序的处理过程足够快,所以若汉字输入是连续的,则播放也是连续平滑的。

  系统的其他操作如键盘扫描及按键处理、显示驱动及数据更新等,也必须能与文本语音播放协调配合。系统调试时,在主程序循环中插入一个键盘扫描程序,用按键控制音量增减、重复播放同一汉字等。因为一个汉字的解码播放和其他操作是交替进行的,所以进行其他操作时不能解码播放,解码播放时不能进行其他操作,这就要求其他操作执行时间不超过一个汉字的播放时间,否则会影响语音播放的实时性。另一方面,其他操作的间隔时间必须大于一个汉字播放时间,否则播放操作会影响其他操作。改进程序流程可以解决以上问题,若其他操作执行时间过长,可分解成几个操作与解码播放交替进行;若其他操作间隔时间要求较短,可将其他操作移到播放子程序的解码循环中,因为D/A输出频率为8 kHz,所以理论上每次循环时其他操作所用时间只要在0.125 ms以下就不会影响语音播放。

  4结束语

  本文实现了基于凌阳SPCE061A的通用汉字文本语音播放系统。实际应用中还有一些细节问题要考虑,多音字可用读音相同的汉字代替播放;若文本中夹有英语字母,只需在语音资源中加入字母发音数据,原理与汉字播音完全相同。本系统的最大优点是硬件简单,成本低廉,软件效率高。在播音的同时还能进行其他复杂的控制操作。

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


评论


相关推荐

技术专区

关闭