關於百度OCR文字識別JAVA服務器端設置

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

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章