当前位置:首页 » 编程语言 » java语音合成

java语音合成

发布时间: 2022-06-10 04:49:28

① 有谁会用java speech

JSML也代表JScript标识语言。

JSML(Java Speech API Markup Language,Java语音API合成标识语言)是用于有声Web浏览器和有声email中语音合成——text-to-speech(TTS)——的一套标识代码和记号。JSML包括了描述文档结构的文本描述标记和控制文本重音,音调,速率和发音的扬声器指示标记。JSML和另一种叫做口语文本标识语言(STML)的标识语言已经结合在一起形成了Sable,一种指导文本到语音合成的标识语言。

Java Speech API
Java Speech API 允许开发人员将语音技术整合到 Java applet 和应用程序的用户界面中。这种 API 规定一个跨平台的接口来支持命令―控制识别器、听写系统和语音合成器。

这个综合 API 被分成几个规范:

Java Speech API 规范(Java Speech API Specification,JSAPI)
Java Speech API 程序员指南
Java Speech API 语法格式规范(Java Speech API Grammar Format Specification,JSGF)
Java Speech API 标记语言规范(Java Speech API Markup Language Specification,JSML)
这个 API 没有 Sun 公司的参考实现,但是有许多第三方实现,包括 Speech for Java(可以从 IBM alphaWorks 获得http://www.alphaworks.ibm.com/tech/speech),它使用 ViaVoice 来支持语音命令识别、听写和文本到语音的合成。

② 在java程序中加入语音功能,例如给段字符串“A101”,就能发出声音,请大家帮帮忙,谢谢

为应用程序加上语音能力有什么好处呢?粗略地讲,是为了趣味,它适合所有注重趣味的应用,比如游戏。当然,从更严肃的角度来讲,它还涉及到应用的可用性问题。注意,这里我考虑的不仅是可视化界面固有的不足,而且还有这样一些情形:一些时候,让双眼离开当前的工作很不方便,甚至是不合法的。比如,假设有一个带语音功能的浏览器,你就可以在外出散步或开车上班的同时,用听的方式浏览自己喜爱的网站。从目前来看,邮件阅读器或许是语音技术更实际的应用,在JavaMail API的帮助下,这一切已经可能。邮件阅读器可以定期地检查收件箱,然后用语音“You have new mail, would you like me to read it to you?”引起你的注意。按照类似的思路,我们还可以考虑一个带语音功能的提醒器,把它连接到一个日历应用:它会及时地提醒你“Don't forget your meeting with the boss in 10 minutes!”。 也许你已经被这些主意吸引,或者有了自己更好的主意,现在让我们继续。首先我将介绍如何启用本文提供的语音引擎,这样,如果你认为语音引擎的实现细节过于复杂,就可以直接使用它而忽略其实现细节。
一、试用语音引擎 要使用这个语音引擎,你必须在CLASSPATH中加入本文提供的javatalk.jar文件,然后从命令行运行(或者从Java程序调用)com.lotontech.speech.Talker类。如果从命令行运行,则命令为: java com.lotontech.speech.Talker "h|e|l|oo" 如果从Java程序调用,则代码为: com.lotontech.speech.Talker talker=new com.lotontech.speech.Talker(); talker.sayPhoneWord("h|e|l|oo"); 现在,对于在命令行上(或者调用sayPhoneWord()方法时)提供的“h|e|l|oo”字符串,你或许有所不解。下面我就来解释一下。 语音引擎的工作原理是把细小的声音样本连接起来,每一个样本都是人的语言发音(英语)的一个最小单位。这些声音样本称为音素(allophone)。每一个因素对应一个、二个或者三个字母。从前面“hello”的语音表示可以看出,一些字母组合的发音显而易见,还有一些却不是很明显: h -- 读音显而易见 e -- 读音显而易见 l -- 读音显而易见,但注意两个“l”被简缩成了一个“l”。 OO -- 应该读作“hello”中的读音,不应读作“bot”、“too”中的读音。 下面是一个有效音素的清单: a : 如cat b : 如cab c : 如cat d : 如dot e : 如bet f : 如frog g : 如frog h : 如hog i : 如pig j : 如jig k : 如keg l : 如leg m : 如met n : 如begin o : 如not p : 如pot r : 如rot s : 如sat t : 如sat u : 如put v : 如have w : 如wet y : 如yet z : 如zoo aa : 如fake ay : 如hay ee : 如bee ii : 如high oo : 如go bb : b的变化形式,重音不同 dd : d的变化形式,重音不同 ggg : g的变化形式,重音不同 hh : h的变化形式,重音不同 ll : l的变化形式,重音不同 nn : n的变化形式,重音不同 rr : r的变化形式,重音不同 tt : t的变化形式,重音不同 yy : y的变化形式,重音不同 ar : 如car aer : 如care ch : 如which ck : 如check ear : 如beer er : 如later err : 如later (长音) ng : 如feeding or : 如law ou : 如zoo ouu : 如zoo (长音) ow : 如cow oy : 如boy sh : 如shut th : 如thing dth : 如this uh : u 的变化形式 wh : 如where zh : 如Asian 人说话的时候,语音在整个句子之内起落变化。语调变化使得语音更自然、更富有感染力,使得问句和陈述句能够相互区别。请考虑下面两个句子: It is fake -- f|aa|k Is it fake? -- f|AA|k 也许你已经猜想到,提高语调的方法是使用大写字母。 以上就是使用该软件时你需要了解的东西。如果你对其后台实现细节感兴趣,请继续阅读。
二、实现语音引擎 语音引擎的实现只包括一个类,四个方法。它利用了J2SE 1.3包含的Java Sound API。在这里,我不准备全面地介绍这个API,但你可以通过实例学习它的用法。Java Sound API并不是一个特别复杂的API,代码中的注释将告诉你必须了解的知识。 下面是Talker类的基本定义: package com.lotontech.speech; import javax.sound.sampled.*; import java.io.*; import java.util.*; import java.net.*; public class Talker { private SourceDataLine line=null; } 如果从命令行执行Talker,下面的main()方法将作为入口点运行。main()方法获取第一个命令行参数,然后把它传递给sayPhoneWord()方法: /* * 读出在命令行中指定的表示读音的字符串 */ public static void main(String args[]) { Talker player=new Talker(); if (args.length>0) player.sayPhoneWord(args[0]); System.exit(0); }
sayPhoneWord()方法既可以通过上面的main()方法调用,也可以在Java程序中直接调用。从表面上看,sayPhoneWord()方法比较复杂,其实并非如此。实际上,它简单地遍历所有单词的语音元素(在输入字符串中语音元素以“|”分隔),通过一个声音输出通道一个元素一个元素地播放出来。为了让声音更自然一些,我把每一个声音样本的结尾和下一个声音样本的开头合并了起来: /* * 读出指定的语音字符串 */ public void sayPhoneWord(String word) { // 为上一个声音构造的模拟byte数组 byte[] previousSound=null; // 把输入字符串分割成单独的音素 StringTokenizer st=new StringTokenizer(word,"|",false); while (st.hasMoreTokens()) { // 为音素构造相应的文件名字 String thisPhoneFile=st.nextToken(); thisPhoneFile="/allophones/"+thisPhoneFile+".au"; // 从声音文件读取数据 byte[] thisSound=getSound(thisPhoneFile); if (previousSound!=null) { // 如果可能的话,把前一个音素和当前音素合并 int mergeCount=0; if (previousSound.length>=500 && thisSound.length>=500) mergeCount=500; for (int i=0; i { previousSound[previousSound.length-mergeCount+i] =(byte)((previousSound[previousSound.length -mergeCount+i]+thisSound[i])/2); } // 播放前一个音素 playSound(previousSound); // 把经过截短的当前音素作为前一个音素 byte[] newSound=new byte[thisSound.length-mergeCount]; for (int ii=0; ii newSound[ii]=thisSound[ii+mergeCount]; previousSound=newSound; } else previousSound=thisSound; } // 播放最后一个音素,清理声音通道 playSound(previousSound); drain(); } 在sayPhoneWord()的后面,你可以看到它调用playSound()输出单个声音样本(即一个音素),然后调用drain()清理声音通道。下面是playSound()的代码: /* * 该方法播放一个声音样本 */ private void playSound(byte[] data) { if (data.length>0) line.write(data, 0, data.length); } 下面是drain()的代码: /* * 该方法清理声音通道 */ private void drain() { if (line!=null) line.drain(); try {Thread.sleep(100);} catch (Exception e) {} }
现在回过头来看sayPhoneWord(),这里还有一个方法我们没有分析,即getSound()方法。 getSound()方法从一个au文件以字节数据的形式读入预先录制的声音样本。要了解读取数据、转换音频格式、初始化声音输出行(SouceDataLine)以及构造字节数据的详细过程,请参考下面代码中的注释: /* * 该方法从文件读取一个音素, * 并把它转换成byte数组 */ private byte[] getSound(String fileName) { try { URL url=Talker.class.getResource(fileName); AudioInputStream stream = AudioSystem.getAudioInputStream(url); AudioFormat format = stream.getFormat(); // 把一个ALAW/ULAW声音转换成PCM以便回放 if ((format.getEncoding() == AudioFormat.Encoding.ULAW) || (format.getEncoding() == AudioFormat.Encoding.ALAW)) { AudioFormat tmpFormat = new AudioFormat( AudioFormat.Encoding.PCM_SIGNED, format.getSampleRate(), format.getSampleSizeInBits() * 2, format.getChannels(), format.getFrameSize() * 2, format.getFrameRate(), true); stream = AudioSystem.getAudioInputStream(tmpFormat, stream); format = tmpFormat; } DataLine.Info info = new DataLine.Info( Clip.class, format, ((int) stream.getFrameLength() * format.getFrameSize())); if (line==null) { // 输出线还没有实例化 // 是否能够找到合适的输出线类型? DataLine.Info outInfo = new DataLine.Info(SourceDataLine.class, format); if (!AudioSystem.isLineSupported(outInfo)) { System.out.println("不支持匹配" + outInfo + "的输出线"); throw new Exception("不支持匹配" + outInfo + "的输出线"); } // 打开输出线 line = (SourceDataLine) AudioSystem.getLine(outInfo); line.open(format, 50000); line.start(); } int frameSizeInBytes = format.getFrameSize(); int bufferLengthInFrames = line.getBufferSize() / 8; int bufferLengthInBytes = bufferLengthInFrames * frameSizeInBytes; byte[] data=new byte[bufferLengthInBytes]; // 读取字节数据,并计数 int numBytesRead = 0; if ((numBytesRead = stream.read(data)) != -1) { int numBytesRemaining = numBytesRead; } // 把字节数据切割成合适的大小 byte[] newData=new byte[numBytesRead]; for (int i=0; i newData[i]=data[i]; return newData; } catch (Exception e) { return new byte[0]; } } 这就是全部的代码,包括注释在内,一个大约150行代码的语音合成器。
三、文本-语音转换 以语音元素的格式指定待朗读的单词似乎过于复杂,如果要构造一个能够朗读文本(比如Web页面或Email)的应用,我们希望能够直接指定原始的文本。 深入分析这个问题之后,我在本文后面的ZIP文件中提供了一个试验性的文本-语音转换类。运行这个类,它将显示出分析结果。文本-语音转换类可以从命令行执行,如下所示: java com.lotontech.speech.Converter "hello there" 输出结果类如: hello -> h|e|l|oo there -> dth|aer 如果运行下面这个命令: java com.lotontech.speech.Converter "I like to read JavaWorld" 则输出结果为: i -> ii like -> l|ii|k to -> t|ouu read -> r|ee|a|d java -> j|a|v|a world -> w|err|l|d 这个转换类是如何工作的呢?实际上,我的方法相当简单,转换过程就是以一定的次序应用一组文本替换规则。例如对于单词“ant”、“want”、“wanted”、“unwanted”和“unique”,则我们想要应用的替换规则可能依次为: 用“|y|ou|n|ee|k|”替换“*unique*” 用“|w|o|n|t|”替换“*want*” 用“|a|”替换“*a*” 用“|e|”替换“*e*” 用“|d|”替换“*d*” 用“|n|”替换“*n*” 用“|u|”替换“*u*” 用“|t|”替换“*t*” 对于“unwanted”,输出序列为: unwanted un[|w|o|n|t|]ed (规则2) [|u|][|n|][|w|o|n|t|][|e|][|d|] (规则4、5、6、7) u|n|w|o|n|t|e|d (删除多余的符之后) 你将看到包含字母“wont”的单词和包含字母“ant”的单词以不同的方式发音,还将看到在特例规则的作用下,“unique”作为一个完整单词优先于其他规则,从而“unique”这个单词读作“y|ou...”而不是“u|n...”。

③ 语音合成工具合成的语音从哪里

除了使用C,VB,java这种程序代码之外,直接使用Office就可以做到文本到声音的转换。 在Office XP的Excel中,就有“从文本到语音”的功能,但必须在Excel环境下才能实现。

④ java如何使用科大讯飞转换语音并将语音下载

你到讯飞语音云开放平台官网http://www.voicecloud.cn/index.html下载个语音开发包,可以支持应用的语音合成及合成音频的保存

⑤ java能用的语音合成软件

什么意思,什么叫JAVA能用的,一般是分为平台来算的,比如WIN32的平台、嵌入式平台,像ARM9的或者嵌入式操作系统下的,看你是用在什么环境中的,如手机、电脑、导航仪等

⑥ espeak 安装后java怎么调用

众所周知,所谓TTS即Text To Speech的英文缩写,也就是“从文本转换到语音”。

TTS技术的主要作用在于利用计算机合成人语,并将文字信息转化为语音信息进行播放。简单点说,TTS技术赋予了计算机“开口说人话”的能力。

作为一项历史悠久的计算机技术,TTS的应用领域可谓非常之广阔。不但可以用来阅读电子邮件,进行IVR系统(Interactive Voice Response)的语音提示,也可以很方便的嵌入到游戏或者其它类型的应用程序当中,增强用户体验。尤其重要的是,在某些无法够获得详细文字咨询的场合(譬如声讯台或者盲人服务),TTS技术具有其它技术无法替代的关键作用。

针对于TTS需求所要实现的功能,主要包含如下几个部分:

1、文本分析:对输入文本进行语言学分析,逐句进行词汇的、语法的和语义的分析,以确定句子的低层结构和每个字的音素的组成,包括文本的断句、字词切分、多音字的处理、数字的处理、缩略语的处理等。

2、语音合成:把处理好的文本所对应的单字或短语从语音合成库中提取,把语言学描述转化成言语波形。

3、韵律处理:用以控制语音合成系统所输出的语音的质量,一般可从清晰度、自然度和连贯性等方面进行主观评价。

但是,即便上述所讲从纯技术角度来说并不很难,开发TTS引擎仍然是件非常让人头痛的事情。

因为除去核心架构的开发之外,TTS应用还存在有大量针对具体文字、词组、固定语句的采样、归类、矫正的工作要做,否则就无法满足其“拟人”的最基本需求。从某种意义上讲,这些非常耗时的重复性工作,其本质似乎更贴近体力劳动,而非严格意义上的技术领域。因此,对于TTS引擎的制造者而言,所需付出的体力劳动强度,将远远超出脑力劳动所应付出的代价(如果不是这样,那些收费TTS引擎的开发商都要饿死了……)。

万幸的是,我们生活在一个越来越倾向开源的国际大环境下,即使你一字不动,一笔不写,也有数之不尽的现成轮子可供驱策,并不一定要花钱购买昂贵的商业引擎,也不必皓首穷经的自己从头写起。

比如本次发布的Java版TTS组件JTTS,就是基于着名开源TTS组件eSpeak封装而来。(吾辈并没狂妄(有瘾)到想要(能够)独立开发TTS引擎的境界,所以效法Google对eSpeak进行jni封装……)

关于eSpeak(eSpeak项目地址如下:http://espeak.sourceforge.net ):

eSpeak是一款紧凑的开放源码软件的语音合成器,允许自行编辑与修改词库,算得上是一个性价比合理的开源TTS解决方案。它支持包括中文(含粤语)在内的多种语言(可惜标准中文词库与扩展词库都不全,发音也不太好听,想实用自己慢慢改吧,反正是开源的……),能够跨平台运行于Linux和Windows之上(需要分别编译)。值得一提的是,Google Android中所使用的TTS引擎,也是eSpeak。在如下地址:http://eyes-free.googlecode.com ,可以下载到Android版的eSpeak封装项目。

关于jtts:

事实上,jtts只是将eSpeak进行简单封装后的“马甲引擎”(很奇怪,此前为什么没人发java版的封装,连php,Python,ruby版的都有……),使用方法基本与eSpeak相同,不过具体实现却更为简单,也更方便对于C/C++不太熟悉的朋友们使用。

目前已封装eSpeak接口如下(未来有时间的话(目前业余以开发LGame为主),我会陆续添加更多的接口到jtts中,并逐渐扩展应用):

⑦ java使用freeTTS,怎么能让机器输出中文语言

FreeTTS可以输出中文语言过程:
①导入Java 语音API包
②为语音合成器声明实例变量
③语音合成器的初始化
初始化是FreeTTS应用中关键的部分。首先需要建立一个SynthesizerModeDesc 对象,该对象用于指明语音合成器的属性,包括语音引擎的的名称、语音引擎的操作模式、支持的语言、语音引擎的运行状态以及其发音能力等。
④创建语音合成器
创建语言合成器时需要用到Cen t ral 类, 其作用是提供用来访问所有语音输入和输出的能力, 同时也可以定为语言引擎, 根据描述符所定义的属性集合选择匹配的引擎, 从而创建语音识别器和语音合成器。语音合成器的创建需使用Central类的createSynthesizer方法,该方法接受一个SynthesizerModeDesc描述符并返回同描述符中所指定属性相匹配的一个Synthesizer对象,用以实现语音合成。
⑤准备用于朗读的Synthesizer 对象
该部分通过Synthesizer对象的allocate和resume方法分配语音引擎所需要的资源并取得可用于朗读的语音合成器。实现较为简单:speechSynthesizer1allocate();speechSynthesizer1resume();
⑥设置Syn thesizer 对象的属性
利用getSynthesizerProperties 方法可以获得Synthesizer对象的属性,其返回值是与语音合成器相关联的SynthesizerProperties对象,该对象包含语音合成器的多种属性, 每种属性可以通过setProperties方法设置。例如: setSpeakingRate方法可设置speakingRate属性,实现每分钟朗读单词速率的控制。
⑦事件处理程序设计
speak ingRate 属性, 实现每分钟朗读单词速率的控制。完成应用程序界面中JButton“读出号码”的事件程序设计, 首先通过JComboBox(选择人名的下拉列表)取得人名(namesArray)的一个索引,该索引与电话号码索引(numbersArray)保持对应,然后调用Synthesizer对象speakingPlainText方法朗读整理后的电话号码字符串。

⑧ freetts引擎原理

FreeTTS 是完全采用 Java 开发的语音合成系统,它是卡内基梅隆大学基于
Flite 这个小型的语音合成引擎开发的。

⑨ java语音合成技术,该怎么处理

去搜索 网络语音 ,调用 Restful 接口去做吧。

⑩ 科大讯飞的语音合成java接口有哪些函数,可以提供一下形参表吗

官网的API文档

~
~
~

热点内容
cbs加密 发布:2024-05-19 06:29:56 浏览:200
ssis存储过程 发布:2024-05-19 06:21:31 浏览:630
怎样删除小视频文件夹 发布:2024-05-19 05:49:29 浏览:589
开启php短标签 发布:2024-05-19 05:44:12 浏览:473
android各国语言 发布:2024-05-19 05:42:54 浏览:247
微信什么资料都没怎么找回密码 发布:2024-05-19 05:35:34 浏览:907
填志愿密码是什么 发布:2024-05-19 05:30:23 浏览:318
城堡争霸自动掠夺脚本 发布:2024-05-19 05:22:06 浏览:204
asp编程工具 发布:2024-05-19 05:20:36 浏览:143
insertpython 发布:2024-05-19 05:12:26 浏览:244