一、前言


国内做语音识别的公司有很多,大家所熟知的几家公司主要有科大讯飞、阿里云、百度、腾讯等,由于各家的API或者SDK对接方式都差不多,本文采用百度的API进行演示。

二、对接流程


第一步:成为开发者


三步完成账号的基本注册与认证:

STEP1:点击进入控制台,选择需要使用的AI服务项。若为未登录状态,将跳转至登录界面,请您使用百度账号登录。如还未持有百度账户,可以点击此处注册百度账号。

STEP2:首次使用,登录后将会进入开发者认证页面,请填写相关信息完成开发者认证。注:(如您之前已经是百度云用户或百度开发者中心用户,此步可略过。)

STEP3:通过控制台左侧导航,选择语音能力引擎,进入语音技术的控制面板,进行相关操作。

第二步:领取免费额度


因为本文是个人版本的demo,所以使用的是免费额度(180天),正式企业应用也有一定的免费额度,当然后期使用肯定是需要付费的。

点击去领取:

选中语音识别:

  1. 点击全选或者根据自己需要选择即可

  1. 点击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 种:

  1. JSON 格式 POST 上传本地音频文件。

  1. 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相关推荐

  1. Java版 人脸识别SDK demo

    2019独角兽企业重金招聘Python工程师标准>>> 虹软人脸识别SDK之Java版,支持SDK 1.1+,以及2.0版本,滴滴,抓紧上车! 前言 由于业务需求,最近跟人脸识别杠上 ...

  2. java版阿里云,百度ai,讯飞语音识别效果简单对比及demo

    因为公司的业务的需要,对三家的语音识别(简短语句识别java版)进行了调用和对比,把自己的测试成果贴出来供需要的人参考使用.并贴出主要代码块 阿里云的一句话识别: package com.alibab ...

  3. Java版数据结构之数组模拟环形队列demo

    Java版数据结构之数组模拟环形队列demo 我的代码仓库:https://github.com/zhuangbinan/datastructure 类 CircleArray package clu ...

  4. Java核心技术卷一基础知识第10版demo实例

    Java核心技术卷一基础知识第10版demo实例 第三章 JAVA的基本程序设计结构 3.7输入与输出 3.7.1读取输入 3.8控制流程 3.8.3循环 3.10数组 3.10.6多维数组 第四章 ...

  5. nodejs调用建行互联网银企被扫支付接口Java版加解密Demo

    环境:nodejs+eclipse+child_process模块+建行互联网银企被扫支付接口文档V2.2.6 总体步骤如下: 1.将建行Java版加密Demo打包成jar包:CCBParam.jar ...

  6. Wind(万得)原生TDBAPI(JAVA版)封装成 WEB API (Demo版)

    ##1. 引言## 目前项目使用了开源的vnpy框架来做量化交易(python版), 但是公司采购的wind历史数据TDBAPI没有python版(只有C++版,JAVA版,C#版,matlab版). ...

  7. 用 Redis 实现分布式锁(Java 版)

    用 Redis 实现分布式锁(Java 版) 核心代码 完整代码   分布式锁是一种解决分布式临界资源并发读写的一种技术.本文详细介绍了在 Java 中使用 Redis 实现分布式锁的方法.为了方便, ...

  8. 解决Java版CKFinder无法显示缩略图问题

    这些天在写我的Java EE项目的时候用到了CKEditor和CKFinder,但是在用CKFinder的时候无法显示图片的缩略图,但是官网上的demo上却有缩略图,我一直以为是自己配置错误了,我把官 ...

  9. 第三篇 :微信公众平台开发实战Java版之请求消息,响应消息以及事件消息类的封装...

    微信服务器和第三方服务器之间究竟是通过什么方式进行对话的? 下面,我们先看下图: 其实我们可以简单的理解: (1)首先,用户向微信服务器发送消息: (2)微信服务器接收到用户的消息处理之后,通过开发者 ...

最新文章

  1. 软件设计中的具体问题
  2. c语言中lookup函数功能,Lookup函数详解
  3. 汽车行业中的AUTOSAR与OSEK到底是什么,有什么区别
  4. delphi 同盘移动文件所用时间测试(文件大小约6,083,545,088 字节)
  5. 除了速度与激情 领克01带给我另一种有关生活方式的想象
  6. Web专家周末聚会都会说点啥
  7. Jupyter Notebook界面也可以如此炫酷?有人把Notebook玩出了新花样
  8. 转载——python字符串常用操作(加案例)
  9. 【优化求解】基于matalb改进的遗传算法GA求解城市交通信号优化问题【含Matlab源码 214期】
  10. 电脑如何让两个文件夹同步更新备份?
  11. centos6.5安装自动化工具ansible和图形化工具tower
  12. 『实用教程』四种超实用的超级记忆法以及记忆训练案例
  13. 微信收款没有提示通知消息,怎么打开?解决方案
  14. hnrxgs伸缩器在管道中的作用以及工作原理
  15. Arcgis进行人口密度计算
  16. [ASP.NET] 结合Web API在OWIN下实现OAuth
  17. mysql常考50_要想学好SQL语句必会的50题,也是考试常考的点
  18. 开源项目——寝室助手
  19. html中如何插入pdf文件,如何创建PDF文件
  20. 虚拟机运行安卓ISO

热门文章

  1. 带x的分数解方程计算机,五年级分数解方程
  2. 用 python selenium 爬简书,Python自动化领域之 Selenium WebDriver 学习第2篇
  3. GDI显示图像时设定窗口大小为图像大小
  4. leetcode 14天刷题计划-算法入门(共计31题)
  5. 计算机进入桌面黑屏怎么办,老司机教你电脑进入系统后黑屏怎么办
  6. pycharm使用记录
  7. 论文阅读:Faster AutoAugment: Learning Augmentation Strategies using Backpropagation
  8. Java编程思想读书笔记——第十章:内部类
  9. ACW95 费解的开关
  10. 光伏逆变器企业的生存逻辑