DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 643|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-1-22 00:17:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    0引言
  嵌入式语音播放系统应用日益广泛。汉字语音播放的方法有录音芯片法、语音合成芯片法及汉字语音库法等。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的通用汉字文本语音播放系统。实际应用中还有一些细节问题要考虑,多音字可用读音相同的汉字代替播放;若文本中夹有英语字母,只需在语音资源中加入字母发音数据,原理与汉字播音完全相同。本系统的最大优点是硬件简单,成本低廉,软件效率高。在播音的同时还能进行其他复杂的控制操作。
                          
                       
                          
                               
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2024-11-16 10:21 , 耗时 0.088617 秒, 18 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表