语音识别java版demo
一、前言
国内做语音识别的公司有很多,大家所熟知的几家公司主要有科大讯飞、阿里云、百度、腾讯等,由于各家的API或者SDK对接方式都差不多,本文采用百度的API进行演示。
二、对接流程
第一步:成为开发者
三步完成账号的基本注册与认证:
STEP1:点击进入控制台,选择需要使用的AI服务项。若为未登录状态,将跳转至登录界面,请您使用百度账号登录。如还未持有百度账户,可以点击此处注册百度账号。
STEP2:首次使用,登录后将会进入开发者认证页面,请填写相关信息完成开发者认证。注:(如您之前已经是百度云用户或百度开发者中心用户,此步可略过。)
STEP3:通过控制台左侧导航,选择语音能力引擎,进入语音技术的控制面板,进行相关操作。
第二步:领取免费额度
因为本文是个人版本的demo,所以使用的是免费额度(180天),正式企业应用也有一定的免费额度,当然后期使用肯定是需要付费的。
点击去领取:
选中语音识别:
点击全选或者根据自己需要选择即可
点击0元领取,然后刷新列表就可以看到自己已经领取成功了
第三步:创建应用
需要创建应用才可正式调用语音技术能力,基于应用创建成功后获取的API Key及Secret Key,进行接口调用操作,及相关配置。按照下图所示的操作流程,完成创建操作即可。
1.点击去创建
应用名称: 用于标识您所创建的应用的名称,支持中英文、数字、下划线及中横线,此名称一经创建完毕,不可修改。
接口选择: 每个应用可以勾选业务所需的所有AI服务的接口权限(仅可勾选具备免费试用权限的接口能力),语音技术下全部接口已默认勾选,创建应用完毕,此应用即具备了所勾选服务的调用权限。
语音包名:如果您需要使用语音技术SDK服务(iOS/Android),需要绑定包名信息,以便生成授权License。
应用归属:可选择个人使用或公司使用服务,若为公司使用,可与专属商务经理沟通,获取专业的售前支持。
应用描述: 对此应用的业务场景进行描述。
第四步:获取密钥
在创建完毕应用后,平台将会分配给我们此应用的相关凭证,主要为AppID、API Key、Secret Key。
第五步:生成签名
使用创建应用所分配到的AppID、API Key及Secret Key,进行Access Token(用户身份验证和授权的凭证)的生成。具体如下:
请求URL数据格式:
向授权服务地址https://aip.baidubce.com/oauth/2.0/token发送请求(推荐使用POST),并在URL中带上以下参数:
grant_type: 必须参数,固定为client_credentials;
client_id: 必须参数,应用的API Key;
client_secret: 必须参数,应用的Secret Key;
注:
API Key、Secret Key 均可在百度智能云控制台 各技术方向概览页的应用列表 处获取,若无应用请先进行创建;
API Key、Secret Key用于接口调用鉴权,请务必注意保密,不可在公开文档或代码中以明文展示,否则可能导致账号被盗用。
例如:
https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=Va5yQRHlA4Fq5eR3LT0vuXV4&client_secret=0rDSjzQ20XUj5itV6WRtznPQSzr5pVw2
java版本示例:
packagecom.baidu.ai.aip.auth;
importorg.json.JSONObject;
importjava.io.BufferedReader;
importjava.io.InputStreamReader;
importjava.net.HttpURLConnection;
importjava.net.URL;
importjava.util.List;
importjava.util.Map;
/**
* 获取token类
*/
publicclassAuthService {
/*** 获取权限token* @return 返回示例:* {* "access_token": "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567",* "expires_in": 2592000* }*/publicstaticStringgetAuth() {// 官网获取的 API Key 更新为你注册的StringclientId="百度云应用的AK";// 官网获取的 Secret Key 更新为你注册的StringclientSecret="百度云应用的SK";returngetAuth(clientId, clientSecret);}
/*** 获取API访问token* 该token有一定的有效期,需要自行管理,当失效时需重新获取.* @param ak - 百度云官网获取的 API Key* @param sk - 百度云官网获取的 Secret Key* @return assess_token 示例:* "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567"*/publicstaticStringgetAuth(Stringak, Stringsk) {// 获取token地址StringauthHost="https://aip.baidubce.com/oauth/2.0/token?";StringgetAccessTokenUrl=authHost// 1. grant_type为固定参数+"grant_type=client_credentials"// 2. 官网获取的 API Key+"&client_id="+ak// 3. 官网获取的 Secret Key+"&client_secret="+sk;try {URLrealUrl=newURL(getAccessTokenUrl);// 打开和URL之间的连接HttpURLConnectionconnection= (HttpURLConnection) realUrl.openConnection();connection.setRequestMethod("GET");connection.connect();// 获取所有响应头字段Map<String, List<String>>map=connection.getHeaderFields();// 遍历所有的响应头字段for (Stringkey : map.keySet()) {System.err.println(key+"--->"+map.get(key));}// 定义 BufferedReader输入流来读取URL的响应BufferedReaderin=newBufferedReader(newInputStreamReader(connection.getInputStream()));Stringresult="";Stringline;while ((line=in.readLine()) !=null) {result+=line;}/*** 返回结果示例*/System.err.println("result:"+result);JSONObjectjsonObject=newJSONObject(result);Stringaccess_token=jsonObject.getString("access_token");returnaccess_token;} catch (Exceptione) {System.err.printf("获取token失败!");e.printStackTrace(System.err);}returnnull;}
}
服务器返回的JSON文本参数如下:
access_token: 要获取的Access Token;
expires_in: Access Token的有效期(秒为单位,有效期30天);
其他参数忽略,暂时不用;
例如:
{"refresh_token": "25.b55fe1d287227ca97aab219bb249b8ab.315360000.1798284651.282335-8574074","expires_in": 2592000,"scope": "public wise_adapt","session_key": "9mzdDZXu3dENdFZQurfg0Vz8slgSgvvOAUebNFzyzcpQ5EnbxbF+hfG9DQkpUVQdh4p6HbQcAiz5RmuBAja1JJGgIdJI","access_token": "24.6c5e1ff107f0e8bcef8c46d3424a0e78.2592000.1485516651.282335-8574074","session_secret": "dfac94a3489fe9fca7c3221cbf7525ff"
}
若请求错误,服务器将返回的JSON文本包含以下参数:
error: 错误码;关于错误码的详细信息请参考下方鉴权认证错误码。
error_description: 错误描述信息,帮助理解和解决发生的错误。
例如:
{"error": "invalid_client","error_description": "unknown client id"
}
鉴权认证错误码:
error |
error_description |
解释 |
invalid_client |
unknown client id |
API Key不正确 |
invalid_client |
Client authentication failed |
Secret Key不正确 |
第六步:启动开发
百度提供了两种对接方式:API与SDK。我们这里选择了API的方式进行对接。
请求说明
语音数据上传 POST 方式有 2 种:
JSON 格式 POST 上传本地音频文件。
RAW 格式 POST 上传本地音频文件。
JSON 方式
音频文件,读取二进制内容后,进行 base64 编码后放在 speech 参数内。
音频文件的原始大小, 即二进制内容的字节数,填写 “len” 字段
由于使用 json 格式, header 为:Content-Type:application/json注意: 由于 base64 编码后,数据会增大 1/3。
RAW方式
音频文件,读取二进制内容后,直接放在 body 中。
Content-Length 的值即为音频文件的大小。(一般代码会自动生成)。
由于使用 raw 方式, 采样率和文件格式需要填写在 Content-Type 中 :Content-Type: audio/pcm;rate=16000
JSON方式上传音频
语音数据和其他参数通过标准 JSON 格式串行化 POST 上传, JSON 里包括的参数:
字段名 |
类型 |
可需 |
描述 |
format |
string |
必填 |
语音文件的格式,pcm/wav/amr/m4a。不区分大小写。推荐pcm文件 |
rate |
int |
必填 |
采样率,16000、8000,固定值 |
channel |
int |
必填 |
声道数,仅支持单声道,请填写固定值 1 |
cuid |
string |
必填 |
用户唯一标识,用来区分用户,计算UV值。建议填写能区分用户的机器 MAC 地址或 IMEI 码,长度为60字符以内。 |
token |
string |
必填 |
开放平台获取到的开发者[access_token] |
获取 Access Token "access_token") |
|||
dev_pid |
int |
选填 |
不填写lan参数生效,都不填写,默认1537(普通话 输入法模型),dev_pid参数点击这里 |
lm_id |
int |
选填 |
自训练平台模型id,填dev_pid = 1537生效 |
lan |
string |
选填,废弃参数 |
历史兼容参数,已不再使用 |
speech |
string |
必填 |
本地语音文件的二进制语音数据 ,需要进行base64 编码。与len参数连一起使用。 |
len |
int |
必填 |
本地语音文件的的字节数,单位字节 |
上传示例
JSON 格式 POST 上传本地文件
固定头部 header
Content-Type:application/json
请求示例
POSThttp://vop.baidu.com/server_api
speech 参数填写为 文件内容 base64 后的结果:
{ "format":"pcm", "rate":16000, "dev_pid":1537, "channel":1, "token":xxx, "cuid":"baidu_workshop", "len":4096, "speech":"xxx", // xxx为 base64(FILE_CONTENT)
}
返回示例
{
"corpus_no":"6433214037620997779",
"err_msg":"success.",
"err_no":0,"result":["北京科技馆。"],
"sn":"371191073711497849365"
}
注意事项
len 字段表示原始语音大小字节数,不是 base64 编码之后的长度。
RAW 方式上传音频
语音数据直接放在 HTTP BODY 中,控制参数以及相关统计信息通过 header 和 url 里参数传递。
Header 参数说明
字段名 |
数据类型 |
可需 |
描述 |
format |
string(格式见下面示例) |
必填 |
语音格式,pcm/wav/amr/(m4a仅支持极速版)。不区分大小写,推荐使用pcm文件 |
rate |
int(格式见下面示例) |
必填 |
采样率 16000、8000, 固定值 |
语音数据的采样率和压缩格式在 HTTP-HEADER 里的 Content-Type 表明,例:
Content-Type: audio/pcm;rate=16000
url 参数说明
字段名 |
可需 |
描述 |
cuid |
必填 |
用户唯一标识,用来区分用户,计算 UV 值。建议填写能区分用户的机器 MAC 地址或 IMEI 码,长度为 60 字符以内。 |
token |
必填 |
开放平台获取到的开发者 [access_token] |
获取 Access Token "access_token") |
||
dev_pid |
选填 |
不填写 lan 参数生效,都不填写,默认 1537(普通话 输入法模型),dev_pid参数点击这里 |
lm_id |
int |
选填 |
lan |
选填,废弃参数 |
历史兼容参数,已不再使用。 |
URL 示例
POSThttp://vop.baidu.com/server_api?dev_pid=1537&cuid=******&token=1.a6b7dbd428f731035f771b8d********.86400.1292922000-2346678-124328
// 或者使用自训练平台
POSThttp://vop.baidu.com/server_api?dev_pid=8002&lm_id=1234&cuid=******&token=1.a6b7dbd428f731035f771b8d********.86400.1292922000-2346678-124328
raw 方式测试示例
curl-i-XPOST-H"Content-Type: audio/pcm;rate=16000""http://vop.baidu.com/server_api?dev_pid=1537&cuid=xxxxx&token=1.a6b7dbd428f731035f771b8d********.86400.1292922000-2346678-124328"--data-binary"@/home/test/test.pcm"
三、demo示例
第一步:准备音频文件
第二步:生成token
packagecom.speech.demo.common;
importcom.alibaba.fastjson2.JSONObject;
importjava.io.IOException;
importjava.net.HttpURLConnection;
importjava.net.URL;
/**
* token的获取类
* 将apiKey和secretKey换取token,注意有效期保存在expiresAt
*/
publicclassTokenHolder {
publicstaticfinalStringASR_SCOPE="audio_voice_assistant_get";
publicstaticfinalStringTTS_SCOPE="audio_tts_post";
/*** url , Token的url,http可以改为https*/privatestaticfinalStringurl="http://aip.baidubce.com/oauth/2.0/token";
/*** asr的权限 scope 是 "audio_voice_assistant_get"* tts 的权限 scope 是 "audio_tts_post"*/privateStringscope;
/*** 网页上申请语音识别应用获取的apiKey*/privateStringapiKey;
/*** 网页上申请语音识别应用获取的secretKey*/privateStringsecretKey;
/*** 保存访问接口获取的token*/privateStringtoken;
/*** 当前的时间戳,毫秒*/privatelongexpiresAt;
/*** @param apiKey 网页上申请语音识别应用获取的apiKey* @param secretKey 网页上申请语音识别应用获取的secretKey*/publicTokenHolder(StringapiKey, StringsecretKey, Stringscope) {this.apiKey=apiKey;this.secretKey=secretKey;this.scope=scope;}
/*** 获取token,refresh 方法后调用有效** @return*/publicStringgetToken() {returntoken;}
/*** 获取过期时间,refresh 方法后调用有效** @return*/publiclonggetExpiresAt() {returnexpiresAt;}
/*** 获取token** @return* @throws IOException http请求错误* @throws DemoException http接口返回不是 200, access_token未获取*/publicvoidrefresh() throwsIOException, DemoException {StringgetTokenURL=url+"?grant_type=client_credentials"+"&client_id="+ConnUtil.urlEncode(apiKey) +"&client_secret="+ConnUtil.urlEncode(secretKey);
// 打印的url出来放到浏览器内可以复现System.out.println("token url:"+getTokenURL);
URLurl=newURL(getTokenURL);HttpURLConnectionconn= (HttpURLConnection) url.openConnection();conn.setConnectTimeout(5000);Stringresult=ConnUtil.getResponseString(conn);System.out.println("Token result json:"+result);parseJson(result);}
/*** @param result token接口获得的result* @throws DemoException*/privatevoidparseJson(Stringresult) throwsDemoException {JSONObjectjson=JSONObject.parseObject(result);if (json.getString("access_token") ==null) {// 返回没有access_token字段thrownewDemoException("access_token not obtained, "+result);}if (json.getString("scope") ==null) {// 返回没有scope字段thrownewDemoException("scopenot obtained, "+result);}// scope = null, 忽略scope检查
if (scope!=null&&!json.getString("scope").contains(scope)) {thrownewDemoException("scope not exist, "+scope+","+result);}token=json.getString("access_token");expiresAt=System.currentTimeMillis() +json.getLong("expires_in") *1000;}
}
第三步:调用API测试
语音识别测试:
packagecom.speech.demo.test;
importcom.alibaba.fastjson2.JSONObject;
importcom.speech.demo.common.ConnUtil;
importcom.speech.demo.common.DemoException;
importcom.speech.demo.common.TokenHolder;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileWriter;
importjava.io.IOException;
importjava.net.HttpURLConnection;
importjava.net.URL;
importjava.util.Base64;
publicclassAsrMain {/*** 默认以json方式上传音频文件*/
privatefinalbooleanMETHOD_RAW=false;/*** 填写网页上申请的appkey 如 $apiKey="kVcnfD9iW2XVZSMaLMrtLYIz"*/privatefinalStringAPP_KEY="你的appKey";
/*** 填写网页上申请的APP SECRET 如 $SECRET_KEY="O9o1O213UgG5LFn0bDGNtoRN3VWl2du6"*/privatefinalStringSECRET_KEY="你的secretKey";
// 需要识别的文件privatefinalStringFILENAME="16k.pcm";
/*** 文件格式, 支持pcm/wav/amr 格式,极速版额外支持m4a 格式*/privatefinalStringFORMAT=FILENAME.substring(FILENAME.length() -3);
privateStringCUID="1234567JAVA";
// 采样率固定值privatefinalintRATE=16000;
privateStringURL;
privateintDEV_PID;
//private int LM_ID;//测试自训练平台需要打开此注释
privateStringSCOPE;
// 普通版 参数{// 可以改为httpsURL="http://vop.baidu.com/server_api";// 1537 表示识别普通话,使用输入法模型。 其它语种参见文档DEV_PID=1537;SCOPE="audio_voice_assistant_get";}
// 自训练平台 参数/*{//自训练平台模型上线后,您会看见 第二步:“”获取专属模型参数pid:8001,modelid:1234”,按照这个信息获取 dev_pid=8001,lm_id=1234DEV_PID = 8001;LM_ID = 1234;}*/
/* 极速版 参数{URL = "http://vop.baidu.com/pro_api"; // 可以改为httpsDEV_PID = 80001;SCOPE = "brain_enhanced_asr";}*/
/* 忽略scope检查,非常旧的应用可能没有{SCOPE = null;}*/
publicstaticvoidmain(String[] args) throwsIOException, DemoException {AsrMaindemo=newAsrMain();// 填写下面信息Stringresult=demo.run();System.out.println("识别结束:结果是:");System.out.println(result);
// 如果显示乱码,请打开result.txt查看Filefile=newFile("result.txt");FileWriterfo=newFileWriter(file);fo.write(result);fo.close();System.out.println("Result also wrote into "+file.getAbsolutePath());}
publicStringrun() throwsIOException, DemoException {TokenHolderholder=newTokenHolder(APP_KEY, SECRET_KEY, SCOPE);holder.refresh();Stringtoken=holder.getToken();Stringresult=null;if (METHOD_RAW) {result=runRawPostMethod(token);} else {result=runJsonPostMethod(token);}returnresult;}
privateStringrunRawPostMethod(Stringtoken) throwsIOException, DemoException {Stringurl2=URL+"?cuid="+ConnUtil.urlEncode(CUID) +"&dev_pid="+DEV_PID+"&token="+token;//测试自训练平台需要打开以下信息//String url2 = URL + "?cuid=" + ConnUtil.urlEncode(CUID) + "&dev_pid=" + DEV_PID + "&lm_id="+ LM_ID + "&token=" + token;StringcontentTypeStr="audio/"+FORMAT+"; rate="+RATE;//System.out.println(url2);byte[] content=getFileContent(FILENAME);HttpURLConnectionconn= (HttpURLConnection) newURL(url2).openConnection();conn.setConnectTimeout(5000);conn.setRequestProperty("Content-Type", contentTypeStr);conn.setRequestMethod("POST");conn.setDoOutput(true);conn.getOutputStream().write(content);conn.getOutputStream().close();System.out.println("url is "+url2);System.out.println("header is "+"Content-Type :"+contentTypeStr);Stringresult=ConnUtil.getResponseString(conn);returnresult;}
publicStringrunJsonPostMethod(Stringtoken) throwsDemoException, IOException {
byte[] content=getFileContent(FILENAME);Stringspeech=base64Encode(content);
JSONObjectparams=newJSONObject();params.put("dev_pid", DEV_PID);//params.put("lm_id",LM_ID);//测试自训练平台需要打开注释params.put("format", FORMAT);params.put("rate", RATE);params.put("token", token);params.put("cuid", CUID);params.put("channel", "1");params.put("len", content.length);params.put("speech", speech);
// System.out.println(params.toString());HttpURLConnectionconn= (HttpURLConnection) newURL(URL).openConnection();conn.setConnectTimeout(5000);conn.setRequestMethod("POST");conn.setRequestProperty("Content-Type", "application/json; charset=utf-8");conn.setDoOutput(true);conn.getOutputStream().write(params.toString().getBytes());conn.getOutputStream().close();Stringresult=ConnUtil.getResponseString(conn);
params.put("speech", "base64Encode(getFileContent(FILENAME))");System.out.println("url is : "+URL);System.out.println("params is :"+params.toString());
returnresult;}
privatebyte[] getFileContent(Stringfilename) throwsDemoException, IOException {Filefile=newFile(filename);if (!file.canRead()) {System.err.println("文件不存在或者不可读: "+file.getAbsolutePath());thrownewDemoException("file cannot read: "+file.getAbsolutePath());}FileInputStreamis=null;try {is=newFileInputStream(file);returnConnUtil.getInputStreamContent(is);} finally {if (is!=null) {try {is.close();} catch (IOExceptione) {e.printStackTrace();}}}
}
privateStringbase64Encode(byte[] content) {
Base64.Encoderencoder=Base64.getEncoder(); // JDK 1.8 推荐方法Stringstr=encoder.encodeToString(content);
/*char[] chars = Base64Util.encode(content); // 1.7 及以下,不推荐,请自行跟换相关库String str = new String(chars);*/
returnstr;}
}
说明:
appKey和secretKey填写你自己创建应用的即可,demo中使用的是我的
语音合成测试:
packagecom.speech.demo.test;
importcom.speech.demo.common.ConnUtil;
importcom.speech.demo.common.DemoException;
importcom.speech.demo.common.TokenHolder;
importjava.io.File;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.PrintWriter;
importjava.net.HttpURLConnection;
importjava.net.URL;
publicclassTtsMain {
publicstaticvoidmain(String[] args) throwsIOException, DemoException {(newTtsMain()).run();}
/*** 填写网页上申请的appkey 如 $apiKey="kVcnfD9iW2XVZSMaLMrtLYIz"*/privatefinalStringappKey="你的appKey";
/*** 填写网页上申请的APP SECRET 如 $SECRET_KEY="O9o1O213UgG5LFn0bDGNtoRN3VWl2du6"*/privatefinalStringsecretKey="你的secretKey";
// text 的内容为"欢迎使用百度语音合成"的urlencode,utf-8 编码// 可以百度搜索"urlencode"privatefinalStringtext="欢迎使用百度语音";
// 发音人选择, 基础音库:0为度小美,1为度小宇,3为度逍遥,4为度丫丫,// 精品音库:5为度小娇,103为度米朵,106为度博文,110为度小童,111为度小萌,默认为度小美privatefinalintper=0;// 语速,取值0-15,默认为5中语速privatefinalintspd=5;// 音调,取值0-15,默认为5中语调privatefinalintpit=5;// 音量,取值0-9,默认为5中音量privatefinalintvol=5;
// 下载的文件格式, 3:mp3(default) 4: pcm-16k 5: pcm-8k 6. wavprivatefinalintaue=6;
// 可以使用httpspublicfinalStringurl="http://tsn.baidu.com/text2audio";
privateStringcuid="1234567JAVA";
privatevoidrun() throwsIOException, DemoException {TokenHolderholder=newTokenHolder(appKey, secretKey, TokenHolder.ASR_SCOPE);holder.refresh();Stringtoken=holder.getToken();
// 此处2次urlencode, 确保特殊字符被正确编码Stringparams="tex="+ConnUtil.urlEncode(ConnUtil.urlEncode(text));params+="&per="+per;params+="&spd="+spd;params+="&pit="+pit;params+="&vol="+vol;params+="&cuid="+cuid;params+="&tok="+token;params+="&aue="+aue;params+="&lan=zh&ctp=1";System.out.println(url+"?"+params); // 反馈请带上此url,浏览器上可以测试HttpURLConnectionconn= (HttpURLConnection) newURL(url).openConnection();conn.setDoInput(true);conn.setDoOutput(true);conn.setConnectTimeout(5000);PrintWriterprintWriter=newPrintWriter(conn.getOutputStream());printWriter.write(params);printWriter.close();StringcontentType=conn.getContentType();if (contentType.contains("audio/")) {byte[] bytes=ConnUtil.getResponseBytes(conn);Stringformat=getFormat(aue);Filefile=newFile("result."+format); // 打开mp3文件即可播放// System.out.println( file.getAbsolutePath());FileOutputStreamos=newFileOutputStream(file);os.write(bytes);os.close();System.out.println("audio file write to "+file.getAbsolutePath());} else {System.err.println("ERROR: content-type= "+contentType);Stringres=ConnUtil.getResponseString(conn);System.err.println(res);}}
// 下载的文件格式, 3:mp3(default) 4: pcm-16k 5: pcm-8k 6. wavprivateStringgetFormat(intaue) {String[] formats= {"mp3", "pcm", "pcm", "wav"};returnformats[aue-3];}
}
第四步:结果展示
语音识别结果展示:
语音合成结果展示:
demo示例git地址:
https://gitlab.supcon5t.com/zhaojun/Sup-Speech-Demo.git
四、在线调试
如果不想在本地调试,也可以在线调试,百度提供了在线调试的方式:在线调试地址
五、总结
总体来说整个对接还是比较简单的,主要是用appKey和secretKey生成token,然后按照API要求进行调用即可
其他厂商的API调用基本也差不多这样,当然他们也提供SDK的集成方式,至于选择哪种方式都可以
百度语音识别技术
阿里云语音识别技术
科大讯飞语音识别技术
腾讯语音识别技术
语音识别java版demo相关推荐
- Java版 人脸识别SDK demo
2019独角兽企业重金招聘Python工程师标准>>> 虹软人脸识别SDK之Java版,支持SDK 1.1+,以及2.0版本,滴滴,抓紧上车! 前言 由于业务需求,最近跟人脸识别杠上 ...
- java版阿里云,百度ai,讯飞语音识别效果简单对比及demo
因为公司的业务的需要,对三家的语音识别(简短语句识别java版)进行了调用和对比,把自己的测试成果贴出来供需要的人参考使用.并贴出主要代码块 阿里云的一句话识别: package com.alibab ...
- Java版数据结构之数组模拟环形队列demo
Java版数据结构之数组模拟环形队列demo 我的代码仓库:https://github.com/zhuangbinan/datastructure 类 CircleArray package clu ...
- Java核心技术卷一基础知识第10版demo实例
Java核心技术卷一基础知识第10版demo实例 第三章 JAVA的基本程序设计结构 3.7输入与输出 3.7.1读取输入 3.8控制流程 3.8.3循环 3.10数组 3.10.6多维数组 第四章 ...
- nodejs调用建行互联网银企被扫支付接口Java版加解密Demo
环境:nodejs+eclipse+child_process模块+建行互联网银企被扫支付接口文档V2.2.6 总体步骤如下: 1.将建行Java版加密Demo打包成jar包:CCBParam.jar ...
- Wind(万得)原生TDBAPI(JAVA版)封装成 WEB API (Demo版)
##1. 引言## 目前项目使用了开源的vnpy框架来做量化交易(python版), 但是公司采购的wind历史数据TDBAPI没有python版(只有C++版,JAVA版,C#版,matlab版). ...
- 用 Redis 实现分布式锁(Java 版)
用 Redis 实现分布式锁(Java 版) 核心代码 完整代码 分布式锁是一种解决分布式临界资源并发读写的一种技术.本文详细介绍了在 Java 中使用 Redis 实现分布式锁的方法.为了方便, ...
- 解决Java版CKFinder无法显示缩略图问题
这些天在写我的Java EE项目的时候用到了CKEditor和CKFinder,但是在用CKFinder的时候无法显示图片的缩略图,但是官网上的demo上却有缩略图,我一直以为是自己配置错误了,我把官 ...
- 第三篇 :微信公众平台开发实战Java版之请求消息,响应消息以及事件消息类的封装...
微信服务器和第三方服务器之间究竟是通过什么方式进行对话的? 下面,我们先看下图: 其实我们可以简单的理解: (1)首先,用户向微信服务器发送消息: (2)微信服务器接收到用户的消息处理之后,通过开发者 ...
最新文章
- 软件设计中的具体问题
- c语言中lookup函数功能,Lookup函数详解
- 汽车行业中的AUTOSAR与OSEK到底是什么,有什么区别
- delphi 同盘移动文件所用时间测试(文件大小约6,083,545,088 字节)
- 除了速度与激情 领克01带给我另一种有关生活方式的想象
- Web专家周末聚会都会说点啥
- Jupyter Notebook界面也可以如此炫酷?有人把Notebook玩出了新花样
- 转载——python字符串常用操作(加案例)
- 【优化求解】基于matalb改进的遗传算法GA求解城市交通信号优化问题【含Matlab源码 214期】
- 电脑如何让两个文件夹同步更新备份?
- centos6.5安装自动化工具ansible和图形化工具tower
- 『实用教程』四种超实用的超级记忆法以及记忆训练案例
- 微信收款没有提示通知消息,怎么打开?解决方案
- hnrxgs伸缩器在管道中的作用以及工作原理
- Arcgis进行人口密度计算
- [ASP.NET] 结合Web API在OWIN下实现OAuth
- mysql常考50_要想学好SQL语句必会的50题,也是考试常考的点
- 开源项目——寝室助手
- html中如何插入pdf文件,如何创建PDF文件
- 虚拟机运行安卓ISO
热门文章
- 带x的分数解方程计算机,五年级分数解方程
- 用 python selenium 爬简书,Python自动化领域之 Selenium WebDriver 学习第2篇
- GDI显示图像时设定窗口大小为图像大小
- leetcode 14天刷题计划-算法入门(共计31题)
- 计算机进入桌面黑屏怎么办,老司机教你电脑进入系统后黑屏怎么办
- pycharm使用记录
- 论文阅读:Faster AutoAugment: Learning Augmentation Strategies using Backpropagation
- Java编程思想读书笔记——第十章:内部类
- ACW95 费解的开关
- 光伏逆变器企业的生存逻辑