功能案例----java实现语音播报功能

功能案例----java实现语音播报功能

根据自己最近的写的项目,总结整理了关于java语音播报功能的方法,可分为两种形式

  • 一种是通过自己写出一个语音播报方法的工具类,然后从前端获取文本数据,最后跳到控制层进行语音播报方法的调用,但是这种方式需要外部导入jacob这个jar包以及dll文件的位置设置,主要是通过java工具类来实现;(但是这种导入Jacob包的方法只适合在window的开发环境使用,因为里面的dll文件只支持在Windows环境下的com组件运行,而Linux系统不适用)
  • 另一种就是通过简单的JS来实现的语音播报,主要是用了SpeechSynthesisUtterance,它是HTML5中新增的API,用于将指定文字合成为对应的语音.也包含一些配置项,指定如何去阅读(语言,音量,音调)等

通过java工具类的实现方法:

使用此方法需要先在官网下载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)

  1. Java语音播报的工具类代码:
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方法代码

利用js的话就不需要导入jar包,也不需要工具类和控制层代码了,直接写一个js,直接放在想播报的页面,引用voice方法即可,原理和上面的一样。代码如下:如果是单独写的JS文件就不需要在用script标签了。

<script type="text/javascript">
					var msg = new SpeechSynthesisUtterance("输入要朗读的文字");
					window.speechSynthesis.speak(msg);

				</script>

两种方法我都用过了,因为后面要把项目上传到服务器更新,而我的开发是在本地windows,所以开始踩了jar包的坑,当然如果jar包导入方式不对或者文件位置没有放对,那么也会报错的,后来我用了js的放啊,亲测两种方法都有效。如果使用jar包有问题可以网上搜一下错误原因,无非就是那么几种。

你可能感兴趣的:(功能案例)