https://blog.csdn.net/qq_22570497/article/details/77965497
首先要先下载百度云提供的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_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);
-
}
接口函数说明:
-
// 语音识别
-
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
获取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-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 | 图像识别错误 |