首先要先下载百度云提供的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。
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_KEY
与SECRET_KEY
是在创建完毕应用后,系统分配给用户的,均为字符串,用于标识用户,为访问做签名验证,可在AI服务控制台中的应用列表中查看。
向远程服务上传整段语音进行识别
举例:
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/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
}
错误码 | 含义 |
---|---|
3300 | 输入参数不正确 |
3301 | 识别错误 |
3302 | 验证失败 |
3303 | 语音服务器后端问题 |
3304 | 请求 QPS 过大,超过限额 |
3305 | 产品线当前日请求数超过 |
------------
文字识别API
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> 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> 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 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 words_result=new ArrayList();//结果列表
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 getWords_result() {
return words_result;
}
public void setWords_result(List 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-Type | application/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_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": "青島睥酒"}
]
}
错误码 | 错误信息 | 描述 |
---|---|---|
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 | 图像识别错误 |