JAVA将MP3转为WAV(实现百度语音转译)
近期实现的功能,不多说直接上代码(记得一些必要参数要配成自己的哈):
注意:1.本文由于存在语音文件的转换(百度api只支持pcm wav等有限类型,所以其他格式的音频需要自己转换),采用了ffmpeg,这个自己去官网下载就好。
2.本文包含文件服务器整合和上传功能,需要根据自己的需要进行修改和配置(整合了fastdfs客户端,实现文件服务器交互)
/**
*
* 语音接收
*
* @param dialogVO
* @return
*/
@PostMapping(value = "/receiveVoice")
public JsonResult receiveVoice(@RequestBody DialogVO dialogVO, HttpServletRequest request) throws IOException, InterruptedException {
// byte[] base = base64Util.imageTobyte("D:\\VOICE/1234.mp4");
// dialogVO.setVoiceBase64(base64Util.encode(base));
if (StringUtils.isBlank(dialogVO.getVoiceBase64())) {
return renderError("语音流不能为空");
}
if (StringUtils.isBlank(dialogVO.getSuffix())) {
return renderError("文件后缀不能为空");
}
//文件名
String uuid = UUID.randomUUID().toString().replace("-", "");
String fileName = uuid+ dialogVO.getSuffix();
String fileNameWav = uuid + ".wav";
//文件输出地址
// String filePath = "D:\\VOICE";
// fileName = "1111.mp3";
// String filePath = "/vol/facenas/voice";
//生成字节数组,并转文件输出到指定目录
byte[] bytes = base64Util.decode(dialogVO.getVoiceBase64(), fileName, filePath);
//字节数组转输入流
InputStream inputStream = new ByteArrayInputStream(bytes);
//转为MultipartFile
MultipartFile multipartFile = new MockMultipartFile("copy" + fileName, fileName, ContentType.APPLICATION_OCTET_STREAM.toString(), inputStream);
//上传到文件服务器并返回地址
String sourcePath = fastdfsClientUtil.uploadFile(multipartFile);
//语音转译
String[] cmdarr = new String[13];
cmdarr[0] = "ffmpeg";
cmdarr[1] = "-y";
cmdarr[2] = "-i";
cmdarr[3] = filePath+"/"+fileName;
cmdarr[4] = "-acodec";
cmdarr[5] = "pcm_s16le";
cmdarr[6] = "-f";
cmdarr[7] = "wav";
cmdarr[8] = "-ac";
cmdarr[9] = "1";
cmdarr[10] = "-ar";
cmdarr[11] = "16000";
cmdarr[12] = filePath+"/"+fileNameWav;
//转mp4
//String cmd = "ffmpeg -y -i "+filePath+"/"+fileName+" -acodec aac -f mp4 -ac 1 -ar 16000 "+filePath+"/"+fileNameWav;
//转pcm
//String cmd = "ffmpeg -y -i "+filePath+"/"+fileName+" -acodec pcm_s16le -f s16le -ac 1 -ar 16000 "+filePath+"/"+fileNameWav;
//wav转mp3
//String test = "ffmpeg -i "+filePath+"/"+fileName+" -f mp3 -acodec libmp3lame -y "+filePath+"/"+fileNameWav;
Process process = Runtime.getRuntime().exec(cmdarr);
//输出日志,linux环境不输出的话会导致无法生成转译文件,考虑为执行时间的原因
InputStream is = process.getErrorStream();
InputStreamReader rea = new InputStreamReader(is);
BufferedReader buf = new BufferedReader(rea);
String line ="";
while((line=buf.readLine())!= null){
LOGGER.debug("---------"+line);
}
process.getOutputStream().close();
process.getInputStream().close();
process.getErrorStream().close();
process.waitFor();
//File file=new File(filePath+"/"+fileNameWav);
byte[] baseWav = base64Util.imageTobyte(filePath+"/"+fileNameWav);
dialogVO.setVoiceBase64(base64Util.encode(baseWav));
//TODO百度转译方案
// header参数
Map<String, String> headParameters = new HashMap<>();
// 普通参数
JSONObject parameters = new JSONObject();
String jsonStr = "";
try {
jsonStr = JsonPost.jsonHeaderPost("https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=xxx&client_secret=xxx", headParameters, parameters.toJSONString());
LOGGER.info("调用百度token转换接口返回值为:"+jsonStr+"");
} catch (Exception e) {
LOGGER.error("调用百度token转换接口失败");
}
JSONObject jsonObj = JSON.parseObject(jsonStr);
// header参数
Map<String, String> voiceHeadParameters = new HashMap<>();
voiceHeadParameters.put("Content-Type","application/json");
// 普通参数
JSONObject voiceParameters = new JSONObject();
voiceParameters.put("format","wav");
voiceParameters.put("rate",16000);
voiceParameters.put("dev_pid",1537);
voiceParameters.put("channel",1);
voiceParameters.put("token",jsonObj.get("access_token"));
voiceParameters.put("cuid","baidu_workshop");
voiceParameters.put("len",baseWav.length);
voiceParameters.put("speech",dialogVO.getVoiceBase64());
String voiceJsonStr = "";
try {
voiceJsonStr = JsonPost.jsonHeaderPost("http://vop.baidu.com/server_api", voiceHeadParameters, voiceParameters.toJSONString());
LOGGER.info("调用百度语音转换接口返回值为:"+voiceJsonStr+"");
} catch (Exception e) {
LOGGER.error("调用百度语音转换接口失败");
}
JSONObject voiceJsonObj = JSON.parseObject(voiceJsonStr);
List<String> voiceStr = (List<String>) voiceJsonObj.get("result");
StringBuffer content = new StringBuffer();
if(null != voiceStr){
for(String str : voiceStr){
content.append(str);
}
}
Map<String, Object> map = new HashMap<String, Object>();
map.put("sourcePath", sourcePath);
map.put("content", content);
return renderSuccess(map);
}
JAVA将MP3转为WAV(实现百度语音转译)相关推荐
- 使用Java播放MP3或Wav音频
JavaSound是一个小巧的低层应用程序接口(API),它支持数字音频和乐器数字接口(MIDI)数据的记录和回放.在JDK 1.3.0之前,JavaSound是一个标准的Java扩展API,但从Ja ...
- python调用百度语音实时转为文字_百度语音转文字 (Python)
感受好久没写中文技术文章了.说实话,学东西都是基于英文,或者 别人从英文翻译成中文 咱们再捡二手货学习.因此用中文写技术文章怎么都感受是在骗人,怎么都以为很别扭.编程 可是这一次的主角是百度.框架 虽 ...
- 基于springboot+h5+websocket的即时通讯客服系统和百度实时语音转译(语音在线识别)
本文章由本人原创 下载链接:https://download.csdn.net/download/u014191624/51948075 这是一个基于springboot+h5+websocket的即 ...
- C#文字转语音,实时播放以及mp3,wav文件保存
源码下载地址:https://download.csdn.net/download/horseroll/10500847 无积分付费下载地址:https://download.csdn.net/dow ...
- Java 语音识别(百度语音API)
系列文章: Java 语音记录(录音,存储为WAV文件):https://blog.csdn.net/haoranhaoshi/article/details/87888382 Java 语音识别(百 ...
- 百度语音-JAVA对PCM文件格式处理
百度语音-JAVA对PCM文件格式处理 1 问题描述 调用百度语音接口使用测试PCM文件正常返回. 使用微信小程序上传录音文件.本地录音调用百度语音接口.正常响应,但是响应结果不是"嗯嗯&q ...
- 【百度语音爬坑】-JAVA对PCM文件格式处理(已解决)
[百度语音爬坑]-JAVA对PCM文件格式处理 1 问题描述 调用百度语音接口使用测试PCM文件正常返回. 使用微信小程序上传录音文件.本地录音调用百度语音接口.正常响应,但是响应结果不是" ...
- java 下mp3 转 pcm、wav
mp3 转 pcm.wav 由于MP3直接转为wav,容易出现文件大小为0k,时间缩短等问题,这里是通过先将mp3转成pcm,然后在通过pcm转成wav.下面直接上代码. 先引入所需要的jar包 &l ...
- java 音频转为wav格式标准音频 | Java工具类
目录 简述 环境依赖 maven依赖 ffmpeg依赖 工具类代码 总结 简述 该工具类主要是为了将各类音频转为wav标准格式,其中可以调节采样率.声道数等指标.主要是使用ffmpeg命令进行转换. ...
最新文章
- SLAM学习--------相机位姿表示-李群李代数
- Android Studio 3.5 Canary 12 发布
- 论文翻译_做论文翻译需要知道哪些翻译技巧?知行翻译:这3个技巧
- linux字符设备文件的打开操作,Linux字符设备驱动模型之字符设备初始化
- matplotlib如何绘制两点间连线_如何用 Python 快速揭示数据之间的各种关系
- kuangbin专题十六 KMP扩展KMP HDU3068 最长回文
- 成功,要“借力”,不要“尽力”(深刻!)
- Android插件化开发之动态加载基础之ClassLoader工作机制
- python怎么设计奥运五环_python 相关语法 图形绘制 奥运五环
- VRAR产业峰会暨第二届华为VR开发应用大赛颁奖典礼在和平区成功举办
- PWM DAC vs. Standalone
- VoLTE业务端到端流程:EPC侧信令流程
- OpenGL 之 EGL 使用实践
- 十年•杭研大咖说 | 邱似峰:从应届生到网易视频云CTO的蜕变
- java套娃_Java也有俄罗斯套娃,内部类剖析
- 90后浙理工硕士论文登Nature,毕业却考取公务员!网友:宇宙尽头是考公
- bzoj2534 Uva10829L-gap字符串(SA+lcp同bzoj2119)
- Promise 对象 异步 then 回调函数
- 黑马程序员——C语言基础---基础语法
- 惠普HP LaserJet Pro M329dn 打印机驱动
热门文章
- LaTeX常用格式学习笔记
- [洛谷P1498] 南蛮图腾(分治+递归)
- 我和TrueChain初链的“初恋”
- C. Swap Game
- win10更新后应用无法连接服务器,win10系统绝地求生无法连接到更新服务器的解决方法...
- 不可抗力/(ㄒoㄒ)/~~ 开始学习node全栈<四>express Web框架
- C语言软件版本号宏定义的高级技巧
- table标签中使th标签和td文字置顶
- 【入门级C语言程序 -- 猜数字】Guess Number Game
- RabbitMQ实现死信队列