背景

使用Java实现:输入文本或指定播放文件路径,实现循环播放、停止、放入多个播放队列依次播放;这里我使用的是Springboot。

实现步骤:

1、Java要实现语音播报,需要引入文件jacob-1.18-x64.dll到jdk的安装目录>>bin目录,文件下载地址(下载后记得解压):

链接:https://pan.baidu.com/s/1mRT0r-KF8o1Q56a_HgLQ-Q 
提取码:c3ze 

2、创建一个Springboot项目,在pox.xml中引入jar包

        <!-- https://mvnrepository.com/artifact/com.jacob/jacob 文字转语音 --><dependency><groupId>com.hynnet</groupId><artifactId>jacob</artifactId><version>1.18</version></dependency><!-- 播放MP3音乐 --><dependency><groupId>com.googlecode.soundlibs</groupId><artifactId>mp3spi</artifactId><version>1.9.5.4</version></dependency><!-- 如果需要解码播放flac文件则引入这个jar包 --><dependency><groupId>org.jflac</groupId><artifactId>jflac-codec</artifactId><version>1.5.2</version></dependency><!--播放音乐 使用第三方解决方案 (jaudiotagger.jar)--><dependency><groupId>org</groupId><artifactId>jaudiotagger</artifactId><version>2.0.3</version></dependency>

3、创建Music类,代码如下

package com.example.music;import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
import org.jaudiotagger.audio.AudioFile;
import org.jaudiotagger.audio.AudioFileIO;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import sun.audio.AudioPlayer;
import sun.audio.AudioStream;import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;@Component
@RequestMapping("/music")
public class Music extends Thread{//tts语音播报private static List<String> strList=new ArrayList<>();private static Thread tts = new Thread();//播放音乐private static AudioStream as=null;private static Thread t = new Thread();/*文字转语音播报开始*/@GetMapping("/ttsStart")public void  ttsStart(String text) {ActiveXComponent activeXComponent = new ActiveXComponent("Sapi.SpVoice");//运行时输出语音内容Dispatch dispatch = activeXComponent.getObject();//文件名称long t1=System.currentTimeMillis();String strName= String.valueOf(t1);strList.add(strName);try{//生成语音文件activeXComponent = new ActiveXComponent("Sapi.SpFileStream");Dispatch fileStreamDispatch = activeXComponent.getObject();//音频activeXComponent = new ActiveXComponent("Sapi.SpAudioFormat");Dispatch audioDispatch = activeXComponent.getObject();//设置文件流格式Dispatch.putRef(fileStreamDispatch, "Format", audioDispatch);//设置音频流格式Dispatch.put(audioDispatch, "Type", new Variant(22));//调用输出文件流打开方法,创建一个.wav .mp3 .mp4   .wma文件Dispatch.call(fileStreamDispatch, "Open", new Variant("D:\\"+strName+".wav"),new Variant(3),new Variant(true));//设置声音对象的音频流输出流为输出文件对象Dispatch.putRef(dispatch, "AudioOutputStream", fileStreamDispatch);//设置音量0-100Dispatch.put(dispatch, "Volume", new Variant(100));//设置朗读速度Dispatch.put(dispatch, "Rate", new Variant(-2));//开始朗读Dispatch.call(dispatch, "Speak",new Variant(text));//关闭输出文件流Dispatch.call(fileStreamDispatch, "Close");Dispatch.putRef(dispatch, "AudioOutputStream", null);audioDispatch.safeRelease();fileStreamDispatch.safeRelease();dispatch.safeRelease();activeXComponent.safeRelease();//判断线程状态if(!tts.isAlive()){tts = new Thread(){public void run(){//是否正在播放音乐if(t.isAlive()){musicStop();}//播放音频ttsPlayer();}};tts.start();}}catch (Exception e) {e.printStackTrace();}}//播放音频public void ttsPlayer(){try {for(int i=0;i<strList.size();i++){//输出音频时长File file=new File("D:\\"+strList.get(i).toString()+".wav");AudioFile mp3= AudioFileIO.read(file);FileInputStream fileau=new FileInputStream("D:\\"+strList.get(i)+".wav");as=new AudioStream(fileau);//开始播放AudioPlayer.player.start(as);Thread.sleep(mp3.getAudioHeader().getTrackLength()*1000+500);}if(strList.size()>0){ttsPlayer();}}catch (Exception e){e.printStackTrace();}}/*文字转语音播报停止*/@GetMapping("/ttsStop")public void  ttsStop(Integer index){try {//全部终止播放if(index==-1){//停止线程tts.interrupt();//停止播报AudioPlayer.player.stop(as);//清空列表所有元素strList.clear();}else if(index>-1){//将指定脚标删除strList.remove(strList.get(index));}}catch (Exception e) {e.printStackTrace();}}/*开始播放音乐*/@GetMapping("/playStart")public void musicStart(String path){//判断是否正在语音播报if(!tts.isAlive()){//停止线程t.interrupt();//停止播放AudioPlayer.player.stop(as);t = new Thread(){public void run(){try{//输出音频时长File file=new File(path);AudioFile mp3= AudioFileIO.read(file);//System.out.println(mp3.getAudioHeader().getTrackLength());//循环播放while (true){FileInputStream fileau=new FileInputStream(path);as=new AudioStream(fileau);//开始播放AudioPlayer.player.start(as);Thread.sleep(mp3.getAudioHeader().getTrackLength()*1000+500);}}catch (Exception e){e.printStackTrace();}}};//启动线程t.start();}}/*停止播放音乐*/@GetMapping("/playStop")public void musicStop(){try {//判断是否正在语音播报if(!tts.isAlive()) {//停止线程t.interrupt();//停止播放AudioPlayer.player.stop(as);}}catch (Exception e) {e.printStackTrace();}}
}

