版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、 綜合課程設(shè)計(jì)報(bào)告題 目 文檔自動(dòng)讀播器 姓 名 學(xué) 號 院 (系) 工程與設(shè)計(jì)學(xué)院 專業(yè)、年級 指導(dǎo)教師 2015年 月 日【 摘 要 】目前大多數(shù)的閱讀器只能使人們從視覺方面獲得信息因此現(xiàn)有的閱讀器不能足盲人這個(gè)群體的需求。將語音合成技術(shù)應(yīng)用到閱讀器當(dāng)中, 使人們從視覺獲取信息內(nèi)容轉(zhuǎn)換到聽覺, 正是解決這一問題。文章介紹了一個(gè)漢字語音庫的實(shí)現(xiàn), 并且制定了基于這個(gè)語音庫的由漢字機(jī)內(nèi)碼到漢字讀音的訪問方法 ?!娟P(guān)鍵詞】漢字語音庫 ; 漢字內(nèi)碼一、引言文本語音轉(zhuǎn)換是將文字形式的信息轉(zhuǎn)換成自然語音的一項(xiàng)技術(shù),在人機(jī)語音交流文字信息處理領(lǐng)域有著廣泛的應(yīng)用。本設(shè)計(jì)就是利用計(jì)算機(jī)word文檔中給定的漢
2、字文本信息轉(zhuǎn)換成漢語語音。在計(jì)算機(jī)中漢字的機(jī)內(nèi)碼是唯一的,而由漢字輸入碼到漢字機(jī)內(nèi)碼的轉(zhuǎn)換可以通過查閱輸人碼對照表實(shí)現(xiàn),由此聯(lián)想到可以在得到漢字的機(jī)內(nèi)碼后通過查閱某種表格經(jīng)過某種轉(zhuǎn)換得到該漢字的聲音。二、設(shè)計(jì)思想實(shí)現(xiàn)漢語轉(zhuǎn)換系統(tǒng)主要完成兩項(xiàng)工作:第一,建立一個(gè)語音庫, 記錄普通話中所有漢字的讀音; 第二, 建立漢字機(jī)內(nèi)碼到漢字讀音的訪問方法, 實(shí)現(xiàn)由輸入的漢字機(jī)內(nèi)碼得到該漢字的讀音。具體而言, 首先將所有漢字的聲音文件錄好, 分別取對應(yīng)的文字編碼名字。根據(jù)word文檔內(nèi)的漢字進(jìn)行編碼轉(zhuǎn)換,根據(jù)對應(yīng)編碼播放對應(yīng)的音頻文件。從而實(shí)現(xiàn)了漢字到語音的實(shí)現(xiàn)。三、語音庫的實(shí)現(xiàn)。在普通話中實(shí)際存在的發(fā)音有1
3、333種,常用漢字及一級漢字的讀音有1085種,我們要將這1085個(gè)語音分別錄制成1085個(gè)獨(dú)立的WAV文件,將每一個(gè)讀音文件取名為對應(yīng)的區(qū)位碼(如“阿”的區(qū)位碼為1601則將文件取名為1601)。將全部文件存放在工程文件夾下面,方面調(diào)用。四、漢字讀音的訪問方法的實(shí)現(xiàn)。所謂編碼, 是以固定的順序排列字符, 并以此作為記錄、存儲(chǔ)、傳遞、交換的統(tǒng)一內(nèi)部特征。一個(gè)漢字有ASCII碼、區(qū)位碼等與之對應(yīng)。我們先將文本中的每一個(gè)字用代碼:byte bytes = (String.valueOf(cn).getBytes();轉(zhuǎn)換成字節(jié)儲(chǔ)存在字節(jié)數(shù)組里面,判斷是英文字符還是漢字字符,中文字符要兩個(gè)字節(jié)儲(chǔ)存,
4、所以每一個(gè)漢字都是由“bytes0”和“bytes1”組成。每個(gè)漢字在GB2312中都能用區(qū)位碼表示,區(qū)位碼用4位數(shù)字表示前兩位從01到94稱區(qū)碼,后兩位從01到94稱位碼。如“劉”的區(qū)位碼是3385,其意為區(qū)碼33和位碼85。將“劉”用字節(jié)存儲(chǔ)就是bytes0=33-96=-63,bytes1=85-96=-11。轉(zhuǎn)換成ASCII碼就是:ascii = (256 *(256+ bytes0)+(256+ bytes1)) -256 * 256=-15883。程序如下:byte bytes = (String.valueOf(cn).getBytes(); if (bytes = null |
5、 bytes.length > 2 | bytes.length <= 0) /錯(cuò)誤 return 0; if (bytes.length = 1) /英文字符 return Integer.parseInt(bytes0+""); if (bytes.length = 2) /中文字符 int hightByte = 256 + bytes0; int lowByte = 256 + bytes1; int ascii = (256 * hightByte + lowByte) - 256 * 256; return ascii; 在取得ASCII編碼后,因?yàn)?/p>
6、本程序只能讀出一級漢字的讀音,而且因?yàn)槲谋疚募怯袠?biāo)點(diǎn)符號的,也可能存在字母(A、B.)、數(shù)字(0、1.)的情況,所有也會(huì)取得符號的ASCII編碼,而符號的編碼是沒有對應(yīng)的音頻的,所有需要判斷是否為符號,或者為字母,對照ASCII編碼表格得到字母對應(yīng)的ASCII編碼在65122之間,數(shù)字對應(yīng)于4857之間。在判斷所文字是字母或者時(shí),返回該文字并且加上“_”(下劃線)。如果是該文字的ASCII編碼ascii < -20319或者ascii > -10247,則說明該文字為二級漢字即非生活常用的文字,則返回“0000_”。判斷程序如下:if (ascii > 0 &&am
7、p; ascii < 160) /單字符 if(ascii > 64 && ascii < 123)/abc.ABC. return String.valueOf(char) ascii)+"_" if(ascii > 47 && ascii < 58)/09 return String.valueOf(char) ascii)+"_" return "0000_"/改成返回0000這個(gè)字符 if (ascii < -20319 | ascii > -10247
8、) /不知道的字符 return "0000_" /改成0000 流程圖如下:選擇文件結(jié)束輸出該文字的區(qū)位碼輸出“0000_”否輸出該字母加“_”是是英文字母?否是是否為漢字?將所有文字或者符號,轉(zhuǎn)換成ASCII編碼播放拼接該編碼的音頻將文件的每一個(gè)文字符號全部轉(zhuǎn)換成編碼之后,比如我們word文檔中的文字為“我們”,轉(zhuǎn)換成編碼就是“4659_3540_”,此時(shí)的該編碼是以字符串的形式輸出的,String as = xd.split("_");使該字符串按“_”分割儲(chǔ)存as這個(gè)字符數(shù)組里面,再遍歷此數(shù)組得到每一個(gè)文字的編碼,從而播放每一個(gè)編碼的音頻文件。程
9、序如下:String x; String str=word("2007"); String xd=getFullSpell(str); String as = xd.split("_"); for(int i = 0; i < as.length;i+) x=asi; String y=x+".wav" paly(new File(y); 五、個(gè)人總結(jié)。此次的綜合設(shè)計(jì)題目不是很符合我所學(xué)專業(yè),完成此次綜合實(shí)訓(xùn)的所用的軟件和語言是使用的java實(shí)現(xiàn)的,大學(xué)課程沒有學(xué)習(xí)過,是本人自學(xué)的,所以整體來說確實(shí)效果不怎么理想。不理想的原因是
10、由于我是采用播放每一個(gè)文字的音頻文件來實(shí)現(xiàn)文字轉(zhuǎn)聲音的,原理上就是在播放了一個(gè)文字的聲音后程序又自動(dòng)循環(huán)播放下一個(gè)文字對應(yīng)的音頻,這中間就產(chǎn)生了一個(gè)循環(huán)的間隔問題,使得最終播放的聲音中間的間隔過大,影響了播放的效果。在查閱了很多文獻(xiàn)的時(shí)候知道語言庫的實(shí)現(xiàn)應(yīng)該是要將每一個(gè)每一個(gè)漢字的讀音文件.mp3文件鏈接起來。原理是在得到所有的文字編碼之后,將每一個(gè)對應(yīng)的.mp3文件拼接成一個(gè)大的.mp3文件,這樣就能直接播放那個(gè)大的.wmp3文件,從而在每一個(gè)音頻中間不會(huì)產(chǎn)生間隔。于是自己學(xué)習(xí)將一個(gè)一個(gè)的小mp3使用程序拼接成一個(gè)大的mp3文件,從而解決的該問題。現(xiàn)在的缺點(diǎn)就是感覺自己所剪切的音頻不夠完美
11、有噪聲,但是也沒什么影響,已經(jīng)達(dá)到了該設(shè)計(jì)的目的。整個(gè)綜合設(shè)計(jì)的完成,確實(shí)感覺自己有所進(jìn)步,java語言也感覺更加的理解深刻了一點(diǎn)。但也確定感覺到了自己能力的不足,定將更刻苦的學(xué)習(xí)。6、所用到的程序如下:public class CntoSpell1 private static LinkedHashMap spellMap = null; static if (spellMap = null) spellMap = new LinkedHashMap(400); initialize(); private CntoSpell1() private static void spellPut(S
12、tring spell, int ascii) spellMap.put(spell, new Integer(ascii); private static void initialize() spellPut("1601_", -20319); spellPut("1603_", -20317);spellPut("5583_", -10253); spellPut("5585_", -10251); /* * 獲得單個(gè)漢字的Ascii. * param cn char 漢字字符 * return int 錯(cuò)誤返
13、回 0,否則返回ascii */ public static Integer getCnAscii(char cn) byte bytes = (String.valueOf(cn).getBytes();/將字符數(shù)組轉(zhuǎn)換成字節(jié)數(shù)組 if (bytes = null | bytes.length > 2 | bytes.length <= 0) /錯(cuò)誤 return 0; if (bytes.length = 1) /英文字符 return Integer.parseInt(bytes0+""); if (bytes.length = 2) /中文字符 int
14、hightByte = 256 + bytes0; int lowByte = 256 + bytes1; int ascii = (256 * hightByte + lowByte) - 256 * 256; return ascii; return 0; /錯(cuò)誤 public static String getSpellByAscii(int ascii) if (ascii > 0 && ascii < 160) /單字符 if(ascii > 64 && ascii < 123)/abc.ABC. return String.v
15、alueOf(char) ascii)+"_" if(ascii > 47 && ascii < 58)/09 return String.valueOf(char) ascii)+"_" return "0000_"/改成返回0000這個(gè)字符 if (ascii < -20319 | ascii > -10247) /不知道的字符 /return =null; 顯示空格 return "0000_" /改成0000 Set keySet = spellMap.keySet(
16、); Iterator it = keySet.iterator(); String spell0 = null; ; String spell = null; int asciiRang0 = -20319; int asciiRang; while (it.hasNext() spell = (String) it.next(); Object valObj = spellMap.get(spell); if (valObj instanceof Integer) asciiRang = (Integer) valObj).intValue(); if (ascii >= ascii
17、Rang0 && ascii < asciiRang) /區(qū)間找到 return (spell0 = null) ? spell : spell0; else spell0 = spell; asciiRang0 = asciiRang; return null; /* * 返回字符串的全拼,是漢字轉(zhuǎn)化為全拼,其它字符不進(jìn)行轉(zhuǎn)換 * param cnStr String * 字符串 * return String * 轉(zhuǎn)換成全拼后的字符串 */ public static String getFullSpell(String cnStr) char chars = cnS
18、tr.toCharArray();/將字符串轉(zhuǎn)換為字符數(shù)組 StringBuffer retuBuf = new StringBuffer(); for (int i = 0, Len = chars.length; i < Len; i+) int ascii = getCnAscii(charsi); if (ascii = 0) /取ascii時(shí)出錯(cuò) retuBuf.append(charsi); else String spell = getSpellByAscii(ascii); if (spell = null) retuBuf.append(5585+"_&quo
19、t;); else retuBuf.append(spell); return retuBuf.toString(); public static String getFirstSpell(String cnStr) return null; public static String word(String srs) String sr="files"+srs+".docx" try OPCPackage opcPackage = POIXMLDocument.openPackage(sr); POIXMLTextExtractor extractor
20、= new XWPFWordExtractor(opcPackage); String text2007 = extractor.getText(); System.out.println(text2007); return text2007; catch (Exception e) e.printStackTrace(); return sr; private static AudioInputStream audioInputStream; private static AudioFormat audioFormat; private static SourceDataLine res;
21、public static void main(String args) throws UnsupportedAudioFileException, IOException,LineUnavailableException FileInputStream fis = null;FileOutputStream fos = null;BufferedInputStream bis = null;BufferedOutputStream bos = null;String str=word("2007");String xd=getFullSpell(str); String
22、as = xd.split("_"); String wj="D:/Test/Test/lgp/music2.mp3"/輸出保存目錄 String y=as0+".mp3" File in1 = new File(y); File out = new File(wj); try fis = new FileInputStream(in1); fos = new FileOutputStream(out); bis = new BufferedInputStream(fis); bos = new BufferedOutputStrea
23、m(fos);int len;byte buf = new byte1024;while (len = bis.read(buf)!=-1) bos.write(buf,0,len);bos.flush();for(int i = 1; i < as.length;i+) String xi=asi+".mp3"File in2 = new File(xi);fis = new FileInputStream(in2);bis = new BufferedInputStream(fis);while (len = bis.read(buf) != -1) bos.write(buf,0,len);bos.flush(); catch (FileNotFoundException e) e.printStackTrace(); catch (IOException e) e.printStackTrace(); finally /關(guān)閉流 if (bis != null) try bis.close(); catch (IOException e) e.printStackT
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 貸款延期補(bǔ)充協(xié)議書范本
- 2024居間合同樣的合同
- 工程測量設(shè)計(jì)合同
- 培訓(xùn)機(jī)構(gòu)合作合同樣本
- 技術(shù)許可與知識產(chǎn)權(quán)保護(hù)
- 國有企業(yè)下崗職工出中心與失業(yè)保險(xiǎn)“并軌”協(xié)議書
- 2024配方轉(zhuǎn)讓協(xié)議標(biāo)準(zhǔn)文本
- 工程合同簽訂方法
- 房屋租賃合同提前解除的策略與建議
- 園林綠化承包經(jīng)營合同樣本
- 五年級綜合實(shí)踐活動(dòng)課件 模擬小法庭 全國通用
- 吊籃安全檢查記錄表
- IATF16949條款與過程的對應(yīng)關(guān)系
- 華科版五年級全冊信息技術(shù)教案(共24課時(shí))
- 設(shè)備供貨安裝方案(通用版)
- 計(jì)算機(jī)基礎(chǔ)全套完整版ppt教學(xué)教程最新最全
- 三年級數(shù)學(xué)上冊課件-8.1.1 認(rèn)識幾分之一 人教版(共20張PPT)
- 英語學(xué)習(xí)重要性
- 《應(yīng)用寫作》精品課程教案
- 水墨中國風(fēng)古風(fēng)山水典雅通用PPT模板
- 語文四年級上冊第五單元習(xí)作: 生活萬花筒課件(PPT18頁)
評論
0/150
提交評論