需求
写出一个语音播报方法的工具类,
需要window系统支持,外部导入jacob这个jar包以及dll文件的位置设置,主要是通过java工具类来实现;(但是这种导入Jacob包的方法只适合在window的开发环境使用,因为里面的dll文件只支持在Windows环境下的com组件运行,而Linux系统不适用)
jacob实现
Jacob 是 JAVA-COM Bridge的缩写,是一个中间件,能够提供自动化访问MS系统下COM组件和Win32 libraries的功能。
核心类:
JacobObject:用于Java程序MS下的COM进行通信,创建标准的API框架
ComThread:初始化COM组件线程,释放线程,对线程进行管理
Dispatch:调度处理类,封装了操作来从而操作Office,并表示不同MS级别调度对象
ActiveXComponent : 创建COM组件
Variant : 与COM通讯的参数或者返回值
ROT :Running Object Table (ROT),运行对象表将每个线程映射到所有jacobobjects,在线程创建
核心方法:
Dispatch : 可调用该自动化对象的属性或方法,具体的属性和方法要看参考文档VBA API
Dispatch.get(dispatch, String name);获取对象属性
Dispatch.put(dispatch, String name, Object value);设置对象属性
Dispatch.call(dispatch, String name, Object… args);调用对象方法
实现步骤:
第一步:下载jar包
D:\workspace\env\jars\jacob-1.17-M2
第二步:复制动态链接库dll
复制动态链接库 jacob-1.17-M2-x64.dll 到window系统和jdk目录中:
C:\Windows\System32
C:\Program Files\Java\jdk1.8.0_45\bin
第三步:配置idea
引入jar包支持
第四步:测试类
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
import org.junit.jupiter.api.Test;
/**
* @version v1.0 创建时间:15:03
* @author: 作者:陈子枢
* @web CSDN:https://blog.csdn.net/nutony
* @description 描述:
*/
public class TestVoice {
public void strat(String content, int type) {
ActiveXComponent sap = new ActiveXComponent("Sapi.SpVoice");
Dispatch sapo = sap.getObject();
if (type == 0) {
try {
// 音量 0-100
sap.setProperty("Volume", new Variant(100));
// 语音朗读速度 -10 到 +10
sap.setProperty("Rate", new Variant(1.3));
Variant defalutVoice = sap.getProperty("Voice");
Dispatch dispdefaultVoice = defalutVoice.toDispatch();
Variant allVoices = Dispatch.call(sapo, "GetVoices");
Dispatch dispVoices = allVoices.toDispatch();
Dispatch setvoice = Dispatch.call(dispVoices, "Item",
new Variant(1)).toDispatch();
ActiveXComponent voiceActivex = new ActiveXComponent( dispdefaultVoice);
ActiveXComponent setvoiceActivex = new ActiveXComponent(setvoice);
Variant item = Dispatch.call(setvoiceActivex, "GetDescription");
// 执行朗读
Dispatch.call(sapo, "Speak", new Variant(content));
} catch (Exception e) {
e.printStackTrace();
} finally {
sapo.safeRelease();
sap.safeRelease();
}
} else {
// 停止
try {
Dispatch.call(sapo, "Speak", new Variant(content), new Variant(2));
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}
/**
*
* @Title: test
* @Description: 该方法的主要作用:执行朗读内容
* @param 设定文件
* @return 返回类型:void
* @throws
*/
@Test
public void test()
{
strat("恭喜你,答对了", 0);
strat("写个for循环", 0);
}
}