




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、 綜合課程設計報告題 目 文檔自動讀播器 姓 名 學 號 院 (系) 工程與設計學院 專業(yè)、年級 指導教師 2015年 月 日【 摘 要 】目前大多數(shù)的閱讀器只能使人們從視覺方面獲得信息因此現(xiàn)有的閱讀器不能足盲人這個群體的需求。將語音合成技術應用到閱讀器當中, 使人們從視覺獲取信息內容轉換到聽覺, 正是解決這一問題。文章介紹了一個漢字語音庫的實現(xiàn), 并且制定了基于這個語音庫的由漢字機內碼到漢字讀音的訪問方法 ?!娟P鍵詞】漢字語音庫 ; 漢字內碼一、引言文本語音轉換是將文字形式的信息轉換成自然語音的一項技術,在人機語音交流文字信息處理領域有著廣泛的應用。本設計就是利用計算機word文檔中給定的漢
2、字文本信息轉換成漢語語音。在計算機中漢字的機內碼是唯一的,而由漢字輸入碼到漢字機內碼的轉換可以通過查閱輸人碼對照表實現(xiàn),由此聯(lián)想到可以在得到漢字的機內碼后通過查閱某種表格經(jīng)過某種轉換得到該漢字的聲音。二、設計思想實現(xiàn)漢語轉換系統(tǒng)主要完成兩項工作:第一,建立一個語音庫, 記錄普通話中所有漢字的讀音; 第二, 建立漢字機內碼到漢字讀音的訪問方法, 實現(xiàn)由輸入的漢字機內碼得到該漢字的讀音。具體而言, 首先將所有漢字的聲音文件錄好, 分別取對應的文字編碼名字。根據(jù)word文檔內的漢字進行編碼轉換,根據(jù)對應編碼播放對應的音頻文件。從而實現(xiàn)了漢字到語音的實現(xiàn)。三、語音庫的實現(xiàn)。在普通話中實際存在的發(fā)音有1
3、333種,常用漢字及一級漢字的讀音有1085種,我們要將這1085個語音分別錄制成1085個獨立的WAV文件,將每一個讀音文件取名為對應的區(qū)位碼(如“阿”的區(qū)位碼為1601則將文件取名為1601)。將全部文件存放在工程文件夾下面,方面調用。四、漢字讀音的訪問方法的實現(xiàn)。所謂編碼, 是以固定的順序排列字符, 并以此作為記錄、存儲、傳遞、交換的統(tǒng)一內部特征。一個漢字有ASCII碼、區(qū)位碼等與之對應。我們先將文本中的每一個字用代碼:byte bytes = (String.valueOf(cn).getBytes();轉換成字節(jié)儲存在字節(jié)數(shù)組里面,判斷是英文字符還是漢字字符,中文字符要兩個字節(jié)儲存,
4、所以每一個漢字都是由“bytes0”和“bytes1”組成。每個漢字在GB2312中都能用區(qū)位碼表示,區(qū)位碼用4位數(shù)字表示前兩位從01到94稱區(qū)碼,后兩位從01到94稱位碼。如“劉”的區(qū)位碼是3385,其意為區(qū)碼33和位碼85。將“劉”用字節(jié)存儲就是bytes0=33-96=-63,bytes1=85-96=-11。轉換成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) /錯誤 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編碼后,因為
6、本程序只能讀出一級漢字的讀音,而且因為文本文件是有標點符號的,也可能存在字母(A、B.)、數(shù)字(0、1.)的情況,所有也會取得符號的ASCII編碼,而符號的編碼是沒有對應的音頻的,所有需要判斷是否為符號,或者為字母,對照ASCII編碼表格得到字母對應的ASCII編碼在65122之間,數(shù)字對應于4857之間。在判斷所文字是字母或者時,返回該文字并且加上“_”(下劃線)。如果是該文字的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這個字符 if (ascii < -20319 | ascii > -10247
8、) /不知道的字符 return "0000_" /改成0000 流程圖如下:選擇文件結束輸出該文字的區(qū)位碼輸出“0000_”否輸出該字母加“_”是是英文字母?否是是否為漢字?將所有文字或者符號,轉換成ASCII編碼播放拼接該編碼的音頻將文件的每一個文字符號全部轉換成編碼之后,比如我們word文檔中的文字為“我們”,轉換成編碼就是“4659_3540_”,此時的該編碼是以字符串的形式輸出的,String as = xd.split("_");使該字符串按“_”分割儲存as這個字符數(shù)組里面,再遍歷此數(shù)組得到每一個文字的編碼,從而播放每一個編碼的音頻文件。程
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); 五、個人總結。此次的綜合設計題目不是很符合我所學專業(yè),完成此次綜合實訓的所用的軟件和語言是使用的java實現(xiàn)的,大學課程沒有學習過,是本人自學的,所以整體來說確實效果不怎么理想。不理想的原因是
10、由于我是采用播放每一個文字的音頻文件來實現(xiàn)文字轉聲音的,原理上就是在播放了一個文字的聲音后程序又自動循環(huán)播放下一個文字對應的音頻,這中間就產生了一個循環(huán)的間隔問題,使得最終播放的聲音中間的間隔過大,影響了播放的效果。在查閱了很多文獻的時候知道語言庫的實現(xiàn)應該是要將每一個每一個漢字的讀音文件.mp3文件鏈接起來。原理是在得到所有的文字編碼之后,將每一個對應的.mp3文件拼接成一個大的.mp3文件,這樣就能直接播放那個大的.wmp3文件,從而在每一個音頻中間不會產生間隔。于是自己學習將一個一個的小mp3使用程序拼接成一個大的mp3文件,從而解決的該問題?,F(xiàn)在的缺點就是感覺自己所剪切的音頻不夠完美
11、有噪聲,但是也沒什么影響,已經(jīng)達到了該設計的目的。整個綜合設計的完成,確實感覺自己有所進步,java語言也感覺更加的理解深刻了一點。但也確定感覺到了自己能力的不足,定將更刻苦的學習。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); /* * 獲得單個漢字的Ascii. * param cn char 漢字字符 * return int 錯誤返
13、回 0,否則返回ascii */ public static Integer getCnAscii(char cn) byte bytes = (String.valueOf(cn).getBytes();/將字符數(shù)組轉換成字節(jié)數(shù)組 if (bytes = null | bytes.length > 2 | bytes.length <= 0) /錯誤 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; /錯誤 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這個字符 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; /* * 返回字符串的全拼,是漢字轉化為全拼,其它字符不進行轉換 * param cnStr String * 字符串 * return String * 轉換成全拼后的字符串 */ public static String getFullSpell(String cnStr) char chars = cnS
18、tr.toCharArray();/將字符串轉換為字符數(shù)組 StringBuffer retuBuf = new StringBuffer(); for (int i = 0, Len = chars.length; i < Len; i+) int ascii = getCnAscii(charsi); if (ascii = 0) /取ascii時出錯 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 /關閉流 if (bis != null) try bis.close(); catch (IOException e) e.printStackT
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年河北中煙工業(yè)有限責任公司博士研究生招聘考試筆試試題(含答案)
- 2025年中央和國家機關工委所屬事業(yè)單位招聘工作人員4人筆試歷年典型考題及考點剖析附帶答案詳解
- 徜徉生字教學課件
- 奶油蛋糕教學課件制作
- 觀察蝸牛教學課件
- 課件的教學類型
- 敬老院消防宣傳課件
- 教案教學課件制作
- 水平二跳繩教學課件
- 教育扶貧政策課件
- GB/T 45719-2025半導體器件金屬氧化物半導體(MOS)晶體管的熱載流子試驗
- 寶媽日常心理護理
- 2024年安徽大學專職輔導員招聘筆試真題
- GB 9743-2024轎車輪胎
- 會計知識競賽題庫附答案2021
- 廠房鋼筋混凝土地坪板工程施工方案
- 項目延期申請表(樣本)
- 固井工藝技術培訓教學課件(77p)
- 入團志愿書(2016版本)(可編輯打印標準A4) (1)
- 盤扣式腳手架模板與支撐架專項施工方案
- 消防器材購銷合同2
評論
0/150
提交評論