Java提供了语音API技术用于支持应用程序或Web页面中的人机语音交互,其核心技术包括语音合成和语音识别。FreeTTS是Java语音合成技术的实现手段之一,以创建电话号码朗读程序为例, 探讨了基于该技术的Java语音API实现方法及相关问题。
计算机技术的快速发展同时也推动了多媒体技术的广泛应用, 人机语音交互已经不再是纯粹的理论研究, 其应用在日常生活中越来越普遍: 如移动终端、通信、信息系统服务、家庭娱乐等。作为流行的编程语言, Java 提供了语音A P I 技术用于实现应用程序或者Web 页面中的人机语音交互, 包括语音合成和语音识别两部分核心技术,但官方并未提供其实现工具。
FreeTTS 属于第三方免费语音合成java组件, 由Speech Interat ion Group of Sun Micro systemsLaboratiories 和来自IBM的Speech for Java两公司合作开发。本文探讨了基于FreeTTS的语音朗读程序设计与实现, 为工业应用中相关系统的开发提供一个技术参考。
1.FreeTTS 的获得、安装与配置
FreeTTS属于免费的开源java组件, 其官方网站是: http://freetts.sourceforge.net,用户可以在该网站上免费下载。目前最新的版本是11211,下载后的文件名与格式是: freetts-1.2.2-bin.zip。基于java的特点,该组件是跨平台的,安装方法与普通java 应用程序或者组件的方法类似, 将文件解压至特定目录并设置环境变量即可, 具体过程可以参考其安装说明。
2.语音合成功能实现
以一个例子来说明FreeTTS 的应用。该程序最终实现的效果如图1所示。用户在下拉菜单中可选择“张三”、“王五”、“赵七”三个名字,三人依次对应电话号码:“07138616661”,“13871990001”,“07136767555”。选择人名后点击“读出号码”,系统即可发出声音,将对应的电话号码读出。该程序的设计包括以下过程:
①导入Java 语音API包
主要代码:
Import javax.speech.* ;
Import javax.speech.synthesis.* ;
其中javax1speech中的类和接口用来支持音频连通性;javax1speech.synthesis中的类和接口用来支持语音合成。
②为语音合成器声明实例变量
例如: private Synthesizer speechSynthesizer;
③语音合成器的初始化
初始化是FreeTTS应用中关键的部分。首先需要建立一个SynthesizerModeDesc 对象,该对象用于指明语音合成器的属性,包括语音引擎的的名称、语音引擎的操作模式、支持的语言、语音引擎的运行状态以及其发音能力等。
Syn thesizerModeDesc的构造方法需要接收5 个参数。第一个St ring 类型的参数用于指明文本到语音引擎的的名称,如果是FreeTTS 自
带,其名称为“Unlimited dom ain FreeTTS Speech Synthesizerrom Sun Labs”; 第二个String 类型的参数用于标示语音引擎的操作模式,如果设置为null,则意味该引擎不存在特定的操作要求; 第三个参数用于指明该语音引擎所支持的语言,为Local类型,Local对象代表世界上特定的区域, 如果设置为Locale1US,则代表与之关联的语言为英语;第四个参数是布尔类型,表示是否有一个正在运行的语音引擎,如果为False,表示不去选择已得到运行的引擎;第五个参数是一个Voice数组对象, 允许开发人员指定某一语音合成器所输出的语言,设置为null代表不存在特定的要求。下面是构造的例子:
SynthesizerModeDesc descriptor = new
SynthesizerModeDesc(
"Unlimited domain FreeTTS Speech Synthesizer " +
" from Sun Labs", null, Locale1US, Boolean1FALSE,null) ;
④创建语音合成器
创建语言合成器时需要用到Cen t ral 类, 其作用是提供用来访问所有语音输入和输出的能力, 同时也可以定为语言引擎, 根据描述符所定义的属性集合选择匹配的引擎, 从而创建语音识别器和语音合成器。语音合成器的创建需使用Central类的createSynthesizer方法,该方法接受一个SynthesizerModeDesc描述符并返回同描述符中所指定属性相匹配的一个Synthesizer对象,用以实现语音合成。示例如下:
speechSynthesizer = Cent ral1createSynthesizer(descriptor)
⑤准备用于朗读的Synthesizer 对象
该部分通过Synthesizer对象的allocate和resume方法分配语音引擎所需要的资源并取得可用于朗读的语音合成器。实现较为简单:speechSynthesizer1allocate();speechSynthesizer1resume();
⑥设置Syn thesizer 对象的属性
利用getSynthesizerProperties 方法可以获得Synthesizer对象的属性,其返回值是与语音合成器相关联的SynthesizerProperties对象,该对象包含语音合成器的多种属性, 每种属性可以通过setProperties方法设置。例如: setSpeakingRate方法可设置speakingRate属性,实现每分钟朗读单词速率的控制。
示例:
SynthesizerP ropertiesproperties =
speechSynthesizer1getSynthesizerP roperties();
properties.setSpeakingRate(100.0f) ; //设置朗读速率,为浮点型数据
⑦事件处理程序设计
speak ingRate 属性, 实现每分钟朗读单词速率的控制。完成应用程序界面中JButton“读出号码”的事件程序设计, 首先通过JComboBox(选择人名的下拉列表)取得人名(namesArray)的一个索引,该索引与电话号码索引(numbersArray)保持对应,然后调用Synthesizer对象speakingPlainText方法朗读整理后的电话号码字符串。下面是主要功能实现代码:
private String[] namesArray = {“张三”,“王五”,“赵七”};
private String [] numbersA rray = {“071328616661”,“13871990001”,“07136767555”};
//部分界面设计代码, 省略
//⋯⋯
instruction.JLabel = new JLabel();
instruction.JLabel1setBounds(16,8,264,23);
//添加说明标签
instruction.JLabel1setText(“请从下拉列表中选择一个姓名1”);
contentPane.add(instruction.JLabel);
//设计下拉列表JComboBox, 此处略
//⋯
instruction JLabel = new JLabel() ;
instruction JLabel.setBounds(16,35,264,23) ;
//添加说明标签
instruction JLabel.setText (“单击按钮听号码朗读1”) ;
contentPane1add(instruction JLabel) ;
öö设计按钮JBut ton 以及其他界面, 此处略
//⋯
//编写按钮事件过程
private void getPhoneN umberJButtonActionPerformed
(ActionEvent event )
{
//获得下拉列表选定的索引
int selectedName = nameJComboBox1getSelectedIndex();
//设置朗读电话号码字符
String textToSpeak = "sphone number is " + numbersArray[selectedName];
//实现朗读
speechSynthesizer.speakPlainText(textToSpeak,null);
}
3.其他说明
开发者在验证或者运行该示例程序时需要注意运行环境的配置, 首先要安装好java2 软件包j2sdk,根据FreeTTS 的版本, j2sdk 至少应该为114版本,同时应对环境变量进行正确的设置。在程序设计中需要注意相关资源(如: Synthesizer对象) 的释放, 以使程序能够作为子模块高效运行,而不影响大型系统的整体性能。
2.2 MCU(LPC2132)主控程序
LPC2132 主控程序流程图如图3 所示,LPC2132首先初始化芯片ENC28J60初始化部分主要完成:软件复位;设定临时使用的以太网物理地址; 设定接收帧的类型;确定数据的传送方向;中断允许;使能接收中断;接收发送使能。LPC2132主要完成数据的解包打包。LPC2132从网络接收到数据报,则对数据报进行分析,如果是ARP数据包,则程序转入ARP处理程序。如果是IP数据包且使用UDP协议,端口正确,则将数据解包后通过串口输出。反之,如果LPC2132从串口收到数据,则将数据按照UDP 协议格式打包,送入ENC28J 60, 由ENC28J 60 把数据输出到局域网中。可以看出,链路层由ENC28J60 完成,TCP/IP 的网络层和传输层由LPC2132 来处理,而应用层则由用户根据需要进行数据处理。整个系统模块是通过UC/OS2II 来对系统资源进行有效管理并合理调度任务的。