




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 综合课程设计报告题 目 文档自动读播器 姓 名 学 号 院 (系) 工程与设计学院 专业、年级 指导教师 2015年 月 日【 摘 要 】目前大多数的阅读器只能使人们从视觉方面获得信息因此现有的阅读器不能足盲人这个群体的需求。将语音合成技术应用到阅读器当中, 使人们从视觉获取信息内容转换到听觉, 正是解决这一问题。文章介绍了一个汉字语音库的实现, 并且制定了基于这个语音库的由汉字机内码到汉字读音的访问方法 。【关键词】汉字语音库 ; 汉字内码一、引言文本语音转换是将文字形式的信息转换成自然语音的一项技术,在人机语音交流文字信息处理领域有着广泛的应用。本设计就是利用计算机word文档中给定的汉
2、字文本信息转换成汉语语音。在计算机中汉字的机内码是唯一的,而由汉字输入码到汉字机内码的转换可以通过查阅输人码对照表实现,由此联想到可以在得到汉字的机内码后通过查阅某种表格经过某种转换得到该汉字的声音。二、设计思想实现汉语转换系统主要完成两项工作:第一,建立一个语音库, 记录普通话中所有汉字的读音; 第二, 建立汉字机内码到汉字读音的访问方法, 实现由输入的汉字机内码得到该汉字的读音。具体而言, 首先将所有汉字的声音文件录好, 分别取对应的文字编码名字。根据word文档内的汉字进行编码转换,根据对应编码播放对应的音频文件。从而实现了汉字到语音的实现。三、语音库的实现。在普通话中实际存在的发音有1
3、333种,常用汉字及一级汉字的读音有1085种,我们要将这1085个语音分别录制成1085个独立的WAV文件,将每一个读音文件取名为对应的区位码(如“阿”的区位码为1601则将文件取名为1601)。将全部文件存放在工程文件夹下面,方面调用。四、汉字读音的访问方法的实现。所谓编码, 是以固定的顺序排列字符, 并以此作为记录、存储、传递、交换的统一内部特征。一个汉字有ASCII码、区位码等与之对应。我们先将文本中的每一个字用代码:byte bytes = (String.valueOf(cn).getBytes();转换成字节储存在字节数组里面,判断是英文字符还是汉字字符,中文字符要两个字节储存,
4、所以每一个汉字都是由“bytes0”和“bytes1”组成。每个汉字在GB2312中都能用区位码表示,区位码用4位数字表示前两位从01到94称区码,后两位从01到94称位码。如“刘”的区位码是3385,其意为区码33和位码85。将“刘”用字节存储就是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.)、数字(0、1.)的情况,所有也会取得符号的ASCII编码,而符号的编码是没有对应的音频的,所有需要判断是否为符号,或者为字母,对照ASCII编码表格得到字母对应的ASCII编码在65122之间,数字对应于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 流程图如下:选择文件结束输出该文字的区位码输出“0000_”否输出该字母加“_”是是英文字母?否是是否为汉字?将所有文字或者符号,转换成ASCII编码播放拼接该编码的音频将文件的每一个文字符号全部转换成编码之后,比如我们word文档中的文字为“我们”,转换成编码就是“4659_3540_”,此时的该编码是以字符串的形式输出的,String as = xd.split("_");使该字符串按“_”分割储存as这个字符数组里面,再遍历此数组得到每一个文字的编码,从而播放每一个编码的音频文件。程
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); 五、个人总结。此次的综合设计题目不是很符合我所学专业,完成此次综合实训的所用的软件和语言是使用的java实现的,大学课程没有学习过,是本人自学的,所以整体来说确实效果不怎么理想。不理想的原因是
10、由于我是采用播放每一个文字的音频文件来实现文字转声音的,原理上就是在播放了一个文字的声音后程序又自动循环播放下一个文字对应的音频,这中间就产生了一个循环的间隔问题,使得最终播放的声音中间的间隔过大,影响了播放的效果。在查阅了很多文献的时候知道语言库的实现应该是要将每一个每一个汉字的读音文件.mp3文件链接起来。原理是在得到所有的文字编码之后,将每一个对应的.mp3文件拼接成一个大的.mp3文件,这样就能直接播放那个大的.wmp3文件,从而在每一个音频中间不会产生间隔。于是自己学习将一个一个的小mp3使用程序拼接成一个大的mp3文件,从而解决的该问题。现在的缺点就是感觉自己所剪切的音频不够完美
11、有噪声,但是也没什么影响,已经达到了该设计的目的。整个综合设计的完成,确实感觉自己有所进步,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();/将字符数组转换成字节数组 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) /区间找到 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();/将字符串转换为字符数组 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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 学校心理健康教育模式创新研究
- 甲醛生产工艺改进行业深度调研及发展战略咨询报告
- 废水深度脱盐技术企业制定与实施新质生产力战略研究报告
- 石油产品质量行业深度调研及发展战略咨询报告
- 碳交易法律服务企业制定与实施新质生产力战略研究报告
- 球迷文化节行业深度调研及发展战略咨询报告
- 汉语拼音速成企业制定与实施新质生产力战略研究报告
- 移动应用内广告解决方案行业跨境出海战略研究报告
- 废旧家具回收再利用行业深度调研及发展战略咨询报告
- 棋类智慧社行业跨境出海战略研究报告
- 小生生科普知识讲座:航天探索
- DeepSeek在海洋资源开发中的应用潜力
- 《乡镇履职事项清单》(涵盖18个部门核心职责)
- 服装数字化设计技术课件 3-1男衬衫款式分析
- TSCNA 0001-2024 成人体外膜肺氧合(ECMO)技术护理规范
- 2025新人教版七年级历史下教案-第6课 隋唐时期的中外文化交流
- 中国近现代史纲要学习心得体会对青少年成长的影响
- 2025年安徽港航集团所属企业招聘13人笔试参考题库附带答案详解
- 仓库管理基础知识培训
- 大班安全教育:不攀爬高处
- 2024年医师定期考核考题《临床练习》
评论
0/150
提交评论