近期实现的功能,不多说直接上代码(记得一些必要参数要配成自己的哈):

注意: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(实现百度语音转译)相关推荐

  1. 使用Java播放MP3或Wav音频

    JavaSound是一个小巧的低层应用程序接口(API),它支持数字音频和乐器数字接口(MIDI)数据的记录和回放.在JDK 1.3.0之前,JavaSound是一个标准的Java扩展API,但从Ja ...

  2. python调用百度语音实时转为文字_百度语音转文字 (Python)

    感受好久没写中文技术文章了.说实话,学东西都是基于英文,或者 别人从英文翻译成中文 咱们再捡二手货学习.因此用中文写技术文章怎么都感受是在骗人,怎么都以为很别扭.编程 可是这一次的主角是百度.框架 虽 ...

  3. 基于springboot+h5+websocket的即时通讯客服系统和百度实时语音转译(语音在线识别)

    本文章由本人原创 下载链接:https://download.csdn.net/download/u014191624/51948075 这是一个基于springboot+h5+websocket的即 ...

  4. C#文字转语音,实时播放以及mp3,wav文件保存

    源码下载地址:https://download.csdn.net/download/horseroll/10500847 无积分付费下载地址:https://download.csdn.net/dow ...

  5. Java 语音识别(百度语音API)

    系列文章: Java 语音记录(录音,存储为WAV文件):https://blog.csdn.net/haoranhaoshi/article/details/87888382 Java 语音识别(百 ...

  6. 百度语音-JAVA对PCM文件格式处理

    百度语音-JAVA对PCM文件格式处理 1 问题描述 调用百度语音接口使用测试PCM文件正常返回. 使用微信小程序上传录音文件.本地录音调用百度语音接口.正常响应,但是响应结果不是"嗯嗯&q ...

  7. 【百度语音爬坑】-JAVA对PCM文件格式处理(已解决)

    [百度语音爬坑]-JAVA对PCM文件格式处理 1 问题描述 调用百度语音接口使用测试PCM文件正常返回. 使用微信小程序上传录音文件.本地录音调用百度语音接口.正常响应,但是响应结果不是" ...

  8. java 下mp3 转 pcm、wav

    mp3 转 pcm.wav 由于MP3直接转为wav,容易出现文件大小为0k,时间缩短等问题,这里是通过先将mp3转成pcm,然后在通过pcm转成wav.下面直接上代码. 先引入所需要的jar包 &l ...

  9. java 音频转为wav格式标准音频 | Java工具类

    目录 简述 环境依赖 maven依赖 ffmpeg依赖 工具类代码 总结 简述 该工具类主要是为了将各类音频转为wav标准格式,其中可以调节采样率.声道数等指标.主要是使用ffmpeg命令进行转换. ...

最新文章

  1. SLAM学习--------相机位姿表示-李群李代数
  2. Android Studio 3.5 Canary 12 发布
  3. 论文翻译_做论文翻译需要知道哪些翻译技巧?知行翻译:这3个技巧
  4. linux字符设备文件的打开操作,Linux字符设备驱动模型之字符设备初始化
  5. matplotlib如何绘制两点间连线_如何用 Python 快速揭示数据之间的各种关系
  6. kuangbin专题十六 KMP扩展KMP HDU3068 最长回文
  7. 成功,要“借力”,不要“尽力”(深刻!)
  8. Android插件化开发之动态加载基础之ClassLoader工作机制
  9. python怎么设计奥运五环_python 相关语法 图形绘制 奥运五环
  10. VRAR产业峰会暨第二届华为VR开发应用大赛颁奖典礼在和平区成功举办
  11. PWM DAC vs. Standalone
  12. VoLTE业务端到端流程:EPC侧信令流程
  13. OpenGL 之 EGL 使用实践
  14. 十年•杭研大咖说 | 邱似峰:从应届生到网易视频云CTO的蜕变
  15. java套娃_Java也有俄罗斯套娃,内部类剖析
  16. 90后浙理工硕士论文登Nature,毕业却考取公务员!网友:宇宙尽头是考公
  17. bzoj2534 Uva10829L-gap字符串(SA+lcp同bzoj2119)
  18. Promise 对象 异步 then 回调函数
  19. 黑马程序员——C语言基础---基础语法
  20. 惠普HP LaserJet Pro M329dn 打印机驱动

热门文章

  1. LaTeX常用格式学习笔记
  2. [洛谷P1498] 南蛮图腾(分治+递归)
  3. 我和TrueChain初链的“初恋”
  4. C. Swap Game
  5. win10更新后应用无法连接服务器,win10系统绝地求生无法连接到更新服务器的解决方法...
  6. 不可抗力/(ㄒoㄒ)/~~ 开始学习node全栈<四>express Web框架
  7. C语言软件版本号宏定义的高级技巧
  8. table标签中使th标签和td文字置顶
  9. 【入门级C语言程序 -- 猜数字】Guess Number Game
  10. RabbitMQ实现死信队列