【离线文本转语音文件】java spring boot jacob实现文字转语音文件,离线文本转化语音,中英文生成语音,文字朗读,中文生成声音,文字生成声音文件,文字转语音文件,文字变声音。
1.实现效果如下:
输入文字(支持中英文),点击转换生成***.wav文件,点击下载到本地就可。
生成后的音频文件播放,时长1分8秒
2.实现代码:
这次采用jacob实现,相比百度AI需要联网,本项目定位内网环境实现。所以最终采jacob。
1.环境配置:
本次采用版本jacob-1.19,我们需要下载jacob.jar和dll
下载地址:jacob语音生成文件,jacobx64.dll和jacob.jar为1.9-Java文档类资源-CSDN下载
官网地址:JACOB - Java COM Bridge download | SourceForge.net
下载后得到两个文件:
jacob.dll:配置到jdk环境中
jacob.jar:放入到项目中并配置下pox和Idea 的dependencies下
第一步:
jacob.dll放入:C:\Program Files\Java\jdk1.8.0_121\jre\bin
第二步:
1.首先有一个spring boot项目,没有就搭建一个
2.把jacob放到项目resources>lib目录下
3.在pom.xml文件添加依赖:
<!--添加本地的jacob.jar包--><dependency><groupId>com.jacob</groupId><artifactId>jacob</artifactId><version>1.19</version><!--system使用本地jar包--><scope>system</scope><systemPath>${basedir}/src/main/resources/lib/jacob.jar</systemPath></dependency>
4.在idea下的项目中添加依赖包,
5.这样环境就搭建完成。
2.编码:
核心代码,这样就可以输入文字,生成音频文件保存到本地目录中,然后下载音频文件就只需要读取文件就可以。
//输入文本内容,生成文件地址 text为输入的文本信息public void audioFile(String text){try {//jacob.dll没成功安装,执行这一步会出错//构建音频格式 调用注册表应用Dispatch spAudioFormat = new ActiveXComponent("Sapi.SpAudioFormat").getObject();//音频文件输出流Dispatch spFileStream = new ActiveXComponent("Sapi.SpFileStream").getObject();//构建音频对象Dispatch spVoice = new ActiveXComponent("Sapi.SpVoice").getObject();//设置spAudioFormat音频流格式类型22Dispatch.put(spAudioFormat, "Type", new Variant(22));//设置spFileStream文件输出流的音频格式Dispatch.putRef(spFileStream, "Format", spAudioFormat);//设置spFileStream文件输出流参数地址等 Dispatch.call(spFileStream, "Open", new Variant("D:\speech\48641486.wav"), new Variant(3), new Variant(true));//设置spVoice声音对象的音频输出流为输出文件对象Dispatch.putRef(spVoice, "AudioOutputStream", spFileStream);//设置spVoice声音对象的音量大小100Dispatch.put(spVoice, "Volume", new Variant(100));//设置spVoice声音对象的速度 0为正常速度,范围【..-2 -1 0 1 2..】Dispatch.put(spVoice, "Rate", new Variant(0));//设置spVoice声音对象中的文本内容Dispatch.call(spVoice, "Speak", new Variant(text));//关闭spFileStream输出文件Dispatch.call(spFileStream, "Close");//释放资源spVoice.safeRelease();spAudioFormat.safeRelease();spFileStream.safeRelease();}catch (Exception e){System.out.println(e.getMessage());}}
3.其他业务代码:非核心
下面就贴上完整的项目代码和配置文件
1.项目结构:
主要就几个文件:HomeController、TextToSpeechFileService、index.html、pom.xml
2.pom.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>text_speech</artifactId><version>0.0.1-SNAPSHOT</version><name>text_speech</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>2.5.0</spring-boot.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId><version>2.5.0</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><!--添加本地的jacob.jar包--><dependency><groupId>com.jacob</groupId><artifactId>jacob</artifactId><version>1.19</version><!--system使用本地jar包--><scope>system</scope><systemPath>${basedir}/src/main/resources/lib/jacob.jar</systemPath></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.5.0</version><configuration><mainClass>com.example.text_speech.TextSpeechApplication</mainClass></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build></project>
3.index.xml
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head><meta charset="UTF-8"><title>文字转语音</title><link rel="shortcut icon" href="https://pic.onlinewebfonts.com/svg/img_196224.png"><link th:href="@{/plugins/layui/src/css/layui.css}" type="text/css" rel="stylesheet"/><script th:inline="javascript">let ctx = /*[[@{/}]]*/ '';</script>
</head>
<body><fieldset class="layui-elem-field layui-field-title" style="margin-top: 80px;"><legend>文字转音频文件</legend></fieldset><div class="layui-bg-gray" style="padding: 30px;"><div class="layui-row layui-col-space15"><div class="layui-col-md6"><!--一行内容块--><div class="layui-form-item layui-form-text layui-panel" ><textarea placeholder="请输入内容,支持中英文字。" id="textContent" class="layui-textarea" style="height: 400px"></textarea></div></div><div class="layui-col-md6 "><div class="layui-form-item "style="width: 100px"><button style="margin-top: 100px;" class="layui-btn" onclick="getAudioFile()" >生成音频文件</button></div><div class="layui-panel" style="width: 400px;margin-left: 200px;top: -50px;height: 200px" ><div id="noFile" style="margin: 20px">等待生成文件。</div><div id="existFile" hidden><h3 style="text-align: center">音频文件已经生成</h3><div style="margin: 20px" ><div>文件名称:<span id="fileName"></span></div><div>文件格式:<span id="fileFormat"></span></div><div>创建时间:<span id="fileDate"></span></div></div><button style="margin: 20px;margin-left: 35%" class="layui-btn" onclick="downFile()">下载文件</button></div></div></div></div></div></div>
</body>
<script th:src="@{/plugins/jquery/jquery-1.12.0.min.js}" type="text/javascript"></script>
<script th:src="@{/plugins/layui/src/layui.js}" type="text/javascript"></script>
<script type="text/javascript">/*文字转换*/function getAudioFile(){let loading = layer.load('Loading...', {shade: [0]});let text = $("#textContent").val();$.post("./tts",{"textContent":text},function (data) {layer.close(loading);if (data.code==="1"){$("#existFile").show();$("#noFile").hide();$("#fileName").html(data.name);$("#fileFormat").html(data.format);$("#fileDate").html(data.date);}else {$("#existFile").hide();$("#noFile").show();$("#noFile").html("文件生成发生错误。请检查输入内容。保证只有标准的标点符号和文字。");}})}/*下载文件*/function downFile(){window.open("./downFile?fileName="+$("#fileName").html(), "_blank");}</script>
</html>
3.HomeController
package com.example.text_speech.controller;import com.example.text_speech.service.TextSpeechService;
import com.example.text_speech.service.TextToSpeechFileService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;@Controller
public class HomeController {@Autowiredprivate TextToSpeechFileService textToSpeechFileService;/**** @Author: LiaoJJ* @Description:主页*/@RequestMapping({"/index","/",""})public ModelAndView index(){return new ModelAndView("index");}/**** @Author: admin* @Description: 文本转语音*/@RequestMapping("/tts")@ResponseBodypublic HashMap<String,String> textTransformAudio(String textContent){return textToSpeechFileService.audioFile(textContent);}/**** @Author: admin* @Description: 下载文件*/@RequestMapping("/downFile")@ResponseBodypublic void down(String fileName, HttpServletResponse response){textToSpeechFileService.down(fileName,response);}}
4.TextToSpeechFileService
package com.example.text_speech.service;import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.stereotype.Service;import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.UUID;/**** @Author: LiaoJJ* @Date: 2022/10/12* @Description:文字转语音文件*/
@Service
@ComponentScan
public class TextToSpeechFileService {//语音文件生成的临时文件@Value("${filePath}")private String path;//输入文本内容,生成文件地址public HashMap<String,String> audioFile(String text){HashMap<String , String> map = new HashMap<>();try {//构建音频格式 调用注册表应用Dispatch spAudioFormat = new ActiveXComponent("Sapi.SpAudioFormat").getObject();//音频文件输出流Dispatch spFileStream = new ActiveXComponent("Sapi.SpFileStream").getObject();//构建音频对象Dispatch spVoice = new ActiveXComponent("Sapi.SpVoice").getObject();//设置spAudioFormat音频流格式类型22Dispatch.put(spAudioFormat, "Type", new Variant(22));//设置spFileStream文件输出流的音频格式Dispatch.putRef(spFileStream, "Format", spAudioFormat);//随机uuidString uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");String filePath = path + uuid + ".wav";//设置spFileStream文件输出流参数地址等Dispatch.call(spFileStream, "Open", new Variant(filePath), new Variant(3), new Variant(true));//设置spVoice声音对象的音频输出流为输出文件对象Dispatch.putRef(spVoice, "AudioOutputStream", spFileStream);//设置spVoice声音对象的音量大小100Dispatch.put(spVoice, "Volume", new Variant(100));//设置spVoice声音对象的速度 0为正常速度,范围【..-2 -1 0 1 2..】Dispatch.put(spVoice, "Rate", new Variant(0));//设置spVoice声音对象中的文本内容Dispatch.call(spVoice, "Speak", new Variant(text));//关闭spFileStream输出文件Dispatch.call(spFileStream, "Close");//释放资源spVoice.safeRelease();spAudioFormat.safeRelease();spFileStream.safeRelease();map.put("code","1");map.put("name",uuid + ".wav");map.put("format","wav");SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");map.put("date",sdf.format(new Date()));}catch (Exception e){System.out.println(e.getMessage());map.put("code","0");}return map;}/**** @Author: LiaoJJ* @Description: 下载文件*/public void down(String fileName, HttpServletResponse response) {try {response.reset();response.setCharacterEncoding("UTF-8");response.setContentType("application/octet-stream");//3.设置content-disposition响应头控制浏览器以下载的形式打开文件response.addHeader("Content-Disposition","attachment;filename=" + new String(fileName.getBytes(),"utf-8"));//获取文件输入流InputStream in = new FileInputStream(path+fileName);int len = 0;byte[] buffer = new byte[1024];OutputStream out = response.getOutputStream();while ((len = in.read(buffer)) > 0) {//将缓冲区的数据输出到客户端浏览器out.write(buffer,0,len);}in.close();}catch (Exception e){e.getMessage();System.out.println("文件下载失败");}}}
5.application.yml
# 应用名称
spring:application:name: text_speechdevtools:restart:enabled: trueadditional-paths: resources/**,static/**,templates/**thymeleaf:prefix: classpath:/templates/suffix: .htmlcache: false # 开启模板缓存encoding: UTF-8servlet:content-type: text/htmljackson:date-format: yyyy-MM-dd HH:mm:sstime-zone: GMT+8resources:add-mappings: true#静态资源访问路径static-locations: classpath:/static,classpath:/templates/,file:${config.file.root}# 应用服务 WEB 访问端口
server:port: 8080#配置本地临时文件夹
filePath: D:\speech\
通过上面的几个文件代码,就可以实现文章前面web页面的效果了。
本文章只是一个demo演示。应用到具体业务中还需要做一些修改。
如果其中存在什么问题回复到评论区,及时修改。感谢阅览。
【离线文本转语音文件】java spring boot jacob实现文字转语音文件,离线文本转化语音,中英文生成语音,文字朗读,中文生成声音,文字生成声音文件,文字转语音文件,文字变声音。相关推荐
- Spring Boot概述与入门特点配置方式注入方式yim配置文件与多文件配置Spring Boot自动配置原理lombok应用
1. Spring Boot概述 Spring Boot是Spring项目中的一个子工程,与我们所熟知的Spring-framework 同属于spring的产品: 首页Spring Boot简介可以 ...
- Java Spring Boot VS .NetCore (七) 配置文件
Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ...
- Java Spring Boot 2.0 实战之制作Docker镜像并推送到Docker Hub和阿里云仓库
内容摘要:大规模集群快速部署Java应用,需要制作Docker镜像,本次课程详细介绍如何制作Java程序的Docker镜像文件,深入解析DockerFile核心参数,以及实践演练把我们制作的Docke ...
- Java Spring Boot 2.0实战Docker容器与架构原理,视频与课件,基于Linux环境...
Java Spring Boot 2.0实战Docker容器Linux与架构原理 内容摘要:Docker是最流行的开源容器引擎,Go语言开发,在互联网大规模集群.云计算.微服务等架构中广泛使用.本次课 ...
- JAVA Spring Boot与海康威视摄像头的故事
<菜鸟学JAVA第一篇> 前言:JAVA Spring Boot与海康威视摄像头的故事 关于本贴 干货部分 进入官网,选择sdk下载: 下载所需要的开发包(以下教程以windows为例): ...
- Java+Spring Boot 二手书交易系统
目录 1 系统简介 2 系统相关技术 2.1 Java EE 2.2 Springboot框架 2.3 Maven技术 2.4 Tomcat服务器 2.5 MySQL 3 需求分析 3.1 需求概述 ...
- 【直播回顾】云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第19讲):Java Spring Cloud微服务架构模式与开发实战...
主讲人:徐雷(云栖社区特邀Java专家) 徐雷,花名:徐雷frank:资深架构师,MongoDB中文社区联席主席,吉林大学计算机学士,上海交通大学硕士.从事了 10年+开发工作,专注于分布式架构,Ja ...
- 云栖社区特邀专家徐雷——Java Spring Boot开发实战系列课程【往期直播回顾】...
徐雷,花名:徐雷frank:资深架构师,MongoDB中文社区联席主席,吉林大学计算机学士,上海交通大学硕士.从事了 10年+开发工作,专注于分布式架构,Java Spring Boot.Spring ...
- 毕设项目——智慧小区系统(Java Spring Boot+Vue ElementUI)
毕设项目--智慧小区系统(Java Spring Boot+Vue ElementUI) 项目初衷(最真实版) 系统技术分析 前端界面 后端及数据库 系统功能介绍 小区业主端 物业人员端 系统界面展示 ...
最新文章
- python免费试听-线上儿童编程免费试听-品质保障
- 一文说说这十多年来计算机玩摄影的历史
- telnet客户端模拟浏览器发送请求
- 通过Sqoop实现Mysql / Oracle 与HDFS / Hbase互导数据
- NYOJ 8 一种排序
- [Python人工智能] 二十三.基于机器学习和TFIDF的情感分类(含详细的NLP数据清洗)
- QLineEdit学习
- 数学家田野:感谢坐冷板凳的那六年
- 深入理解JVM-类加载器深入解析(3)
- CentOS 7.x下部署和配置zabbix 3.2.x监控工具
- fragment--总结
- python在字典中插入新的数据_Python数据类型之字典dict
- SolidWorks自定义装配体模板的方法
- python课程设计实验报告-python课程设计
- lsa五类_LSA 的五种类型
- 301代码php代码在哪里加,php 301转向实现代码
- 雷神五代笔记本U盘重装系统图文教程
- 最佳实战 | 如何使用腾讯云微搭从0到1开发企业门户应用
- 写作的意义,从一枚勋章开始
- 北京某公司前端笔试题及其答案