本作者源代码链接:my.oschina.net/xshuai/blog/1585505
【百度语音识别】JavaAPI方式语音识别示例MP3转PCM
Java-API合成语音示例:http://ai.baidu.com/forum/topic/show/496727
REST-API文档地址:http://ai.baidu.com/docs#/TTS-API/top
注意:需要下载MP3插件jar。才可以进行MP3CONVERTPCM 链接: https://pan.baidu.com/s/1i5pJxpb 密码: 8w4x
遇到的坑:HTTPUtil工具类中。不需要拼接access_token参数。大家注意一下。ContentType也改一下。
----------------------------------开始代码示例----------------------------------
MP3转PCM的方法 需要下载注意的jar才可以正确转换哦
第一步就是语音合成的MP3文件转换PCM格式文件
packagecom.xs.audio.tns;importjava.io.File;importjava.io.FileOutputStream;importjava.io.OutputStream;importjavax.sound.sampled.AudioFormat;importjavax.sound.sampled.AudioInputStream;importjavax.sound.sampled.AudioSystem;/**
* MP3转PCM Java方式实现
* @author 小帅丶
* @date 2017年12月6日
*/publicclassMP3ConvertPCM{/**
* MP3转换PCM文件方法
* @param mp3filepath 原始文件路径
* @param pcmfilepath 转换文件的保存路径
* @throws Exception
*/publicstaticvoidmp3Convertpcm(String mp3filepath,String pcmfilepath)throwsException{Filemp3=newFile(mp3filepath);Filepcm=newFile(pcmfilepath);//原MP3文件转AudioInputStreamAudioInputStream mp3audioStream=AudioSystem.getAudioInputStream(mp3);//将AudioInputStream MP3文件 转换为PCM AudioInputStreamAudioInputStream pcmaudioStream=AudioSystem.getAudioInputStream(AudioFormat.Encoding.PCM_SIGNED,mp3audioStream);//准备转换的流输出到OutputStreamOutputStream os=newFileOutputStream(pcm);intbytesRead=0;byte[]buffer=newbyte[8192];while((bytesRead=pcmaudioStream.read(buffer,0,8192))!=-1){os.write(buffer,0,bytesRead);}os.close();pcmaudioStream.close();}}
HttpUtil工具类新增加一个postASR的方法
/**
* 获取语音识别内容
* @param requestUrl
* @param params
* @return
* @throws Exception
*/publicstaticStringpostASR(String requestUrl,Stringparams)throwsException{System.out.println(params);String generalUrl=requestUrl;//这里不需要对接口地址拼接access_token参数 切记!!!System.out.println("发送的连接为:"+generalUrl);URL url=newURL(generalUrl);// 打开和URL之间的连接HttpURLConnection connection=(HttpURLConnection)url.openConnection();System.out.println("打开链接,开始发送请求"+newDate().getTime()/1000);connection.setRequestMethod("POST");// 设置通用的请求属性connection.setRequestProperty("Content-Type","application/json");connection.setRequestProperty("Connection","Keep-Alive");connection.setUseCaches(false);connection.setDoOutput(true);connection.setDoInput(true);// 得到请求的输出流对象DataOutputStreamout=newDataOutputStream(connection.getOutputStream());out.writeBytes(params);out.flush();out.close();// 建立实际的连接connection.connect();// 获取所有响应头字段Map>headers=connection.getHeaderFields();// 遍历所有的响应头字段for(String key:headers.keySet()){System.out.println(key+"--->"+headers.get(key));}// 定义 BufferedReader输入流来读取URL的响应BufferedReaderin=null;if(requestUrl.contains("nlp"))in=newBufferedReader(newInputStreamReader(connection.getInputStream(),"GBK"));elsein=newBufferedReader(newInputStreamReader(connection.getInputStream(),"UTF-8"));String result="";String getLine;while((getLine=in.readLine())!=null){result+=getLine;}in.close();System.out.println("请求结束"+newDate().getTime()/1000);System.out.println("result:"+result);returnresult;}
下面就是语音识别的示例代码哦
packagecom.xs.audio.tns;importjava.io.File;importjava.util.HashMap;importcom.xs.util.baidu.Base64Util;importcom.xs.util.baidu.FileUtil;importcom.xs.util.baidu.HttpUtil;importcom.xs.util.baidu.RandomStringGenerator;/** * 语音识别Java-API JSON上传方式示例代码 *@author小帅丶 * */publicclassAudio2Text{//接口地址privatestaticfinalString AUDIO2TEXT_URL="http://vop.baidu.com/server_api";publicstaticvoidmain(String[]args)throwsException{//合成的MP3语音文件String path="C:/Users/Administrator/text2audio/VOICE1512521962.mp3";//MP3转pcm要保存的路径和文件名String path2="C:/Users/Administrator/text2audio/VOICE1512521962.pcm";MP3ConvertPCM.mp3Convertpcm(path,path2);// 对语音二进制数据进行识别byte[]data=FileUtil.readFileByBytes(path2);//readFileByBytes仅为获取二进制数据示例String speech=Base64Util.encode(data);File file=newFile(path2);longlen=file.length();String result=Audio2text("pcm",16000,RandomStringGenerator.getRandomStringByLength(60),"自己获取的AccessToken",speech,len);System.out.println(result);}/** * JSON方式上传 *@paramformat必填语音文件的格式,pcm 或者 wav 或者 amr。不区分大小写。推荐pcm文件 *@paramrate必填采样率, 8000 或者 16000, 推荐 16000 采用率 *@paramchannel必填声道数,仅支持单声道,请填写固定值 1 *@paramcuid必填用户唯一标识,用来区分用户,计算UV值。建议填写能区分用户的机器 MAC 地址或 IMEI 码,长度为60字符以内。 *@paramtoken必填开放平台获取到的access_token, 见上面的“鉴权认证机制”段落 *@paramlan选填语种选择,默认中文(zh)。 中文=zh、粤语=ct、英文=en,不区分大小写 *@paramurl选填可下载的语音下载地址,与callback连一起使用,确保百度服务器可以访问。 *@paramcallback选填用户服务器的识别结果回调地址,确保百度服务器可以访问 *@paramspeech选填本地语音文件的的二进制语音数据 ,需要进行base64 编码。与len参数连一起使用。 *@paramlen选填本地语音文件的的字节数,单位字节*/publicstaticStringAudio2text(String format,Integer rate,String cuid,String token,String speech,longlen)throwsException{HashMapparamMap=newHashMap();paramMap.put("speech",speech);paramMap.put("format",format);paramMap.put("rate",rate);paramMap.put("channel",1);paramMap.put("cuid",cuid);paramMap.put("token",token);paramMap.put("len",len);net.sf.json.JSONObject params=net.sf.json.JSONObject.fromObject(paramMap);String data=HttpUtil.postASR(AUDIO2TEXT_URL,params.toString());System.out.println("语音文件识别的内容:"+data);returndata;}}
看看返回的内容
{"corpus_no":"6496262443167631439","err_msg":"success.","err_no":0,"result":["开发者小帅你好,"],"sn":"74778487111512528965"}
以上就是语音识别Java-API调用示例代码哦。难点是MP3转PCM会卡壳开发者们。
作者:小帅丶简书
链接:https://www.jianshu.com/p/1b5131398687