百度語音識別有2種:
1.短語音識別(音頻時長<=60s),識別結果是實時返回的
添加百度ocr的sdk
<!--百度ocr--> <dependency> <groupId>com.baidu.aip</groupId> <artifactId>java-sdk</artifactId> <version>4.16.2</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </exclusion> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> </exclusion> </exclusions> </dependency>
//單例的AipSpeech public enum AipSpeechSingleton { INSTANCE; //擴展,實際的單例對象 private AipSpeech intance; public AipSpeech getIntance() { return intance; } AipSpeechSingleton() { this.intance = new AipSpeech(appId, apiKey, secretKey); } }
//識別後 得到文本 public static String toText(String path) { AipSpeech client = AipSpeechSingleton.INSTANCE.getIntance(); // 可選:設置網絡連接參數 client.setConnectionTimeoutInMillis(2000); client.setSocketTimeoutInMillis(60000); byte[] bytes = new byte[0]; try { bytes = Util.readFileByBytes(path); } catch (IOException e) { e.printStackTrace(); } // 調用接口 JSONObject res = client.asr(bytes, "pcm", 16000, null); logger.info("百度短語音識別出來的信息:{}", res); org.json.JSONArray result = res.getJSONArray("result"); return StringUtils.join(result, ""); }
2.長語音識別(音頻時長>60s),需要根據任務id去查詢識別結果,調用api
/** * 創建音頻轉寫任務 * * @param url 音頻url * @param format 音頻格式 ["mp3", "wav", "pcm","m4a","amr"]單聲道,編碼 16bits 位深 * @param pid 語言類型 [80001(中文語音近場識別模型極速版), 1737(英文模型)] * @param rate 採樣率 [16000] 固定值 * @return 任務id */ public static String createTask(String url, String format, int pid, int rate) { Map<String, Object> params = new HashMap<>(4); params.put("speech_url", url); params.put("format", format); params.put("pid", pid); params.put("rate", rate); com.alibaba.fastjson.JSONObject result = OkHttpUtil.postJsonRequest(AuthService.buildUrl(TASK_CREATE_URL), params); if (result != null && result.containsKey("task_id")) { String task_id = result.getString("task_id"); //返回任務id logger.info("地址:{} 對應的任務id:{}", url, task_id); return task_id; } throw new RuntimeException("任務id不存在,請檢查音頻轉寫任務"); }
public class AuthService { public static final String appId = "自己的appid"; public static final String apiKey = "自己的apikey"; public static final String secretKey = "自己的secrekey"; //調用API時必須在URL中帶上access_token參數 public static String buildUrl(String apiUrl) { //請求中必須攜帶token String access_token = getAuth(); return apiUrl + "?access_token=" + access_token; } /** * 獲取權限token * * @return 返回示例: * { * "access_token": "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567", * "expires_in": 2592000 * } */ private static String getAuth() { // // 官網獲取的 API Key 更新爲你註冊的 // String clientId = "百度雲應用的AK"; // // 官網獲取的 Secret Key 更新爲你註冊的 // String clientSecret = "百度雲應用的SK"; return getAuth(apiKey, secretKey); } /** * 獲取API訪問token * 該token有一定的有效期,需要自行管理,當失效時需重新獲取. * * @param ak - 百度雲官網獲取的 API Key * @param sk - 百度雲官網獲取的 Securet Key * @return assess_token 示例: * "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567" */ private 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 { String result = OkHttpUtil.get(getAccessTokenUrl); JSONObject jsonObject = JSONObject.parseObject(result); String access_token = jsonObject.getString("access_token"); return access_token; } catch (Exception e) { System.err.printf("獲取token失敗!"); e.printStackTrace(System.err); } return null; } }
查詢任務:
//接口地址 private static final String TASK_CREATE_URL = "https://aip.baidubce.com/rpc/2.0/aasr/v1/create"; private static final String TASK_QUERY_URL = "https://aip.baidubce.com/rpc/2.0/aasr/v1/query";
//根據任務id 查詢任務 public static String queryTaskOne(String taskId) { List<String> taskIds = new ArrayList<>(); taskIds.add(taskId); Map<String, Object> params = new HashMap<>(1); params.put("task_ids", taskIds); String res=null; com.alibaba.fastjson.JSONObject resultJson = OkHttpUtil.postJsonRequest(AuthService.buildUrl(TASK_QUERY_URL), params); if (resultJson != null && resultJson.containsKey("tasks_info")) { JSONArray tasks_info = resultJson.getJSONArray("tasks_info"); for (int i = 0; i < tasks_info.size(); i++) { com.alibaba.fastjson.JSONObject task = tasks_info.getJSONObject(i); String task_id = task.getString("task_id"); String task_status = task.getString("task_status"); logger.info("任務id:{},狀態:{}", task_id, task_status); if (task_status.equals("Running")) { continue; } if (task_status.equals("Failure")) { continue; } if (task_status.equals("Success")) { com.alibaba.fastjson.JSONObject task_result = task.getJSONObject("task_result"); Long audio_duration = task_result.getLong("audio_duration"); String taskresult = task_result.toJSONString(); logger.info("任務執行成功返回:{}", taskresult); JSONArray result = task_result.getJSONArray("result"); logger.info("提取關鍵文字:{},時長:{}", result.toJSONString(), audio_duration); //文本解析 res = toSentenceOne(taskresult); } } } return res; }
//json解析轉爲字符串 private static String toSentenceOne(String json) { com.alibaba.fastjson.JSONObject resultJson = com.alibaba.fastjson.JSONObject.parseObject(json); List<String> resList = new ArrayList<>(); JSONArray detailed_results = resultJson.getJSONArray("detailed_result"); for (int i = 0; i < detailed_results.size(); i++) { com.alibaba.fastjson.JSONObject detailed_result = detailed_results.getJSONObject(i); JSONArray res = detailed_result.getJSONArray("res"); int end_time = detailed_result.getIntValue("end_time"); int begin_time = detailed_result.getIntValue("begin_time"); resList.add(StringUtils.join(res, "")); } return StringUtils.join(resList, ","); }