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

来源:互联网 发布:海康网络摄像机维修 编辑:程序博客网 时间:2024/06/02 06:20

首先要先下载百度云提供的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));    }}

在上面代码中,常量APP_ID在百度云控制台中创建,常量API_KEYSECRET_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);}

接口函数说明:

// 语音识别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);
参数类型描述是否必须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是语音数据唯一标识,系统内部产生,用于 debugresultstring是识别结果数组,提供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}

错误码

错误码含义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;@Controllerpublic 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;//登录idprivate 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;}@Overridepublic 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;}@Overridepublic 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是否返回识别结果中每一行的置信度

请求代码示例

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

返回说明

返回参数

字段是否必选类型说明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 OKx-bce-request-id: 73c4e74c-3101-4a00-bf44-fe246959c05eCache-Control: no-cacheServer: BWSDate: Tue, 18 Oct 2016 02:21:01 GMTContent-Type: application/json;charset=UTF-8{"log_id": 2471272194, "words_result_num": 2,"words_result":     [        {"words": " TSINGTAO"},         {"words": "青島睥酒"}    ]}

错误码

错误码错误信息描述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请求了不支持的服务,请检查调用的url216103param too long请求中某些参数过长,请检查后重新尝试216110appid not existappid不存在,请重新核对信息是否为后台应用列表中的appid216200empty 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字节或为0282808request id: xxxxx not existrequest id xxxxx 不存在282809result type error返回结果请求错误(不属于excel或json)282810image recognize error图像识别错误


原创粉丝点击