《電子技術(shù)應用》
您所在的位置:首頁 > 嵌入式技術(shù) > 業(yè)界動態(tài) > 嵌入式TTS漢語語音系統(tǒng)的設計與實現(xiàn)

嵌入式TTS漢語語音系統(tǒng)的設計與實現(xiàn)

2008-10-16
作者:張丞昭 冉立新

  摘 要: 通過使用改進的游程編碼算法,、多重查找表" title="查找表">查找表設計及預存儲命令字等技術(shù),,實現(xiàn)了一種適用于廣泛硬件平臺的嵌入式" title="的嵌入式">的嵌入式TTS漢字語音系統(tǒng)" title="語音系統(tǒng)">語音系統(tǒng),其可發(fā)音字符涵蓋了GB2312漢字編碼字符集,。
  關(guān)鍵詞: TTS 改進游程編碼 多重查找表


  語言是人與人交流信息的一種手段,。使計算機、帶有人機交互的電器,、儀表等能像人一樣開口“說話”是科技工作者多年的研究目標,。文語轉(zhuǎn)換TTS(Text To Speech)是自動將輸入文字轉(zhuǎn)換成語音輸出,并盡量使輸出的語音效果流暢,、自然的一類技術(shù),。TTS系統(tǒng)主要需解決兩個問題:①文本分析,即語言學分析,。該任務是將以文本方式輸入的字符串轉(zhuǎn)換成語言學的表述,;②語音合成。即根據(jù)語言學的內(nèi)在表述信息合成語音,。TTS系統(tǒng)中的語音合成方法分為時域和頻域兩大類:頻域方法主要有LPC參數(shù)合成及共振峰合成兩種,,其實質(zhì)是在工程上實現(xiàn)語音生成模型,,進而在終端特性上模擬發(fā)音器官,。在目前階段,頻域方法形成的發(fā)音尚不自然,且需要的計算量很大,不適宜在低端的嵌入式芯片上使用。波形編輯法是將較短的數(shù)字音頻段(即合成基元)拼接并進行段間平滑后生成連續(xù)語流的方法,。這種方法占用的存儲空間大,,但計算量小、計算速度快,,而且合成語音自然度較高,顯然比較適合于芯片性能較弱的嵌入式系統(tǒng)方面的應用,。
  采用波形編輯法的嵌入式TTS系統(tǒng)由于成本低、性能完善,、自然度高,,隨著波形修改算法的不斷提出以及微處理器和非易失性存儲介質(zhì)功能的不斷增強,正日益受到人們的關(guān)注,。本系統(tǒng)即采用時域波形編輯技術(shù),采集GB2312漢字編碼字符集中所有字符發(fā)音作為原始材料,,通過使用改進的游程編碼算法[1]壓縮生成可適用于當前Flash存儲器的語音庫,并采用多重查找表設計及預存儲命令字技術(shù)有效地加快語音庫的尋址速度,在基于Atmel公司的AT89S52[3]單片機上成功實現(xiàn)了一個TTS語音系統(tǒng),,經(jīng)測試取得了令人滿意的效果,。該系統(tǒng)應用簡便,具有很小的尺寸和很低的功耗及通用的串行接口,,可以廣泛用于有關(guān)的漢語語音應用系統(tǒng)中,。
1 系統(tǒng)原理
  圖1為系統(tǒng)原理圖框圖以及主要操作流程。系統(tǒng)采用串行口與外界交互,,任何具有標準串口" title="串口">串口的設備均可與本系統(tǒng)相連,。欲發(fā)音漢字的國標碼(GB碼)由串口送入MCU,MCU將其映射為Flash存儲器地址表中對應項的地址,然后根據(jù)此地址取得對應項中的命令字,由MCU根據(jù)該命令字讀取該漢字發(fā)音對應的語音數(shù)據(jù),連續(xù)讀出語音數(shù)據(jù)并以游程碼解碼算法解碼后,,按照語音采樣時的固定速率通過D/A轉(zhuǎn)換和功率放大播放,。本文中語音采樣速率為11025B/s。為滿足應用需求,,本文首先構(gòu)建易于快速解碼的語音庫,,根據(jù)特定Flash存儲器的存儲格式,以快速多重查找表尋址及命令字預先存儲的方式組織并存儲在Flash存儲器中,,以滿足語音播放的實時要求,。同樣,MCU的代碼也要優(yōu)先考慮速度而犧牲諸如模塊化、可讀性方面的要求,。最后,出于實用性考慮,系統(tǒng)中需加入足夠的輸入緩沖區(qū)支持,,以滿足一次輸入多個漢字或整句的要求。


2 原始語音數(shù)據(jù)的采集和處理
  本系統(tǒng)共采集了1335種發(fā)音,內(nèi)含1306個漢字發(fā)音,,26個英文字母發(fā)音及3個停頓音,,語音采集卡AD轉(zhuǎn)換速率11025B/s,分辨率8位,,樣本值域0~255,靜默值為80H,。原始語音以WAV文件的格式保存在PC機中,。
  圖2是“哎”音樣本的時域波形。所有的采集樣本除具有不同的波形包絡外,,均具有大體相同的結(jié)構(gòu),,即一個完整的漢字發(fā)音均由前后兩個靜音部分和中間的發(fā)音部分組成。靜音的采樣值絕大多數(shù)為80H(一些輕微擾動可視為錄音過程中的噪聲,,但尾音部分要另外處理),,因而可將其統(tǒng)一為80H,以提高壓縮比。另由圖2可見,00H,、01H,、FFH、FEH這些邊緣值的出現(xiàn)概率也是很小的,,這個特性亦可用于語音的壓縮算法中,。


  本文根據(jù)上述靜默值及邊緣值的分布特點,提出了一種改進的游程編碼用于語音數(shù)據(jù)的壓縮,,具體做法是:用00H代表游程壓縮起始碼,其后是被編碼字符,再下一個字節(jié)是被編碼字符的重復碼,,如:80 80 80 80 80 可以表示為00 80 05。顯然,游程長度小于等于3時沒有編碼的必要,因而不會出現(xiàn)值為00H,、01H和02H的重復碼,。如上所述,在原始語音文件中,00H、01H這些邊緣值是基本不出現(xiàn)的,。因為大量出現(xiàn)這些邊緣值即意味著語音采集系統(tǒng)的動態(tài)范圍設置錯誤,。盡管如此,為確保原始語音文件中沒有“多余”邊緣值,,需要將語音文件略做處理,,將可能存在的00H和01H都改為02H,顯然這樣的處理并不會影響語音的實際播放效果,。處理后的00H,、01H即可作為特殊控制字符使用。圖3是本文提出的改進游程壓縮編碼的流程圖,。編碼前,1335種原始語音樣本的大小為14978622字節(jié),壓縮后為7767112字節(jié),,壓縮比超過50%。該語音庫已經(jīng)可以裝入容量為8M字節(jié)的Flash存儲器中,。


3 語音庫的存儲結(jié)構(gòu)
  本文以8Mbit×8位NAND型Flash存儲器K9F6408U0B為例,,描述本系統(tǒng)語音庫的存儲結(jié)構(gòu)" title="存儲結(jié)構(gòu)">存儲結(jié)構(gòu)。
  語音庫的基本內(nèi)容分為兩部分:前端是地址查找表,其后是壓縮后的語音數(shù)據(jù),。地址表中,每4個字節(jié)代表一個地址項,。GB2312漢字編碼字符集中每個漢字在地址表中都有一個對應項,其內(nèi)容指向該漢字對應讀音的語音數(shù)據(jù)起始地址。GB碼字符集中共有94個區(qū),每區(qū)94個字符,總計8836個漢字,、英文字母和其它符號,其中實際使用了7445個,余下的作為預留區(qū),。本系統(tǒng)亦保留了這些預留區(qū),以利于將來的擴充,。這樣,地址表的大小為94×94×4=35344字節(jié),。語音數(shù)據(jù)區(qū)共存儲1335個發(fā)音,采用游程編碼壓縮存放,,并在每段語音數(shù)據(jù)結(jié)尾添加01H作為結(jié)束控制符,。
  對不同的Flash存儲器,,語音庫需做一些針對性的處理。對于K9F6408U0B而言,,要對其C區(qū)進行專門的處理,。該芯片中,每個頁面(Page)都有A,、B,、C三個區(qū),其中A,、B區(qū)各256字節(jié),而C區(qū)僅有16字節(jié),。本設計中沒有用到C區(qū),因而在制作寫入Flash的二進制語音庫文件時必須注意對C區(qū)進行空白碼(FFH)填充,??紤]C區(qū)填充后,地址表對應的二進制語音庫文件大小的計算方法改為:512×69+16=35344,,表示當35344字節(jié)只占據(jù)A區(qū)和B區(qū)時共需69個頁面,多出16字節(jié),。這意味著有69個C區(qū)需要填充,即寫入Flash的地址表的實際大小應該是35344+69×16=36448。相應地,,語音數(shù)據(jù)區(qū)需要進行同樣的處理,。
  在PC上制作寫入Flash的數(shù)據(jù)文件時,首先將地址表放在最前面,其后將壓縮后的語音文件逐一寫入,并將每個文件的起始地址轉(zhuǎn)換成對Flash存儲器操作的命令字寫入地址表相應項中,每寫完一個文件要加上01H結(jié)束碼,并在寫入過程中完成對C區(qū)的填充,。在綜合完1335個語音文件,、地址查找表、C區(qū)填充碼及文件結(jié)束碼之后,得到Flash存儲器的二進制映像文件,其大小為8047776字節(jié),。寫入后,,F(xiàn)lash中尚余近333KB可用空間,聯(lián)合地址表中的預留項,可用于對系統(tǒng)語音庫做進一步的擴充。上述語音庫的存儲結(jié)構(gòu)見圖4,。


