基于嵌入式TTS的漢語(yǔ)語(yǔ)音系統的方案設計
使計算機、帶有人機交互的電器、儀表等能像人一樣開(kāi)口“說(shuō)話(huà)”是科技工作者多年的研究目標。語(yǔ)言是人與人交流信息的一種手段,文語(yǔ)轉換TTS(Text To Speech)是自動(dòng)將輸入文字轉換成語(yǔ)音輸出,并盡量使輸出的語(yǔ)音效率流暢、自然的一類(lèi)技術(shù)。
本文引用地址:http://dyxdggzs.com/article/149878.htmTTS系統主要需解決兩個(gè)問(wèn)題:
①文本分析,即語(yǔ)言學(xué)分析。該任務(wù)是將以文本廣度輸入的字符串轉換成語(yǔ)言學(xué)的表述;
②語(yǔ)音合成。即根據語(yǔ)言學(xué)的內在表述信息合成語(yǔ)音。
TTS系統中的語(yǔ)音合成方法分為時(shí)域和頻域兩大類(lèi):頻域方法主要有LPC參數合成及其振峰合成兩種,其實(shí)質(zhì)是在工程上實(shí)現語(yǔ)音生成模型,進(jìn)而在終端特性上模擬發(fā)音器官。在目前階段,頻域方法形成的發(fā)音尚不自然,且需要的計算量很大,不適宜在低端的嵌入式芯片上使用。波形編輯法是將較短的數字音頻段(即合成基元)拼接并進(jìn)行段音平滑后生成連續語(yǔ)流的方法。這種方法占用的存儲空間大,但計算量小、計算速度快,而且合成語(yǔ)音自然度較高,顯然比較適合于芯片性能較弱的嵌入式系統方面的應用。
采用波形編輯法的嵌入式TTS系統由于成本低、性能完善、自然度高,隨著(zhù)波形修改算法的不斷提出以及微處理器和非易失性存儲介質(zhì)功能的不斷增強,正日益受到人們的關(guān)注。本系統即采用時(shí)域波形編輯技術(shù),采集GB2312漢字編碼字符集中所有字符發(fā)音作為原始材料,通過(guò)使用改進(jìn)的游程編碼算法壓縮生成可適用于當前Flash存儲器的語(yǔ)音庫,并采用多重查找表設計及預存儲命令字技術(shù)有效地加快語(yǔ)音庫的尋址速度,在基于Atmel公司的AT89S52單片機上成功實(shí)現了一個(gè)TTS語(yǔ)音系統,經(jīng)測試取得了令人滿(mǎn)意的效果。該系統應用簡(jiǎn)便,具有很小的尺寸和很低的功耗及通用的串行接口,可以廣泛用于有關(guān)的漢語(yǔ)語(yǔ)音應用系統中。
1 系統原理
圖1為系統原理圖框圖以及主要操作流程。系統采用串行口與外界交互,任何具有標準串口的設備均可與本系統相連。欲發(fā)音漢字的國標碼(GB碼)由串口送入MCU,MCU將其映射為Flash存儲器地址表中對應項的地址,然后根據此地址取得對應項中的命令字,由MCU根據該命令字讀取該漢字發(fā)音對應的語(yǔ)音數據,連續讀出語(yǔ)音數據并以游程碼解碼算法解碼后,按照語(yǔ)音采樣時(shí)的固定速率通過(guò)D/A轉換和功率放大播放。本文中語(yǔ)音采樣速率為11025B/s。為滿(mǎn)足應用需求,本文首先構建易于快速解碼的語(yǔ)音庫,根據特定Flash存儲器的存儲格式,以快速多查找表尋址及命令字預先存儲的方式組織并存儲在Flash存儲器中,以滿(mǎn)足語(yǔ)音播放的實(shí)時(shí)要求。同樣,MCU的代碼也要優(yōu)先考慮速度而犧牲諸如模塊化、可讀性方面的要求。最后,出于實(shí)用性考慮,系統中需加入足夠的輸入緩沖區支持,以滿(mǎn)足一次輸入多個(gè)流字或整句的要求。
原始語(yǔ)音數據的采集和處理
本系統共采集了1335種發(fā)音,內含1306個(gè)流字發(fā)音,26個(gè)英文字母發(fā)音及3個(gè)停頓音,語(yǔ)音采集卡AD轉換整編11025B/s,分辨率8位,樣本值域0~255,靜默值為80H。原始語(yǔ)音以WAV文件的格式保存在PC機中。
圖2是“哎”音樣本的時(shí)域波形。所有的采集樣本除具有不同的波形包絡(luò )外,均具有大體相同的結構,即一個(gè)完整的漢字發(fā)音均由前后兩個(gè)靜音部分和中間的發(fā)音部分組成。靜音的采集值絕大多數為80H(一些輕微擾動(dòng)可視為錄音過(guò)程中的噪聲,但尾音部分要另外處理),因而可將其統一為80H,以提高壓縮比。另由圖2可見(jiàn),00H、01H、FFH、FEH這些邊緣值的出現概率是很小的,這個(gè)特性亦可用于語(yǔ)音的壓縮算法中。
本文根據上述靜默值及邊緣值的分布特點(diǎn),提出了一種改進(jìn)的游程編碼用于語(yǔ)音數據的壓縮,具體做法是:用00H代表游程壓縮起始碼,其后是被編碼字符,再下一個(gè)字節是被編碼字符的重復碼,如:80 80 80 80 80可以表示為00 80 05。顯然,游程長(cháng)度小于等于3時(shí)沒(méi)有編碼的必要,因而不會(huì )出現值為00H、01H和02H的重復碼。如上所述,在原始語(yǔ)音文件中,00H、01H這些邊緣值是基本上不出現的。因為大量出現這些邊緣值即意味著(zhù)語(yǔ)音采集系統的動(dòng)態(tài)范圍設置錯誤。盡管如此,為確保原始語(yǔ)音文件中沒(méi)有“多余”邊緣值,需要將語(yǔ)音文件略做處理,將可能存在的00H和01H都改為02H,顯然這樣的處理并不會(huì )影響語(yǔ)音的實(shí)際播放效果。處理后的00H、01H即可作為特殊控制字符使用。圖3是本文提出的改進(jìn)流程壓縮編碼的流程圖。編碼前,1335種原始語(yǔ)音樣本的大小為14978622字節,壓縮后為7767112字節,壓縮比超過(guò)50%。該語(yǔ)音庫已經(jīng)可以裝入容量為8M字節的Flash存儲器中。
3 語(yǔ)音庫的存儲結構
本文以8Mbit×8位NAND型Flash存儲器K9F6408U0B為例,描述本系統語(yǔ)音庫的存儲結構。
語(yǔ)音庫的基本內容分為兩部分:前端是地址查找表,其后是壓縮后的語(yǔ)音數據。地址表中,每4個(gè)字節代表一個(gè)地址項。GB2312漢字編碼字符集中每個(gè)漢字在地址表中都有一個(gè)對應項,其內容指向該漢字對應讀音的語(yǔ)音數據起始地址。GB碼字符集中共有94個(gè)區,每區94個(gè)字符,總計8836個(gè)漢字、英文字母和其它符號,其中實(shí)際使用了7445個(gè),余下的作為預留區。本系統亦保留了這些預留區,以利于將來(lái)的擴充。這樣,地址表的大小為94×94×4=35344字節。語(yǔ)音數據區共存儲1335年發(fā)音,采用流程編碼壓縮存放,并在每段語(yǔ)音數據結尾添加01H作為結束控制符。
對不同的Flash存儲器,語(yǔ)音庫需做一些針對性的處理。對于K9F6408U0B而言,要對其C區進(jìn)行專(zhuān)門(mén)的處理。該芯片中,每個(gè)頁(yè)面(Page)都有A、B、C三個(gè)區,其中A、B區各256字節,而C區僅有16字節。本設計中沒(méi)有用到C區,因而在制作寫(xiě)入Flash的二進(jìn)制政府間庫文件時(shí)必須注意對C區進(jìn)行空白碼(FFH)填充??紤]C區填充后,地址表對應的二進(jìn)制語(yǔ)音庫文件大小的計算方法改為:512×69+16=35344,表示當35344字節只占據A區和B區時(shí)共需69個(gè)頁(yè)面,多出16字節。這意味著(zhù)有69個(gè)C區需要填充,即寫(xiě)入Flash的地址表的實(shí)際大小應該是35344+69×16=36448。相應地,語(yǔ)音數據區需要進(jìn)行同樣的處理。
評論