百度語音識別對接

百度語音識別有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, ",");
}

 

 

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