4 碼字轉(zhuǎn)換及高效MCU代碼的實現(xiàn)
  本文中的碼字轉(zhuǎn)換有兩類,。一類GB碼到語音庫起始字節(jié)數(shù)的轉(zhuǎn)換,用于MCU收到串口輸入的GB碼后,確定相應讀音在地址表中對應項的起始地址。該類碼字轉(zhuǎn)換主要依據(jù)GB2312標準及語音庫地址表的結(jié)構(gòu)進行,。本文中,,該碼制轉(zhuǎn)換的算法為:((GB碼高字節(jié)-161)×94+(GB碼低字節(jié)-161))×4。另一類是將上述地址轉(zhuǎn)換為Flash讀取操作的命令字,。這類轉(zhuǎn)換與語音庫存儲結(jié)構(gòu)及所用Flash存儲器的讀寫操作及時序相關(guān),。由于在語音庫生成時已由PC機將語音數(shù)據(jù)的起始地址轉(zhuǎn)換為操作命令字并存儲到了地址表對應項中,即大部分的計算及時序控制操作在使用PC制作Flash的二進制映像文件時已經(jīng)完成,,因而避免了系統(tǒng)運行中的大量計算,從而保證了語音播放的實時性,。計算命令字的方法與具體的Flash存儲器型號相關(guān)且較為繁瑣,。限于篇幅,本文不再給出具體的算法,。有興趣的讀者可以參閱K9F6408U0B的數(shù)據(jù)表[2],。
  本文中的MCU型號為AT89S52,使用22.1184MHz的晶振。根據(jù)AT89S52數(shù)據(jù)表[5],,每播放一個漢字,所需指令周期數(shù)為(1/11025)/(12/22.1184)=167.2,。因此設置一個計時器中斷,中斷值為256-167=89,在每兩個中斷之間完成如下工作:
  (1)從緩沖區(qū)中取得GB碼并將之轉(zhuǎn)換為地址表對應項地址;
  (2)從地址表對應項中取得對應語音數(shù)據(jù)區(qū)存儲地址,;
  (3)取得對應語音數(shù)據(jù)區(qū)數(shù)據(jù),;
  (4)完成游程解碼并播放,。
  此外,由于完全有可能在語音播放過程中收到輸入字符,因而串口亦應工作于中斷方式,串口波特率為9600bps,其優(yōu)先級高于定時器中斷。本系統(tǒng)中,此緩沖區(qū)能滿足使用者最多一次輸入60個漢字。以上操作均在約168個指令周期中完成,,大約相當84條雙周期指令,。因而在代碼編寫中,必須把代碼效率放在第一位,靈活地運用編程技巧來完成,。
  本文給出了一種嵌入式TTS漢語語音系統(tǒng)的實現(xiàn)方案,。由于采用了易于解碼的改進游程算法、多重查找表及Flash存儲器操作命令字的預先存儲技術(shù),,使得該方案可以在較低要求的硬件平臺上實現(xiàn),。以AT89S52 MCU為核心的嵌入式TTS系統(tǒng)不同于基于PC的TTS語音系統(tǒng),該系統(tǒng)體積小、功耗低,、成本低廉,、適用范圍很廣。經(jīng)測試其語音清晰,、連貫,可發(fā)音字符涵蓋GB碼所有漢字,、26個英文字母,一次可輸入多達60個漢字的整句,,足以滿足大部分應用場合的需要,。如以高檔MCU或ARM處理器為平臺,還可以增加更多的算法,,以進一步改進系統(tǒng)性能,。
參考文獻
1 薩洛蒙. 數(shù)據(jù)壓縮原理與應用. 第2版. 北京:電子工業(yè)出版社,2003
2 Samsung Corp. K9F6408U0B-TCB0, K9F6408U0B-TIB0 FLASH MEMORY. http://www.samsung.com/Products/Semiconductor/Flash/NAND/64Mbit/K9F6408U0B/ds_k9f6408u0b.pdf
3 Atmel Corp. 8-bit Microcontroller with 8K Bytes In-System Programmable Flash AT89S52. http://www.atmel.com/dyn/resources/prod_documents/doc1919.pdf

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,,并不代表本網(wǎng)站贊同其觀點。轉(zhuǎn)載的所有的文章、圖片,、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有,。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認版權(quán)者。如涉及作品內(nèi)容,、版權(quán)和其它問題,,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,,避免給雙方造成不必要的經(jīng)濟損失,。聯(lián)系電話:010-82306118;郵箱:[email protected],。