根据自己最近的写的项目,总结整理了关于java语音播报功能的方法,可分为两种形式
- 一种是通过自己写出一个语音播报方法的工具类,然后从前端获取文本数据,最后跳到控制层进行语音播报方法的调用,但是这种方式需要外部导入jacob这个jar包以及dll文件的位置设置,主要是通过java工具类来实现;(但是这种导入Jacob包的方法只适合在window的开发环境使用,因为里面的dll文件只支持在Windows环境下的com组件运行,而Linux系统不适用)
- 另一种就是通过简单的JS来实现的语音播报,主要是用了SpeechSynthesisUtterance,它是HTML5中新增的API,用于将指定文字合成为对应的语音.也包含一些配置项,指定如何去阅读(语言,音量,音调)等
使用此方法需要先在官网下载jar包文件(如果是可以连接外网的可以直接使用maven依赖,内网开发公司本地仓库没有这个包的就需要导入)
官网下载依赖:https://mvnrepository.com/artifact/com.jacob/jacob/1.10
jar包下载地址:https://pan.baidu.com/s/1qXPgCzy 密码:xigv
解压jar包,将jacob.jar复制到工程目录,右键该文件→Build Path→Add to…
将jacob-1.17-M2-x86.dll添加到JDK的bin目录和Windows的system32目录(64位系统添加jacob-1.17-M2-x64.dll)
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
import org.junit.jupiter.api.Test;
public class Voice2 {
/**
* @Title: strat
* @Description: 该方法的主要作用:朗读
* @param @param content
* @param @param type 设定文件 0:开始,1停止
* @return 返回类型:void
* @throws
*/
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("110千伏金华站", 0);
}
}
2.从前端拿数据的JS
function voice (text){
$.ajax({
async:true, //请求是否异步,ajax重要特性
url:"th-robot/voice/Announcement",//此处放你控制层的url即可(这里我随意写的地址)
data:{text:encodeURI(text)},//参数值
type:"get",//请求方式
dataType:"json",
contentType:"text/json,charset=utf-8",
success:function(data){
mini.showTips({
content:"加载成功",
state:"success",
timeout:3000
});
},
error:function(msg){
mini.showTips({
content:"加载失败",
state:"fail",
timeout:3000,
});
}
});
};
3.后台控制层代码:
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
//根据页面传来的文字信息进行调用语音播报的工具类方法
@Controller
@RequestMapping(value="/voice")
public class VoiceAnnouncementController{
@RequestMapping(value="Announcement",produces={"application/json;charset-UTF-8"})
@ResponseBody
public void voice(HttpServletRequest request) throws ParseException{
String text = StringUyil.getNotNullStr(request.getParameter("text"));
try{
text = URLDecoder.decode(text,"utf-8");
}catch(UnsupportedEncodingException e){
e,printStackTrace();
}
System.out.println("语音播放内容为:"+text);
VoiceAnnouncement.strat(text,-1);
}
}
3.最后只需要在你想播报的那个JSP中使用vioce(“你想播报的信息”)即可,当然也可以根据实际情况做成动态数据。
利用js的话就不需要导入jar包,也不需要工具类和控制层代码了,直接写一个js,直接放在想播报的页面,引用voice方法即可,原理和上面的一样。代码如下:如果是单独写的JS文件就不需要在用script标签了。
<script type="text/javascript">
var msg = new SpeechSynthesisUtterance("输入要朗读的文字");
window.speechSynthesis.speak(msg);
</script>
两种方法我都用过了,因为后面要把项目上传到服务器更新,而我的开发是在本地windows,所以开始踩了jar包的坑,当然如果jar包导入方式不对或者文件位置没有放对,那么也会报错的,后来我用了js的放啊,亲测两种方法都有效。如果使用jar包有问题可以网上搜一下错误原因,无非就是那么几种。