版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 綜合課程設(shè)計(jì)報(bào)告題 目 文檔自動(dòng)讀播器 姓 名 學(xué) 號(hào) 院 (系) 工程與設(shè)計(jì)學(xué)院 專業(yè)、年級(jí) 指導(dǎo)教師 2015年 月 日【 摘 要 】目前大多數(shù)的閱讀器只能使人們從視覺(jué)方面獲得信息因此現(xiàn)有的閱讀器不能足盲人這個(gè)群體的需求。將語(yǔ)音合成技術(shù)應(yīng)用到閱讀器當(dāng)中, 使人們從視覺(jué)獲取信息內(nèi)容轉(zhuǎn)換到聽(tīng)覺(jué), 正是解決這一問(wèn)題。文章介紹了一個(gè)漢字語(yǔ)音庫(kù)的實(shí)現(xiàn), 并且制定了基于這個(gè)語(yǔ)音庫(kù)的由漢字機(jī)內(nèi)碼到漢字讀音的訪問(wèn)方法 ?!娟P(guān)鍵詞】漢字語(yǔ)音庫(kù) ; 漢字內(nèi)碼一、引言文本語(yǔ)音轉(zhuǎn)換是將文字形式的信息轉(zhuǎn)換成自然語(yǔ)音的一項(xiàng)技術(shù),在人機(jī)語(yǔ)音交流文字信息處理領(lǐng)域有著廣泛的應(yīng)用。本設(shè)計(jì)就是利用計(jì)算機(jī)word文檔中給定的漢
2、字文本信息轉(zhuǎn)換成漢語(yǔ)語(yǔ)音。在計(jì)算機(jī)中漢字的機(jī)內(nèi)碼是唯一的,而由漢字輸入碼到漢字機(jī)內(nèi)碼的轉(zhuǎn)換可以通過(guò)查閱輸人碼對(duì)照表實(shí)現(xiàn),由此聯(lián)想到可以在得到漢字的機(jī)內(nèi)碼后通過(guò)查閱某種表格經(jīng)過(guò)某種轉(zhuǎn)換得到該漢字的聲音。二、設(shè)計(jì)思想實(shí)現(xiàn)漢語(yǔ)轉(zhuǎn)換系統(tǒng)主要完成兩項(xiàng)工作:第一,建立一個(gè)語(yǔ)音庫(kù), 記錄普通話中所有漢字的讀音; 第二, 建立漢字機(jī)內(nèi)碼到漢字讀音的訪問(wèn)方法, 實(shí)現(xiàn)由輸入的漢字機(jī)內(nèi)碼得到該漢字的讀音。具體而言, 首先將所有漢字的聲音文件錄好, 分別取對(duì)應(yīng)的文字編碼名字。根據(jù)word文檔內(nèi)的漢字進(jìn)行編碼轉(zhuǎn)換,根據(jù)對(duì)應(yīng)編碼播放對(duì)應(yīng)的音頻文件。從而實(shí)現(xiàn)了漢字到語(yǔ)音的實(shí)現(xiàn)。三、語(yǔ)音庫(kù)的實(shí)現(xiàn)。在普通話中實(shí)際存在的發(fā)音有1
3、333種,常用漢字及一級(jí)漢字的讀音有1085種,我們要將這1085個(gè)語(yǔ)音分別錄制成1085個(gè)獨(dú)立的WAV文件,將每一個(gè)讀音文件取名為對(duì)應(yīng)的區(qū)位碼(如“阿”的區(qū)位碼為1601則將文件取名為1601)。將全部文件存放在工程文件夾下面,方面調(diào)用。四、漢字讀音的訪問(wèn)方法的實(shí)現(xiàn)。所謂編碼, 是以固定的順序排列字符, 并以此作為記錄、存儲(chǔ)、傳遞、交換的統(tǒng)一內(nèi)部特征。一個(gè)漢字有ASCII碼、區(qū)位碼等與之對(duì)應(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、本程序只能讀出一級(jí)漢字的讀音,而且因?yàn)槲谋疚募怯袠?biāo)點(diǎn)符號(hào)的,也可能存在字母(A、B.)、數(shù)字(0、1.)的情況,所有也會(huì)取得符號(hào)的ASCII編碼,而符號(hào)的編碼是沒(méi)有對(duì)應(yīng)的音頻的,所有需要判斷是否為符號(hào),或者為字母,對(duì)照ASCII編碼表格得到字母對(duì)應(yīng)的ASCII編碼在65122之間,數(shù)字對(duì)應(yīng)于4857之間。在判斷所文字是字母或者時(shí),返回該文字并且加上“_”(下劃線)。如果是該文字的ASCII編碼ascii < -20319或者ascii > -10247,則說(shuō)明該文字為二級(jí)漢字即非生活常用的文字,則返回“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_”否輸出該字母加“_”是是英文字母?否是是否為漢字?將所有文字或者符號(hào),轉(zhuǎn)換成ASCII編碼播放拼接該編碼的音頻將文件的每一個(gè)文字符號(hào)全部轉(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)的所用的軟件和語(yǔ)言是使用的java實(shí)現(xiàn)的,大學(xué)課程沒(méi)有學(xué)習(xí)過(guò),是本人自學(xué)的,所以整體來(lái)說(shuō)確實(shí)效果不怎么理想。不理想的原因是
10、由于我是采用播放每一個(gè)文字的音頻文件來(lái)實(shí)現(xiàn)文字轉(zhuǎn)聲音的,原理上就是在播放了一個(gè)文字的聲音后程序又自動(dòng)循環(huán)播放下一個(gè)文字對(duì)應(yīng)的音頻,這中間就產(chǎn)生了一個(gè)循環(huán)的間隔問(wèn)題,使得最終播放的聲音中間的間隔過(guò)大,影響了播放的效果。在查閱了很多文獻(xiàn)的時(shí)候知道語(yǔ)言庫(kù)的實(shí)現(xiàn)應(yīng)該是要將每一個(gè)每一個(gè)漢字的讀音文件.mp3文件鏈接起來(lái)。原理是在得到所有的文字編碼之后,將每一個(gè)對(duì)應(yīng)的.mp3文件拼接成一個(gè)大的.mp3文件,這樣就能直接播放那個(gè)大的.wmp3文件,從而在每一個(gè)音頻中間不會(huì)產(chǎn)生間隔。于是自己學(xué)習(xí)將一個(gè)一個(gè)的小mp3使用程序拼接成一個(gè)大的mp3文件,從而解決的該問(wèn)題?,F(xiàn)在的缺點(diǎn)就是感覺(jué)自己所剪切的音頻不夠完美
11、有噪聲,但是也沒(méi)什么影響,已經(jīng)達(dá)到了該設(shè)計(jì)的目的。整個(gè)綜合設(shè)計(jì)的完成,確實(shí)感覺(jué)自己有所進(jìn)步,java語(yǔ)言也感覺(jué)更加的理解深刻了一點(diǎn)。但也確定感覺(jué)到了自己能力的不足,定將更刻苦的學(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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年庫(kù)房轉(zhuǎn)租合同轉(zhuǎn)租條件、轉(zhuǎn)租手續(xù)及租金處理分析
- 2024年企業(yè)內(nèi)部審計(jì)保密協(xié)議
- 2024年度企業(yè)社會(huì)責(zé)任報(bào)告合同
- 2024年度住宅小區(qū)木門(mén)安裝工程合同
- 2024年度許可使用合同(商標(biāo))
- 腰椎ct課件教學(xué)課件
- 2024北京技術(shù)合同
- 2024年大數(shù)據(jù)使用協(xié)議:數(shù)據(jù)收集、分析和應(yīng)用的具體規(guī)定
- 液體密度課件教學(xué)課件
- 輿論學(xué)課件教學(xué)
- 2024-2025學(xué)年二年級(jí)上學(xué)期數(shù)學(xué)期中模擬試卷(蘇教版)(含答案解析)
- 入團(tuán)志愿書(shū)(2016版本)(可編輯打印標(biāo)準(zhǔn)A4) (1)
- 浙江省公路山嶺隧道機(jī)械化裝備應(yīng)用指導(dǎo)手冊(cè)
- (完整word版)拼音練習(xí)jqx和ü、üe的相拼
- 醫(yī)療質(zhì)量檢查分析、總結(jié)、反饋5篇
- 桅桿工藝技術(shù)及施工要求
- (完整版)六年級(jí)下冊(cè)體育教學(xué)計(jì)劃與教案
- 北京地鐵受電弓的維護(hù)與故障檢修-畢業(yè)設(shè)計(jì)說(shuō)明書(shū)
- 幼兒園教育和家庭教育的有效結(jié)合研究
- 集團(tuán)公司兩金管理評(píng)價(jià)辦法
- 電影的聲音分析PPT課件
評(píng)論
0/150
提交評(píng)論