4、启动项目后就可以使用了,接口信息如下

地址 请求方式 传入参数类型 传入参数名称 说明
http://{ip}:{port}/music/ttsStart GET String text text为需要播报的内容
http://{ip}:{port}/music/ttsStop GET Integer index index为需要将移除播报队列的下标,如果为-1,表示停止所有播报
http://{ip}:{port}/music/playStart GET String path path为播放音乐文件的路径
http://{ip}:{port}/music/playStop GET 停止播放音乐

5、我本地是用的Postman测试如下:


我使用的线程控制的开始和停止,如有更好的方法欢迎留言讨论!

Java实现文字转语音(TTS)和指定路径播放音频文件相关推荐

  1. 汉字转拼音,文字转语音tts (语音技术、语音识别),Asr/tts,变声

    语音识别,语音合成.语音技术主要分两块:一块是语音转文字,即语音识别:另一块是文字转语音,即语音合成.   语音相关技术研发 语音合成技术整体解决方案.一系列语音技术的相关专利,包括文本处理.韵律预测 ...

  2. JAVA将文字转语音文件

    JAVA将文字转语音文件 public class MediaDemoApplication {public static void main(String[] args) {textToSpeech ...

  3. SwiftUI 文字转语音TTS 开发朗读器 AVSpeechSynthesizer(教程含源码)

    实战需求 SwiftUI 文字转语音TTS 开发朗读器 本文价值与收获 看完本文后,您将能够作出下面的界面 看完本文您将掌握的技能 AVFoundation AVSpeechSynthesizer A ...

  4. 基于ROS2和科大讯飞的文字转语音TTS入门教程

    基于ROS2和科大讯飞的语音转文字入门教程 基于ROS2和科大讯飞的文字转语音TTS入门教程 1.环境搭建 2.创建工程 3.编译和执行 基于ROS2和科大讯飞的文字转语音TTS入门教程 本文将展示, ...

  5. Java中使用Jacob实现Windows下语音合成并生成音频文件

    场景 在服务端根据执行的中文文字内容合成相应的音频文件. 这里推荐一种在Windows下调用jacob.dll文件实现语音合成. 注: 博客: https://blog.csdn.net/badao_ ...

  6. 删除指定路径下的文件

    string pathstr = System.Web.HttpContext.Current.Server.MapPath("/FilePath"); if (Directory ...

  7. python创建文件夹用什么函数_Python——os.mkdir()在指定路径下创建文件夹 + 路径的连接理解...

    Python--os.mkdir()在指定路径下创建文件夹 + 路径的连接理解 发布时间:2018-11-16 17:08, 浏览次数:512 , 标签: Python os mkdir 引子: 我在 ...

  8. CopyFile复制单个文件和复制指定路径下所有文件

    CopyFile复制单个文件和复制指定路径下所有文件 1.CopyFile复制单个文件 2.CopyFile复制指定路径下所有文件 1.CopyFile复制单个文件 原型: BOOL CopyFile ...

  9. 删除指定路径下的文件及文件夹操作

    1.删除指定路径下的文件及文件夹是指将次路径下的的文件夹内(包含此文件夹)所有的文件及文件夹全部删除. 2.DeleteRuninFile中删除文件的代码主要在两个方法中,如下: private bo ...

最新文章

  1. 如何获取boss直聘搜索牛人被屏蔽的姓名
  2. RabbitMQ基本概念(一)-RabbitMQ的优劣势及产生背景
  3. 纯CSS实现提示框小三角
  4. 中南民族大学计算机图像处理实验报告,中南民族大学数字图像处理程序及图像...
  5. nuxt引用static或者assets目录下资源注意事项
  6. Python之路(二)Python基础
  7. nyoj-673-悟空的难题(数组标记)
  8. linux source多个文件夹,linux下source命令使用详解
  9. include问题及错误解决
  10. JS事件流与DOM事件处理程序
  11. 映美精IC Imageing Control .net控件调试问题
  12. python flv转mp4_ffmpeg将多个flv文件合成为mp4(golang版)
  13. 2005 年下半年程序员上 下午试卷
  14. 苏嵌//张福辉//2018.7.11
  15. KeyMob聚合广告携手开发者 共谋移动应用广告的福利
  16. pytorch中tf.nn.functional.softmax(x,dim = -1)对参数dim的理解
  17. 农产品进出口成都代办公司注册流程
  18. 生态学建模:增强回归树(BRT)预测短鳍鳗生存分布和影响因素
  19. 戴尔笔记本inspiron5488增大内存
  20. socket事例代码

热门文章

  1. python爬虫(一):正则表达式爬取网页文本
  2. csol永恒python评测_反恐精英Online情报中心 - CSOL - 官方网站 - 世纪天成游戏 - 火爆战场真实体验!...
  3. elementui表格父子表_vue+element-ui实现主子表
  4. ckPlayer使用
  5. 狮子鱼团购社区模拟器显示没内容的解决方法
  6. 【096】小画桌-在线协作白板工具
  7. 什么形状的耳机戴着舒服?不伤耳骨传导耳机
  8. 1553B 协议详解之二字的组成
  9. ASW 工作流最佳实践(二):使用 ASW 并发调用函数
  10. 数学建模-商人过河问题