基于SPCE061A的通用漢字文本播音系統
0引言
本文引用地址:http://dyxdggzs.com/article/82556.htm嵌入式語(yǔ)音播放系統應用日益廣泛。漢字語(yǔ)音播放的方法有錄音芯片法、語(yǔ)音合成芯片法及漢字語(yǔ)音庫法等。Flash存儲器容量不斷增大,利用Windows的Speech SDK可以方便地提取漢字語(yǔ)音文件,因此漢字語(yǔ)音庫法得以廣泛應用。
漢字語(yǔ)音庫法可分為專(zhuān)用語(yǔ)音播放和通用語(yǔ)音播放兩類(lèi)。專(zhuān)用語(yǔ)音播放系統只存儲少量固定的語(yǔ)音資源,只需較小的存儲容量,但應用范圍有限。通用語(yǔ)音播放系統存儲所有不同讀音漢字的單字語(yǔ)音資源,可實(shí)現任意文本組合的語(yǔ)音播放,適用于播放內容經(jīng)常更新的場(chǎng)合。本系統由1220個(gè)不同讀音漢字讀音文件構成語(yǔ)音庫,存于一片Flash存儲器中,實(shí)現了基于SPCE061A的嵌入式通用漢字文本語(yǔ)音播放系統。系統硬件簡(jiǎn)單,使用方便,成本低廉,適用于公交車(chē)報站器等應用系統中。
1硬件原理
直接由漢字的wave讀音文件構成的語(yǔ)音庫占存儲空間很大,語(yǔ)音文件壓縮后,可使語(yǔ)音庫數據占Flash存儲器空間大大減小。凌陽(yáng)為語(yǔ)音播放提供了多種壓縮算法,本系統采用碼激勵線(xiàn)性預測(CELP)編碼的SACM_S480壓縮算法,其壓縮比例為80:3。壓縮后的語(yǔ)音資源數據可存放在一片512 kB的Flash存儲器中。
普通單片機為核心的語(yǔ)音播放系統硬件上需要較多的外圍器件和電路,如存儲器、D/A轉換器等,軟件上語(yǔ)音解壓縮速度不快會(huì )影響其他操作。而若采用嵌入式微處理器實(shí)現語(yǔ)音播放系統則成本太高。凌陽(yáng)16位單片機SPCE061A是一個(gè)最佳的選擇,它帶有DSP指令,將嵌入式語(yǔ)音系統所需的A/D、D/A等功能模塊都集成在一個(gè)芯片中,具有很強的可編程音頻處理功能。凌陽(yáng)還提供SACM_LIB語(yǔ)音庫(本系統使用SACMV26e.lib)可實(shí)現錄音、播放和語(yǔ)音識別等功能。
本系統硬件原理如圖1所示,主要由SPCE061A單片機和外部Flash存儲器SPR4096A兩個(gè)芯片組成。SPCE061A運行所有語(yǔ)音解碼播放及其他操作的軟件功能,它的D/A輸出經(jīng)音頻功放SPY0030接揚聲器。SPR4096A存儲包括漢字讀音序號索引表、語(yǔ)音資源地址索引表和語(yǔ)音資源數據的所有語(yǔ)音信息。
通用文本語(yǔ)音播放有預先存儲固定文本播放、接收文本后播放和實(shí)時(shí)文本播放等3種工作方式。實(shí)時(shí)文本播放方式對系統的軟件處理能力的要求最高,最能檢驗系統的語(yǔ)音播放操作與其他操作的配合情況,故本系統采用實(shí)時(shí)文本播放的方式進(jìn)行程序調試,即串行口輸入漢字的同時(shí)進(jìn)行文本播放,硬件上SPCE061A的UART與PC機的RS-232連接。
SPCE061A有內置ICE(在線(xiàn)仿真器)調試接口,可實(shí)現在線(xiàn)仿真、調試和下載,程序調試非常方便,這也是選擇SPCE061A的主要原因之一。硬件上ICE調試接口與PC機并行口連接。SPCE061A除可編程音頻處理功能外,還具有豐富的I/O口、時(shí)鐘源及中斷源,Flash存儲達32 k字,RAM有2 k字,在語(yǔ)音播放的同時(shí)還能進(jìn)行復雜的控制操作。
SPR4096A容量為512 k×8位,分256個(gè)扇區,每個(gè)扇區為2 kB,可配置為BMI(總線(xiàn)存儲器接口)或SIF(串行接口總線(xiàn))。為節省I/O口,本系統使用串行接口。此串行接口是凌陽(yáng)自行定義的SIO接口,也用SCK和SDA兩根信號線(xiàn),但數據格式與I2C或SPI略有不同,SPCE061A的IOB0為時(shí)鐘信號SCK,IOB1為數據信號SDA。
2 Flash存儲器數據結構
GB 2312中的6 763個(gè)漢字有1 300多個(gè)不同讀音,用Speech SDK制作漢字語(yǔ)音庫可生成1 220個(gè)大小為20 kB的wave讀音文件,其音頻格式為PCM8 kHz 16 bit Mono,符合凌陽(yáng)單片機對語(yǔ)音文件格式的要求。在保證讀音完整性的前提下,每個(gè)wave讀音文件裁減為6.5 kB。漢字語(yǔ)音庫的制作,本文不做詳細介紹,將另文發(fā)表。用凌陽(yáng)的CompressTool工具將6.5 kB的wave讀音文件壓縮成S480格式(語(yǔ)音壓縮編碼類(lèi)型為4.8 kbit/s)的語(yǔ)音文件,每個(gè)壓縮語(yǔ)音數據文件包括文件頭48字節和實(shí)際語(yǔ)音資源數據258字節共306字節,所以語(yǔ)音庫數據總的大小為306×1 220=373 320字節。
用ResWriter工具V2.0可將壓縮后的1 220個(gè)S480語(yǔ)音數據文件燒錄入SPR4096A中。ResWriter根據文件總數和每個(gè)文件大小,在最低地址生成一個(gè)語(yǔ)音資源地址索引表。索引表分兩大部分:第1部分14字節,是整個(gè)語(yǔ)音資源的總信息,包括4字節的標識碼SPRW(Sunplus Read Write)4字節的起始地址、4字節的結束地址和2字節的文件總數;第2部分為每個(gè)文件的信息,共1 220項,分別對應一個(gè)文件,每項12字節,包括4字節的長(cháng)度、4字節的起始地址和4字節的結束地址。所以此索引表的大小為14+12×1220=14 654字節。
要根據文本中每個(gè)漢字內碼找到語(yǔ)音數據地址,還必須有漢字讀音序號索引表。此表在語(yǔ)音庫制作的同時(shí)生成,共6 763項,按GB 2312順序每項對應一個(gè)漢字在1 220個(gè)讀音文件的序號,用2字節表示,總大小為13 526字節,占用7個(gè)扇區。另編一個(gè)小程序,將此表寫(xiě)入Flash存儲器最底部的7個(gè)扇區,即從地址0x7C800開(kāi)始。Flash存儲器還剩59個(gè)空白扇區,可供其他數據寫(xiě)入。
漢字讀音序號索引表、語(yǔ)音資源地址索引表和語(yǔ)音資源數據的總長(cháng)度為392 kB,存儲在SPR4096A中,結構如圖2所示,所有地址和長(cháng)度數據均為高字節在前,低字節在后,用十六進(jìn)制表示。當然,漢字讀音序號索引表也可存放在SPCE061A的內部Flash存儲器中,這樣編程較簡(jiǎn)單,但會(huì )多占用程序存儲器空間。
3軟件流程
3.1漢字語(yǔ)音資源地址的計算
由漢字機內碼計算漢字語(yǔ)音資源的起始地址和結束地址分為以下2步:
a)由公式:(機內碼高字節WH-0xB0)×94+(機內碼低字節WL-0xA1),計算出漢字在漢字讀音序號索引表中的偏移值(設為M),在0x7C800+2*(M-1)地址處查得漢字讀音序號(設為N)。
b)由漢字讀音序號N,在語(yǔ)音資源地址索引表中從0x12+0xC*(N-1)地址開(kāi)始查得該漢字的語(yǔ)音資源數據的起始地址和結束地址。
3.2漢字語(yǔ)音資源播放
以語(yǔ)音資源的起始地址和結束地址為參數,調用SACM_S480中相應的API函數就可實(shí)現語(yǔ)音播放,流程如圖3所示。
凌陽(yáng)語(yǔ)音播放有自動(dòng)和手動(dòng)兩種API,由于語(yǔ)音資源存儲在外部SPR4096A中,需先讀出并存入內部RAM中才能解碼,故只能采用手動(dòng)方式播放語(yǔ)音,初始化、讀取資源數據、填充語(yǔ)音隊列、解碼、停止播放等都用相應的API實(shí)現,函數原型在流程圖中有詳細的表示。
采用Compress Tool工具壓縮的S480格式的語(yǔ)音資源帶有48字節的文件頭,所以語(yǔ)音資源首地址還要加48跳過(guò)此文件頭,然后調用兩個(gè)初始化函數進(jìn)行解碼列隊和解碼器的初始化,最后進(jìn)入循環(huán)。手動(dòng)或自動(dòng)播放方式選擇的初始化在主程序中進(jìn)行,解碼器初始化就是選擇D/A通道,可用兩個(gè)通道之一,也可兩個(gè)通道全用。
在循環(huán)中首先讀取語(yǔ)音隊列狀態(tài),返回值0或1表示語(yǔ)音隊列空或滿(mǎn)。若語(yǔ)音隊列不滿(mǎn),判斷地址是否超出語(yǔ)音資源的結束地址,若未超出結束地址,則從SPR4096A取語(yǔ)音資源,將語(yǔ)音資源填入語(yǔ)音隊列中等待解碼處理,地址指針指向下一個(gè)地址單元;若已經(jīng)超出結束地址,則退出填充隊列循環(huán)。在解碼播放前要讀取語(yǔ)音播放的狀態(tài),返回值1或0表示正在播放或已播放結束,若播放已結束,則調用停止播放函數,結束循環(huán)。
實(shí)際的語(yǔ)音播放是在TMA_FIQ中斷源的中斷服務(wù)子程序中調用函數F_FIQ_Service_SACM_S480實(shí)現的,它將解碼后的數據送人D/A通道播放。中斷子程序的編程、播放函數的詳細介紹和其他相關(guān)函數如音量控制、暫停播放、恢復播放等見(jiàn)文獻[1]。
3.3主程序流程
主程序流程如圖4所示,對硬件及播音函數初始化后,循環(huán)執行語(yǔ)音數據解碼播放和其他操作。文本輸入并寫(xiě)入循環(huán)緩沖區的操作在串行口中斷子程序中進(jìn)行。為了不互相影響,這3個(gè)操作都不能占用太長(cháng)時(shí)間。
文本輸入與語(yǔ)音播放必須很好地配合,系統采用環(huán)形緩沖區來(lái)協(xié)調這兩個(gè)操作。串行口中斷子程序每接收一個(gè)漢字就填人環(huán)形緩沖區,并移動(dòng)寫(xiě)入指針。語(yǔ)音播放前先利用讀出指針和寫(xiě)入指針判斷環(huán)形緩沖區內是否有2字節或2字節以上的數據,若無(wú)則可進(jìn)行其他操作;若有再判斷該數據是否為漢字機內碼。若不是只移動(dòng)讀出指針;若是則移動(dòng)讀出指針,并調用漢字語(yǔ)音播放函數進(jìn)行單個(gè)漢字的語(yǔ)音播放。因為主程序的處理過(guò)程足夠快,所以若漢字輸入是連續的,則播放也是連續平滑的。
系統的其他操作如鍵盤(pán)掃描及按鍵處理、顯示驅動(dòng)及數據更新等,也必須能與文本語(yǔ)音播放協(xié)調配合。系統調試時(shí),在主程序循環(huán)中插入一個(gè)鍵盤(pán)掃描程序,用按鍵控制音量增減、重復播放同一漢字等。因為一個(gè)漢字的解碼播放和其他操作是交替進(jìn)行的,所以進(jìn)行其他操作時(shí)不能解碼播放,解碼播放時(shí)不能進(jìn)行其他操作,這就要求其他操作執行時(shí)間不超過(guò)一個(gè)漢字的播放時(shí)間,否則會(huì )影響語(yǔ)音播放的實(shí)時(shí)性。另一方面,其他操作的間隔時(shí)間必須大于一個(gè)漢字播放時(shí)間,否則播放操作會(huì )影響其他操作。改進(jìn)程序流程可以解決以上問(wèn)題,若其他操作執行時(shí)間過(guò)長(cháng),可分解成幾個(gè)操作與解碼播放交替進(jìn)行;若其他操作間隔時(shí)間要求較短,可將其他操作移到播放子程序的解碼循環(huán)中,因為D/A輸出頻率為8 kHz,所以理論上每次循環(huán)時(shí)其他操作所用時(shí)間只要在0.125 ms以下就不會(huì )影響語(yǔ)音播放。
4結束語(yǔ)
本文實(shí)現了基于凌陽(yáng)SPCE061A的通用漢字文本語(yǔ)音播放系統。實(shí)際應用中還有一些細節問(wèn)題要考慮,多音字可用讀音相同的漢字代替播放;若文本中夾有英語(yǔ)字母,只需在語(yǔ)音資源中加入字母發(fā)音數據,原理與漢字播音完全相同。本系統的最大優(yōu)點(diǎn)是硬件簡(jiǎn)單,成本低廉,軟件效率高。在播音的同時(shí)還能進(jìn)行其他復雜的控制操作。
linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)
評論