您的位置:首页 > 编程语言 > Java开发

关于百度COR文字识别JAVA服务器端设置

2017-09-13 14:28 323 查看
首先要先下载百度云提供的JAVASDK

下载地址: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/dataString/byte[]语音文件所在路径或二进制数据
urlString语音下载地址
callbackString识别结果回调地址
formatString包括pcm(不压缩)、wav、opus、speex、amr
rateint采样率,支持 8000 或者 16000
cuidString用户唯一标识,用来区分用户,填写机器 MAC 地址或 IMEI 码,长度为60以内
lanString语种选择,中文=zh、粤语=ct、英文=en,不区分大小写,默认中文
ptcint协议号,下行识别结果选择,默认 nbest 结果
语音识别 返回数据参数详情
参数类型是否一定输出描述
err_noint错误码
err_msgint错误码描述
snint语音数据唯一标识,系统内部产生,用于 debug
resultstring识别结果数组,提供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编码过的字节数组字符串
}
}



这块上面的代码有,这是获取access_token的代码

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获取
Header如下:
参数
Content-Typeapplication/x-www-form-urlencoded
Body中放置请求参数,参数详情如下:

请求参数
参数是否必选类型可选值范围说明
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_typefalsestringCHN_ENG、ENG、POR、FRE、GER、ITA、SPA、RUS、JAP、KOR识别语言类型,默认为CHN_ENG。可选值包括:

- CHN_ENG:中英文混合;

- ENG:英文;

- POR:葡萄牙语;

- FRE:法语;

- GER:德语;

- ITA:意大利语;

- SPA:西班牙语;

- RUS:俄语;

- JAP:日语;

- KOR:韩语
detect_directionfalsebooleantrue、false是否检测图像朝向,默认不检测,即:false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:

- true:检测朝向;

- false:不检测朝向。
detect_languagefalsestringtrue、false是否检测语言,默认不检测。当前支持(中文、英语、日语、韩语)
probabilityfalsestringtrue、false是否返回识别结果中每一行的置信度
请求代码示例

请参考通用文字识别(含位置信息版)的代码内容,并更换请求地址。


返回说明

返回参数
字段是否必选类型说明
directionint32图像方向,当detect_direction=true时存在。

- -1:未定义,

- 0:正向,

- 1: 逆时针90度,

- 2:逆时针180度,

- 3:逆时针270度
log_iduint64唯一的log id,用于问题定位
words_resultarray()识别结果数组
words_result_numuint32识别结果数,表示words_result的元素个数
+wordsstring识别结果字符串
probabilityobject识别结果中每一行的置信度值,包含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]


错误码

错误码错误信息描述
1Unknown error服务器内部错误,请再次请求, 如果持续出现此类错误,请通过QQ群(224994340)或工单联系技术支持团队。
2Service temporarily unavailable服务暂不可用,请再次请求, 如果持续出现此类错误,请通过QQ群(224994340)或工单联系技术支持团队。
3Unsupported openapi method调用的API不存在,请检查后重新尝试
4Open api request limit reached集群超限额
6No permission to access data无权限访问该用户数据
17Open api daily request limit reached每天请求量超限额
18Open api qps request limit reachedQPS超限额
19Open api total request limit reached请求总量超限额
100Invalid parameter无效的access_token参数,请检查后重新尝试
110Access token invalid or no longer validaccess_token无效
111Access token expiredaccess token过期
282000internal error服务器内部错误,请再次请求, 如果持续出现此类错误,请通过QQ群(631977213)或工单联系技术支持团队。
216100invalid param请求中包含非法参数,请检查后重新尝试
216101not enough param缺少必须的参数,请检查参数是否有遗漏
216102service not support请求了不支持的服务,请检查调用的url
216103param too long请求中某些参数过长,请检查后重新尝试
216110appid not existappid不存在,请重新核对信息是否为后台应用列表中的appid
216200empty image图片为空,请检查后重新尝试
216201image format error上传的图片格式错误,现阶段我们支持的图片格式为:PNG、JPG、JPEG、BMP,请进行转码或更换图片
216202image size error上传的图片大小错误,现阶段我们支持的图片大小为:base64编码后小于4M,分辨率不高于4096*4096,请重新上传图片
216630recognize error识别错误,请再次请求,如果持续出现此类错误,请通过QQ群(631977213)或工单联系技术支持团队。
216631recognize bank card error识别银行卡错误,出现此问题的原因一般为:您上传的图片非银行卡正面,上传了异形卡的图片或上传的银行卡正品图片不完整
216633recognize idcard error识别身份证错误,出现此问题的原因一般为:您上传了非身份证图片或您上传的身份证图片不完整
216634detect error检测错误,请再次请求,如果持续出现此类错误,请通过QQ群(631977213)或工单联系技术支持团队。
282003missing parameters: {参数名}请求参数缺失
282005batch processing error处理批量任务时发生部分或全部错误,请根据具体错误码排查
282006batch task limit reached批量任务处理数量超出限制,请将任务数量减少到10或10以下
282114url size errorURL长度超过1024字节或为0
282808request id: xxxxx not existrequest id xxxxx 不存在
282809result type error返回结果请求错误(不属于excel或json)
282810image recognize error图像识别错误
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: