为你的Java 1.3 应用程序和Applet添加说话能力概要这篇文章中,Tony Loton展示了不使用硬件和本地调用的,少于150行Java代码实现一个简单的语音引擎。此外,他提供了一个小zip文件,里面包
为你的Java 1.3 应用程序和Applet添加说话能力
概要
这篇文章中,Tony Loton展示了不使用硬件和本地调用的,少于150行Java代码实现一个简单的语音引擎。此外,他提供了一个小zip文件,里面包含了使Java应用程序说话说需要的东西—仅仅用来娱乐或别的真正的应用程序。如果你刚刚接触Java Sound API,这篇文章将是一个很好的介绍。(1800字)
作者:Tony Loton
译者:Cocia Lin
为什么要使你的程序说话呢?首先,为了娱乐,这很适合象游戏这样的娱乐程序。并且还有很多严肃的应用领域。我想这虽然不是可视化界面的天生缺点,也是声音可用之处-- 或者过分一点 – 可以使你的眼睛离开你正在做的事情。
最近,我曾经应用一些技术在Web上获得HTML和XML信息的工作[请看 "Access the World's Biggest Database with Web DataBase Connectivity" (JavaWorld, March 2001)]。这让我将那个工作和我的这个想法结合来创建一个说话的Web浏览器。这样的一个浏览器可以使你听到你喜欢的网站上的信息摘录 – 新闻标题,例如 – 就象在外边溜狗或开车上班的途中收听收音机一样。当然,以现在的科技水平,你必须带上你的笔记本电脑和移动电话,但这些不切实际的设想在不久的将来,随着应用Java技术的智能电话的出现而变成现实,例如Nokia 9210(在美国叫9290).
也许对现在来说,能用的到的是一个email朗读器,这也得谢谢JavaMail API.这样的程序将定期的检查你的电子邮箱,并且你的注意被一个声音“你有新的email,你要我给你朗读吗?”吸引。相近的,考虑语音提醒 – 当连接到你的日常管理程序时 –- 电脑大喊“不要忘了10分钟后你和老板的会议!”
回到这些想法,或者你有更好的自己的想法,我们继续。我将演示怎样将我提供的zip文件添加的我们的工作中,这样,如果你觉得这些东西太难了,你就可以直接安装运行而跳过实现细节。
测试语音引擎
为了使用这个语音引擎,你需要将jw-0817-javatalk.zip添加到你的classpath,在命令行方式或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”的
这里列出了能用到的音体变(allophone):
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 (longer sound)
ng -- 例如 feeding
or -- 例如 law
ou -- 例如 zoo
ouu -- 例如 zoo (longer sound)
ow -- 例如 cow
oy -- 例如 boy
sh -- 例如 shut
th -- 例如 thing
dth -- 例如 this
uh -- 变调 u
wh -- 例如 where
zh -- 例如 Asian
人说话的每一个句子都有单词的升调和降调的变化。这个音调使说话听起来自然,富有感情,并且可以从句子语调确定这是疑问句。如果你听过Stephen Hawking的人造声音,你就能够理解我所说的了。考虑这两个句子:
It is fake -- f|aa|k
Is it fake? -- f|AA|k
你也许猜想,使用升调的方法是用大写字母。你要实际感受一下,我的提示是你要注意听元音字母
这是你使用这个软件需要知道的全部了,但是如果你对引擎罩下面的东西感兴趣,那么继续往下读。
实现语音引擎
语音引擎仅仅需要一个类来实现,包含四个方法。它使用J2SE1.3的Java Sound API。我不想提供一个全面的Java Sound 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;
}
如果你从命令行运行程序,下面的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程序或Applet直接调用。它看起来比它本身难理解。本质上,它简单的一步一步解释单词的语音变位allophone – 被”|”标志分割的输入文本 – 在把他们一个一个通过声音输出通道输出。为了让它听起来更自然,合并每一个声音的结尾到下一个声音的开头:
/*
*这个方法使输入的单词发音
*/
public void sayPhoneWord(String word)
{
// 为上一个声音设置一个字节数组
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推荐内容
- 08-25Java应用:Fedora Linux 8系统
- 07-30源码分享:蜘蛛抓取淘宝
- 07-30AJAX 开发的两种不同的方法
- 07-30IT行业培训必读 优秀程序
- 07-30J2EE面向对象
- 07-30JAVA的事件处理机制
- 12-02JAVA-MyEclipse 自动提示(按
- 12-02一些关于中文乱码问题的
- 07-30AIX字体丢失——解决方案
- 08-25Java应用:Fedora Linux 8系统
- 07-30Security
- 02-23用Java构造自己的媒体播放
- 01-05深入浅出Java堆的管理--垃
- 02-21Java Robot对象实现服务器屏
- 07-30用JavaFX写用户界面控制器
- 11-17让Java说话
让Java说话
时间:2001-11-17 作者: 点击: 4次 来源:
我喜欢
(0)
0%
没意思
(0)
style="width:0%"
0%
| 上一篇:使用JAR | ↑上帝请打分↑ | 下一篇:Java 的UML建模:(1)序列图简介 |










