首先要先下載百度雲提供的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 | 圖像識別錯誤 |