嵌入式TTS漢語(yǔ)語(yǔ)音系統的解決方案
在PC上制作寫(xiě)入的Flash的數據文件時(shí),首先將地址表放在最前面,其后將壓縮后的語(yǔ)音文件逐一寫(xiě)入,并將每個(gè)文件的起始地址轉換成對Flash存儲器操作的命令字寫(xiě)入地址表相應項中,每寫(xiě)完一個(gè)文件要加上01H結束碼,并在寫(xiě)入過(guò)程中完成對C區的填充。在綜合完1335個(gè)語(yǔ)音文件、地址查找表、C區填充碼及文件結束碼之后,得到Flash存儲器的二進(jìn)制映像文件,其大小為8047776字節。寫(xiě)入后,Flash中尚余后333KB可用空間,聯(lián)合地址表中的預留項,可用于對系統語(yǔ)音庫做進(jìn)一步的擴充。上述語(yǔ)音庫的存儲結構見(jiàn)圖4。
4 碼字轉換及高效MCU代碼的實(shí)現
本文中的碼字轉換有兩類(lèi)。一類(lèi)GB碼到語(yǔ)音庫起始字節數的轉換,用于MCU收到串口輸入的GB碼后,確定相應讀音在地線(xiàn)表中對應項的起始地址。該類(lèi)碼字轉換主要依據GB2312標準及語(yǔ)音庫地址表的結構進(jìn)行。本文中,該碼制轉換的算法為:((GB碼高字節-161)×94+(GB)碼低字節-161))×4。另一類(lèi)是將上述地址轉換為Flash讀取數據的命令字。這類(lèi)轉換與語(yǔ)音庫存儲結構及所用Flash存儲器的讀寫(xiě)操作及時(shí)序相關(guān)。由于在語(yǔ)音庫生成時(shí)已由PC機將語(yǔ)音數據的起始地址轉換為操作命令字并存儲到了地址表對應項中,即大部分的計算及時(shí)序控制操作在使用PC制作Flash的二進(jìn)制映像文件時(shí)已經(jīng)完成,因而避免了系統運行中的大量計算,從而保證了語(yǔ)音播放的實(shí)時(shí)性。計算命令字的方法與具體的Flash存儲器型號相關(guān)且較為繁瑣。限于篇幅,本文不再給出具體的算法。有興趣的讀者可以參閱K9F6408U0B的數據表。
本文中的MCU型號為AT89S52,使用22.1484MHz的晶振。根據AT89S52數據表,每播放一個(gè)漢字,所需指令周期數為(1/11025)/(12/22.1184)=167.2。因此設置一個(gè)計時(shí)器中斷,中斷值為256-167=89,在每?jì)蓚€(gè)中斷之間完成如下工作:
?。?) 從緩沖區中取得GB碼并將之轉換為地址表對應項地址;
?。?) 從地址表對應項中取得對應語(yǔ)音數據區存儲地址;
?。?) 取得對應語(yǔ)音數據區數據;
?。?) 完成游程解碼并播放。
此外,由于完成有可能在語(yǔ)音播放過(guò)程收以輸入字符,因而串口亦應工作于中斷方式,串口波特率為9600bps,其優(yōu)先級高于定時(shí)器中斷。本系統中,此緩沖區能滿(mǎn)足使用都 量多一次輸入60個(gè)漢字。以上操作均在約168個(gè)指令周期中完成,大約相當84條雙周期指令。因而在代碼編寫(xiě)中,必須把代 碼效率放在第一位,靈活地運用編程技巧來(lái)完成。
本文給出了一種嵌入式TTS漢語(yǔ)語(yǔ)音系統的實(shí)現方案。由于采用了易于解碼的改進(jìn)游程算法、多重查找表及Flash存儲器操作命令這了的預先存儲技術(shù),使得該方案可以在羅低要求的硬件平臺上實(shí)現,以AT89S52 MCU為核心的嵌入式TTS系統不同于基于PC的TTS語(yǔ)音系統,該系統體積小、功耗低、成本低廉、適用范圍很廣。經(jīng)測試其語(yǔ)音清晰、連貫,可發(fā)音字節涵蓋GB碼所有漢字、26個(gè)英文字節,一次可輸入多達60個(gè)漢字的整句,足以滿(mǎn)足大部分應用場(chǎng)合的需要。如以高檔MCU或ARM處理器為平臺,還可以增加更多的算法,以進(jìn)一步改進(jìn)系統性能。
評論