关于百度COR文字识别JAVA服务器端设置
2017-09-13 14:28
323 查看
首先要先下载百度云提供的JAVASDK
下载地址:http://ai.baidu.com/sdk
之后可以根据百度提供的文档进行开发,文档地址:http://ai.baidu.com/docs#/ASR-Online-Java-SDK/top
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
将下载的
在Eclipse右键“工程 -> Properties -> Java Build Path -> Add JARs”。
添加SDK工具包
其中,
1.初始化一个Client。
[/code]
在上面代码中,常量
向远程服务上传整段语音进行识别
原始语音的录音格式目前只支持评测 8k/16k 采样率 16bit 位深的单声道语音
压缩格式支持:pcm(不压缩)、wav、opus、speex、amr
系统支持语言种类:中文(zh)、粤语(ct)、英文(en)。
举例:
[/code]
接口函数说明:
[/code]
语音识别 返回数据参数详情
返回样例:
[/code]
------------
文字识别API
文字识别API,使用HTTPS POST发送:
先把代码粘过来吧:
这个是调用API的主体程序
这个是将图片base64编码的工具类
这块上面的代码有,这是获取access_token的代码
最后粘贴Controller,我用的是SSM框架,调用其实在程序主题中也已经有了,所以说这块可以忽略
如果用到上步的话缺少两个转换JSON用的实体类,我也给粘上来吧
用户向服务请求识别某张图中的所有文字。
请求示例
HTTP 方法:
请求URL:
URL参数:
Header如下:
Body中放置请求参数,参数详情如下:
请求参数
请求代码示例
请参考通用文字识别(含位置信息版)的代码内容,并更换请求地址。
返回参数
返回示例
[/code]
下载地址:http://ai.baidu.com/sdk
之后可以根据百度提供的文档进行开发,文档地址:http://ai.baidu.com/docs#/ASR-Online-Java-SDK/top
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
将下载的
aip-speech-java-sdk-version.zip解压后,复制到工程文件夹中。
在Eclipse右键“工程 -> Properties -> Java Build Path -> Add JARs”。
添加SDK工具包
speech_sdk-version.jar``aip-core-version.jar和第三方依赖工具包
json-20160810.jar。(好像他提供的sdk中没有version.jar)
其中,
version为版本号,添加完成后,用户就可以在工程中使用KG Java SDK。
新建Client
1.初始化一个Client。public class Sample { //设置APPID/AK/SK public static final String APP_ID = "你的 App ID"; public static final String API_KEY = "你的 Api ID"; public static final String SECRET_KEY = "你的 Secret Key"; public static void main(String[] args) { // 初始化一个FaceClient AipSpeech client = new AipSpeech(APP_ID, API_KEY, SECRET_KEY); // 可选:设置网络连接参数 client.setConnectionTimeoutInMillis(2000); client.setSocketTimeoutInMillis(60000); // 调用API JSONObject res = client.asr("test.pcm", "pcm", 16000, null); System.out.println(res.toString(2)); } }
[/code]
在上面代码中,常量
APP_ID在百度云控制台中创建,常量
API_KEY与
SECRET_KEY是在创建完毕应用后,系统分配给用户的,均为字符串,用于标识用户,为访问做签名验证,可在AI服务控制台中的应用列表中查看。
接口调用
语音识别
接口描述
向远程服务上传整段语音进行识别
请求说明
原始语音的录音格式目前只支持评测 8k/16k 采样率 16bit 位深的单声道语音压缩格式支持:pcm(不压缩)、wav、opus、speex、amr
系统支持语言种类:中文(zh)、粤语(ct)、英文(en)。
举例:
public void synthesis(AipSpeech client) { // 对本地语音文件进行识别 String path = "D:\\code\\java-sdk\\speech_sdk\\src\\test\\resources\\16k_test.pcm"; JSONObject asrRes = client.asr(path, "pcm", 16000, null); System.out.println(asrRes); // 对语音二进制数据进行识别 byte[] data = Util.readFileByBytes(path); //readFileByBytes仅为获取二进制数据示例 JSONObject asrRes2 = client.asr(data, "pcm", 16000, null); System.out.println(asrRes); // 对网络上音频进行识别 String url = "http://somehost/res/16k_test.pcm"; String callback = "http://callbackhost/aip/dump"; JSONObject res = client.asr(url, callback, "pcm", 16000, null); System.out.println(res); }
[/code]
接口函数说明:
// 语音识别 JSONObject asr(String path, String format, int rate, HashMap<String, Object> options); JSONObject asr(byte[] data, String format, int rate, HashMap<String, Object> options); JSONObject asr(String url, String callback, String format, int rate, HashMap<String, Object> options);
[/code]
参数 | 类型 | 描述 | 是否必须 |
---|---|---|---|
path/data | String/byte[] | 语音文件所在路径或二进制数据 | 是 |
url | String | 语音下载地址 | 是 |
callback | String | 识别结果回调地址 | 是 |
format | String | 包括pcm(不压缩)、wav、opus、speex、amr | 是 |
rate | int | 采样率,支持 8000 或者 16000 | 是 |
cuid | String | 用户唯一标识,用来区分用户,填写机器 MAC 地址或 IMEI 码,长度为60以内 | 否 |
lan | String | 语种选择,中文=zh、粤语=ct、英文=en,不区分大小写,默认中文 | 否 |
ptc | int | 协议号,下行识别结果选择,默认 nbest 结果 | 否 |
参数 | 类型 | 是否一定输出 | 描述 |
---|---|---|---|
err_no | int | 是 | 错误码 |
err_msg | int | 是 | 错误码描述 |
sn | int | 是 | 语音数据唯一标识,系统内部产生,用于 debug |
result | string | 是 | 识别结果数组,提供1-5 个候选结果,string 类型为识别的字符串, utf-8 编码 |
// 成功返回 { "err_no": 0, "err_msg": "success.", "corpus_no": "15984125203285346378", "sn": "481D633F-73BA-726F-49EF-8659ACCC2F3D", "result": ["北京天气"] } // 失败返回 { "err_no": 2000, "err_msg": "data empty.", "sn": null }
[/code]
错误码
错误码 | 含义 |
---|---|
3300 | 输入参数不正确 |
3301 | 识别错误 |
3302 | 验证失败 |
3303 | 语音服务器后端问题 |
3304 | 请求 QPS 过大,超过限额 |
3305 | 产品线当前日请求数超过 |
文字识别API
获取access_token示例代码
import org.json.JSONObject; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.List; import java.util.Map; /** * 获取token类 */ public class AuthService { /** * 获取权限token * @return 返回示例: * { * "access_token": "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567", * "expires_in": 2592000 * } */ public static String getAuth() { // 官网获取的 API Key 更新为你注册的 String clientId = "百度云应用的AK"; // 官网获取的 Secret Key 更新为你注册的 String clientSecret = "百度云应用的SK"; return getAuth(clientId, clientSecret); } /** * 获取API访问token * 该token有一定的有效期,需要自行管理,当失效时需重新获取. * @param ak - 百度云官网获取的 API Key * @param sk - 百度云官网获取的 Securet Key * @return assess_token 示例: * "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567" */ public static String getAuth(String ak, String sk) { // 获取token地址 String authHost = "https://aip.baidubce.com/oauth/2.0/token?"; String getAccessTokenUrl = authHost // 1. grant_type为固定参数 + "grant_type=client_credentials" // 2. 官网获取的 API Key + "&client_id=" + ak // 3. 官网获取的 Secret Key + "&client_secret=" + sk; try { URL realUrl = new URL(getAccessTokenUrl); // 打开和URL之间的连接 HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection(); connection.setRequestMethod("GET"); connection.connect(); // 获取所有响应头字段 Map<String, List<String>> map = connection.getHeaderFields(); // 遍历所有的响应头字段 for (String key : map.keySet()) { System.err.println(key + "--->" + map.get(key)); } // 定义 BufferedReader输入流来读取URL的响应 BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); String result = ""; String line; while ((line = in.readLine()) != null) { result += line; } /** * 返回结果示例 */ System.err.println("result:" + result); JSONObject jsonObject = new JSONObject(result); String access_token = jsonObject.getString("access_token"); return access_token; } catch (Exception e) { System.err.printf("获取token失败!"); e.printStackTrace(System.err); } return null; } }
文字识别API,使用HTTPS POST发送:
https://aip.baidubce.com/rest/2.0/ocr/v1/general?access_token=24.f9ba9c5241b67688bb4adbed8bc91dec.2592000.1485570332.282335-8574074 (access_token从上方的方法中获得)
通用文字识别
先把代码粘过来吧:这个是调用API的主体程序
package testOCR.test; import java.io.BufferedReader; import java.io.File; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import testOCR.token.AuthService; import testOCR.util.BASE64; public class OCRTest { public static String request(String httpUrl, String httpArg) { BufferedReader reader = null; String result = null; StringBuffer sbf = new StringBuffer(); try { URL url = new URL(httpUrl); HttpURLConnection connection = (HttpURLConnection) url .openConnection(); connection.setRequestMethod("POST"); connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); // 填入apikey到HTTP header connection.setRequestProperty("apikey", "o3k2WVmMY4opdeyIXk4WrxtP"); connection.setRequestProperty("access_token", AuthService.getAuth()); connection.setDoOutput(true); connection.getOutputStream().write(httpArg.getBytes("UTF-8")); connection.connect(); InputStream is = connection.getInputStream(); reader = new BufferedReader(new InputStreamReader(is, "UTF-8")); String strRead = null; while ((strRead = reader.readLine()) != null) { sbf.append(strRead); sbf.append("\r\n"); } reader.close(); result = sbf.toString(); } catch (Exception e) { e.printStackTrace(); } return result; } /** * @param args */ public static void main(String[] args) { File file = new File("d:\\aaa.png"); String imageBase = BASE64.encodeImgageToBase64(file); imageBase = imageBase.replaceAll("\r\n",""); imageBase = imageBase.replaceAll("\\+","%2B"); String httpUrl = "https://aip.baidubce.com/rest/2.0/ocr/v1/general_enhanced?access_token="+AuthService.getAuth(); String httpArg = "fromdevice=pc&clientip=10.10.10.0&detecttype=LocateRecognize&languagetype=CHN_ENG&imagetype=1&image="+imageBase; String jsonResult = request(httpUrl, httpArg); System.out.println("返回的结果--------->"+jsonResult); } }
这个是将图片base64编码的工具类
package testOCR.util; import java.io.*; import sun.misc.BASE64Encoder; public class BASE64 { /** * 将本地图片进行Base64位编码 * * @param imgUrl * 图片的url路径,如d:\\中文.jpg * @return */ public static String encodeImgageToBase64(File imageFile) {// 将图片文件转化为字节数组字符串,并对其进行Base64编码处理 // 其进行Base64编码处理 byte[] data = null; // 读取图片字节数组 try { InputStream in = new FileInputStream(imageFile); data = new byte[in.available()]; in.read(data); in.close(); } catch (IOException e) { e.printStackTrace(); } // 对字节数组Base64编码 BASE64Encoder encoder = new BASE64Encoder(); return encoder.encode(data);// 返回Base64编码过的字节数组字符串 } }
package testOCR.token; import org.json.JSONObject; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.List; import java.util.Map; /** * 获取token类 */ public class AuthService { /** * 获取权限token * @return 返回示例: * { * "access_token": "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567", * "expires_in": 2592000 * } */ public static String getAuth() { // 官网获取的 API Key 更新为你注册的 String clientId = ""; // 官网获取的 Secret Key 更新为你注册的 String clientSecret = ""; return getAuth(clientId, clientSecret); } /** * 获取API访问token * 该token有一定的有效期,需要自行管理,当失效时需重新获取. * @param ak - 百度云官网获取的 API Key * @param sk - 百度云官网获取的 Securet Key * @return assess_token 示例: * "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567" */ public static String getAuth(String ak, String sk) { // 获取token地址 String authHost = "https://aip.baidubce.com/oauth/2.0/token?"; String getAccessTokenUrl = authHost // 1. grant_type为固定参数 + "grant_type=client_credentials" // 2. 官网获取的 API Key + "&client_id=" + ak // 3. 官网获取的 Secret Key + "&client_secret=" + sk; try { URL realUrl = new URL(getAccessTokenUrl); // 打开和URL之间的连接 HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection(); connection.setRequestMethod("GET"); connection.connect(); // 获取所有响应头字段 Map<String, List<String>> map = connection.getHeaderFields(); // 遍历所有的响应头字段 for (String key : map.keySet()) { System.err.println(key + "--->" + map.get(key)); } // 定义 BufferedReader输入流来读取URL的响应 BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); String result = ""; String line; while ((line = in.readLine()) != null) { result += line; } /** * 返回结果示例 */ System.err.println("result:" + result); JSONObject jsonObject = new JSONObject(result); String access_token = jsonObject.getString("access_token"); return access_token; } catch (Exception e) { System.err.printf("获取token失败!"); e.printStackTrace(System.err); } return null; } public static void main(String[] args) { System.out.println(getAuth()); } }
最后粘贴Controller,我用的是SSM框架,调用其实在程序主题中也已经有了,所以说这块可以忽略
package testOCR.controller; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import net.sf.json.JSONObject; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; import testOCR.model.ResultModel; import testOCR.model.Word; import testOCR.test.OCRTest; import testOCR.token.AuthService; import testOCR.util.BASE64; @Controller public class OcrController { private static final int List = 0; /** * 血糖数据提交 * @param bloodGlucose * @return */ @RequestMapping(value="/file") public String fileUpload(@RequestParam MultipartFile image,HttpServletRequest req){ String path=req.getSession().getServletContext().getRealPath("/image"); System.out.println("真实路径"+path); try { image.transferTo(new File(path+"/"+image.getOriginalFilename())); } catch (IllegalStateException | IOException e) { e.printStackTrace(); } File file = new File(path+"/"+image.getOriginalFilename()); String imageBase = BASE64.encodeImgageToBase64(file); imageBase = imageBase.replaceAll("\r\n",""); imageBase = imageBase.replaceAll("\\+","%2B"); String httpUrl = "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token="+AuthService.getAuth(); String httpArg = "fromdevice=pc&clientip=10.10.10.0&detecttype=LocateRecognize&languagetype=CHN_ENG&imagetype=1&image="+imageBase; String jsonResult = OCRTest.request(httpUrl, httpArg); Map classMap = new HashMap(); classMap.put("words_result",Word.class); JSONObject jsonobject = JSONObject.fromObject(jsonResult); ResultModel model=(ResultModel)JSONObject.toBean(jsonobject,ResultModel.class,classMap); StringBuilder sb=new StringBuilder(); List<Word> wordList=model.getWords_result(); if(wordList.size()<=0){ }else{ for (Word word : wordList) { sb.append(word.getWords()+"\n"); } System.out.println(sb); } return "index.jsp"; } }
如果用到上步的话缺少两个转换JSON用的实体类,我也给粘上来吧
package testOCR.model; import java.util.ArrayList; import java.util.List; public class ResultModel { private String log_id;//登录id private String words_result_num;//识别结果数,表示words_result的元素个数 应该是行数 private List<Word> words_result=new ArrayList<Word>();//结果列表 public String getLog_id() { return log_id; } public void setLog_id(String log_id) { this.log_id = log_id; } public String getWords_result_num() { return words_result_num; } public void setWords_result_num(String words_result_num) { this.words_result_num = words_result_num; } public List<Word> getWords_result() { return words_result; } public void setWords_result(List<Word> words_result) { this.words_result = words_result; } @Override public String toString() { return "ResultModel [log_id=" + log_id + ", words_result_num=" + words_result_num + ", words_result=" + words_result + "]"; } }
package testOCR.model; public class Word { String words; public String getWords() { return words; } public void setWords(String words) { this.words = words; } @Override public String toString() { return "Word [words=" + words + "]"; } }
接口描述
用户向服务请求识别某张图中的所有文字。
请求说明
请求示例HTTP 方法:
POST
请求URL:
https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic
URL参数:
参数 | 值 |
---|---|
access_token | 通过API Key和Secret Key获取的access_token,参考“Access Token获取” |
参数 | 值 |
---|---|
Content-Type | application/x-www-form-urlencoded |
请求参数
参数 | 是否必选 | 类型 | 可选值范围 | 说明 |
---|---|---|---|---|
image | 和url二选一 | string | - | 图像数据,base64编码,要求base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式,当image字段存在时url字段失效 |
url | 和image二选一 | string | - | 图片完整URL,URL长度不超过1024字节,URL对应的图片base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式,当image字段存在时url字段失效 |
language_type | false | string | CHN_ENG、ENG、POR、FRE、GER、ITA、SPA、RUS、JAP、KOR | 识别语言类型,默认为CHN_ENG。可选值包括: - CHN_ENG:中英文混合; - ENG:英文; - POR:葡萄牙语; - FRE:法语; - GER:德语; - ITA:意大利语; - SPA:西班牙语; - RUS:俄语; - JAP:日语; - KOR:韩语 |
detect_direction | false | boolean | true、false | 是否检测图像朝向,默认不检测,即:false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括: - true:检测朝向; - false:不检测朝向。 |
detect_language | false | string | true、false | 是否检测语言,默认不检测。当前支持(中文、英语、日语、韩语) |
probability | false | string | true、false | 是否返回识别结果中每一行的置信度 |
请参考通用文字识别(含位置信息版)的代码内容,并更换请求地址。
返回说明
返回参数字段 | 是否必选 | 类型 | 说明 |
---|---|---|---|
direction | 否 | int32 | 图像方向,当detect_direction=true时存在。 - -1:未定义, - 0:正向, - 1: 逆时针90度, - 2:逆时针180度, - 3:逆时针270度 |
log_id | 是 | uint64 | 唯一的log id,用于问题定位 |
words_result | 是 | array() | 识别结果数组 |
words_result_num | 是 | uint32 | 识别结果数,表示words_result的元素个数 |
+words | 否 | string | 识别结果字符串 |
probability | 否 | object | 识别结果中每一行的置信度值,包含average:行置信度平均值,variance:行置信度方差,min:行置信度最小值 |
HTTP/1.1 200 OK x-bce-request-id: 73c4e74c-3101-4a00-bf44-fe246959c05e Cache-Control: no-cache Server: BWS Date: Tue, 18 Oct 2016 02:21:01 GMT Content-Type: application/json;charset=UTF-8 { "log_id": 2471272194, "words_result_num": 2, "words_result": [ {"words": " TSINGTAO"}, {"words": "青島睥酒"} ] }
[/code]
错误码
错误码 | 错误信息 | 描述 |
---|---|---|
1 | Unknown error | 服务器内部错误,请再次请求, 如果持续出现此类错误,请通过QQ群(224994340)或工单联系技术支持团队。 |
2 | Service temporarily unavailable | 服务暂不可用,请再次请求, 如果持续出现此类错误,请通过QQ群(224994340)或工单联系技术支持团队。 |
3 | Unsupported openapi method | 调用的API不存在,请检查后重新尝试 |
4 | Open api request limit reached | 集群超限额 |
6 | No permission to access data | 无权限访问该用户数据 |
17 | Open api daily request limit reached | 每天请求量超限额 |
18 | Open api qps request limit reached | QPS超限额 |
19 | Open api total request limit reached | 请求总量超限额 |
100 | Invalid parameter | 无效的access_token参数,请检查后重新尝试 |
110 | Access token invalid or no longer valid | access_token无效 |
111 | Access token expired | access token过期 |
282000 | internal error | 服务器内部错误,请再次请求, 如果持续出现此类错误,请通过QQ群(631977213)或工单联系技术支持团队。 |
216100 | invalid param | 请求中包含非法参数,请检查后重新尝试 |
216101 | not enough param | 缺少必须的参数,请检查参数是否有遗漏 |
216102 | service not support | 请求了不支持的服务,请检查调用的url |
216103 | param too long | 请求中某些参数过长,请检查后重新尝试 |
216110 | appid not exist | appid不存在,请重新核对信息是否为后台应用列表中的appid |
216200 | empty image | 图片为空,请检查后重新尝试 |
216201 | image format error | 上传的图片格式错误,现阶段我们支持的图片格式为:PNG、JPG、JPEG、BMP,请进行转码或更换图片 |
216202 | image size error | 上传的图片大小错误,现阶段我们支持的图片大小为:base64编码后小于4M,分辨率不高于4096*4096,请重新上传图片 |
216630 | recognize error | 识别错误,请再次请求,如果持续出现此类错误,请通过QQ群(631977213)或工单联系技术支持团队。 |
216631 | recognize bank card error | 识别银行卡错误,出现此问题的原因一般为:您上传的图片非银行卡正面,上传了异形卡的图片或上传的银行卡正品图片不完整 |
216633 | recognize idcard error | 识别身份证错误,出现此问题的原因一般为:您上传了非身份证图片或您上传的身份证图片不完整 |
216634 | detect error | 检测错误,请再次请求,如果持续出现此类错误,请通过QQ群(631977213)或工单联系技术支持团队。 |
282003 | missing parameters: {参数名} | 请求参数缺失 |
282005 | batch processing error | 处理批量任务时发生部分或全部错误,请根据具体错误码排查 |
282006 | batch task limit reached | 批量任务处理数量超出限制,请将任务数量减少到10或10以下 |
282114 | url size error | URL长度超过1024字节或为0 |
282808 | request id: xxxxx not exist | request id xxxxx 不存在 |
282809 | result type error | 返回结果请求错误(不属于excel或json) |
282810 | image recognize error | 图像识别错误 |
相关文章推荐
- JAVA实现百度OCR文字识别功能
- java调用百度接口 识别图片文字
- JAVA实现百度OCR文字识别功能
- JAVA实现百度OCR文字识别功能
- 用百度AI的OCR文字识别结合JAVA实现了图片的文字识别功能
- JAVA实现百度OCR文字识别功能
- 关于ASPxGridView控件触发服务器端FocusedRowChanged事件的设置
- 关于JAVA指纹识别的源码!怎么会是这样的?
- 关于java的classpath设置
- 关于 JAVA初学者 环境变量设置的说明(转)
- 关于Java环境变量的设置
- 关于java环境变量的设置要注意的地方
- “JAVA.LANG.NOCLASSDEFFOUNDERROR” 关于CLASSPATH设置问题
- 【技术贴】关于百度搜索框打不上任何文字的解决办法。。。
- Java虚假机jvm关于内存的设置与调优
- 关于oracle设置不活动自动断开连接导致java访问数据库时发生异常的问题
- Java文字图像识别(1)
- Java文字图像识别(1)[88250原创]
- 关于Java设置环境变量后的调试出现问题的解决方案
- 关于Eclipse里run java 程序的参数设置