全部产品
阿里云办公

Java Demo

更新时间:2018-11-06 15:40:02

SDK 说明

录音文件识别的Java Demo使用了阿里云Java SDK的CommonRequest用来提交录音文件识别请求和识别结果查询,采用的是RPC风格的POP API调用。阿里云SDK的详细介绍请阅读阿里云SDK开发指南,Java SDK CommonRequest的使用方法请阅读使用CommonReques进行调用

添加Java依赖

您只需依赖阿里云Java SDK的核心库与阿里开源库fastjson即可:

  1. <dependency>
  2. <groupId>com.aliyun</groupId>
  3. <artifactId>aliyun-java-sdk-core</artifactId>
  4. <version>3.5.0</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>com.alibaba</groupId>
  8. <artifactId>fastjson</artifactId>
  9. <version>1.2.49</version>
  10. </dependency>

Demo使用说明

录音文件说明: Demo中使用的录音文件为PCM编码格式16000Hz采样率,管控台设置的模型为通用模型;如果使用其他录音文件,请填入对应的编码格式和采样率,并在管控台设置对应的模型,模型设置请阅读管理项目一节。

nls-sample-16k.wav

阿里云鉴权client

使用过程中,所有的调用均通过阿里云账号来完成鉴权操作。通过传入阿里云账号的AccessKey ID和AccessKey Secret(获取方法请阅读开通服务一节),调用阿里云Java SDK,得到client,示例如下:

  1. final String accessKeyId = "您的AccessKey Id";
  2. final String accessKeySecret = "您的AccessKey Secret";
  3. /**
  4. * 地域ID
  5. */
  6. final String regionId = "cn-shanghai";
  7. final String endpointName = "cn-shanghai";
  8. final String product = "nls-filetrans";
  9. final String domain = "filetrans.cn-shanghai.aliyuncs.com";
  10. IAcsClient client;
  11. // 设置endpoint
  12. DefaultProfile.addEndpoint(endpointName, regionId, product, domain);
  13. // 创建DefaultAcsClient实例并初始化
  14. DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
  15. client = new DefaultAcsClient(profile);

录音文件识别请求调用接口

Java Demo采用的是轮询的方式,提交录音文件识别请求,获取任务ID,供后续轮询使用。

提交录音文件识别请求

说明:参数设置请参考简介中的“输入参数设置”,只需设置JSON字符串中的参数,其他方法的参数值保持不变。

  1. /**
  2. * 创建CommonRequest 设置请求参数
  3. */
  4. CommonRequest postRequest = new CommonRequest();
  5. postRequest.setDomain("filetrans.cn-shanghai.aliyuncs.com"); // 设置域名,固定值
  6. postRequest.setVersion("2018-08-17"); // 设置API的版本号,固定值
  7. postRequest.setAction("SubmitTask"); // 设置action,固定值
  8. postRequest.setProduct("nls-filetrans"); // 设置产品名称,固定值
  9. // 设置录音文件识别请求参数,以JSON字符串的格式设置到请求的Body中
  10. JSONObject taskObject = new JSONObject();
  11. taskObject.put("app_key", "您的app_key"); // 设置app_key,传入用户管控台项目的app_key
  12. taskObject.put("file_link", "您的录音文件访问链接"); // 设置录音文件访问链接,传入用户需要识别的录音文件的链接
  13. String task = taskObject.toJSONString();
  14. postRequest.putBodyParameter("Task", task); // 设置以上JSON字符串为Body参数
  15. postRequest.setMethod(MethodType.POST); // 设置为POST方式的请求
  16. /**
  17. * 提交录音文件识别请求
  18. */
  19. String taskId = ""; // 获取录音文件识别请求任务的ID,以供识别结果查询使用
  20. CommonResponse postResponse = client.getCommonResponse(postRequest);
  21. if (postResponse.getHttpStatus() == 200) {
  22. JSONObject result = JSONObject.parseObject(postResponse.getData());
  23. String statusText = result.getString("StatusText");
  24. if (statusText.equals("SUCCESS")) {
  25. System.out.println("录音文件识别请求成功响应: " + result.toJSONString());
  26. taskId = result.getString("TaskId");
  27. }
  28. else {
  29. System.out.println("录音文件识别请求失败: " + result.toJSONString());
  30. return;
  31. }
  32. }
  33. else {
  34. System.err.println("录音文件识别请求失败,Http错误码:" + postResponse.getHttpStatus());
  35. System.err.println("录音文件识别请求失败响应:" + JSONObject.toJSONString(postResponse));
  36. return;
  37. }

录音文件识别结果查询

使用上面获得的任务ID,查询录音文件识别的结果。

轮询录音文件识别结果

  1. /**
  2. * 创建CommonRequest 设置任务ID
  3. */
  4. CommonRequest getRequest = new CommonRequest();
  5. getRequest.setDomain("filetrans.cn-shanghai.aliyuncs.com"); // 设置域名,固定值
  6. getRequest.setVersion("2018-08-17"); // 设置API版本,固定值
  7. getRequest.setAction("GetTaskResult"); // 设置action,固定值
  8. getRequest.setProduct("nls-filetrans"); // 设置产品名称,固定值
  9. getRequest.putQueryParameter("TaskId", taskId); // 设置任务ID为查询参数,传入任务ID
  10. getRequest.setMethod(MethodType.GET); // 设置为GET方式的请求
  11. /**
  12. * 提交录音文件识别结果查询请求
  13. * 以轮询的方式进行识别结果的查询,直到服务端返回的状态描述为“SUCCESS”、“SUCCESS_WITH_NO_VALID_FRAGMENT”,或者为错误描述,则结束轮询。
  14. */
  15. String statusText = "";
  16. while (true) {
  17. CommonResponse getResponse = client.getCommonResponse(getRequest);
  18. if (getResponse.getHttpStatus() != 200) {
  19. System.err.println("识别结果查询请求失败,Http错误码: " + getResponse.getHttpStatus());
  20. System.err.println("识别结果查询请求失败: " + getResponse.getData());
  21. break;
  22. }
  23. JSONObject result = JSONObject.parseObject(getResponse.getData());
  24. System.out.println("识别查询结果:" + result.toJSONString());
  25. statusText = result.getString("StatusText");
  26. if (statusText.equals("RUNNING") || statusText.equals("QUEUEING")) {
  27. // 继续轮询
  28. Thread.sleep(3000);
  29. }
  30. else {
  31. break;
  32. }
  33. }
  34. if (statusText.equals("SUCCESS") || statusText.equals("SUCCESS_WITH_NO_VALID_FRAGMENT")) {
  35. System.out.println("录音文件识别成功!");
  36. }
  37. else {
  38. System.err.println("录音文件识别失败!");
  39. }

完整示例

  1. import com.alibaba.fastjson.JSONObject;
  2. import com.aliyuncs.CommonRequest;
  3. import com.aliyuncs.CommonResponse;
  4. import com.aliyuncs.DefaultAcsClient;
  5. import com.aliyuncs.IAcsClient;
  6. import com.aliyuncs.http.MethodType;
  7. import com.aliyuncs.profile.DefaultProfile;
  8. public class FileTransJavaDemo {
  9. /**
  10. * 地域ID
  11. * 常量内容,请勿改变
  12. */
  13. public static final String REGIONID = "cn-shanghai";
  14. public static final String ENDPOINTNAME = "cn-shanghai";
  15. public static final String PRODUCT = "nls-filetrans";
  16. public static final String DOMAIN = "filetrans.cn-shanghai.aliyuncs.com";
  17. public static final String API_VERSION = "2018-08-17";
  18. public static final String POST_REQUEST_ACTION = "SubmitTask";
  19. public static final String GET_REQUEST_ACTION = "GetTaskResult";
  20. /**
  21. * 参数设置Key
  22. * 常量内容,请勿改变
  23. */
  24. public static final String KEY_APP_KEY = "app_key";
  25. public static final String KEY_FILE_LINK = "file_link";
  26. public static final String KEY_TASK = "Task";
  27. public static final String KEY_TASK_ID = "TaskId";
  28. public static final String KEY_STATUS_TEXT = "StatusText";
  29. public static void main(String args[]) throws Exception {
  30. if (args.length < 3) {
  31. System.err.println("FileTransJavaDemo need params: <AccessKey Id> <AccessKey Secret> <app-key>");
  32. }
  33. final String accessKeyId = args[0];
  34. final String accessKeySecret = args[1];
  35. final String appKey = args[2];
  36. /**
  37. * 阿里云鉴权client
  38. */
  39. IAcsClient client;
  40. // 设置endpoint
  41. DefaultProfile.addEndpoint(ENDPOINTNAME, REGIONID, PRODUCT, DOMAIN);
  42. // 创建DefaultAcsClient实例并初始化
  43. DefaultProfile profile = DefaultProfile.getProfile(REGIONID, accessKeyId, accessKeySecret);
  44. client = new DefaultAcsClient(profile);
  45. /**
  46. * 创建CommonRequest 设置请求参数
  47. */
  48. CommonRequest postRequest = new CommonRequest();
  49. // 设置域名
  50. postRequest.setDomain(DOMAIN);
  51. // 设置API的版本号,格式为YYYY-MM-DD
  52. postRequest.setVersion(API_VERSION);
  53. // 设置action
  54. postRequest.setAction(POST_REQUEST_ACTION);
  55. // 设置产品名称
  56. postRequest.setProduct(PRODUCT);
  57. /**
  58. * 设置录音文件识别请求参数,以JSON字符串的格式设置到请求的Body中
  59. */
  60. JSONObject taskObject = new JSONObject();
  61. // 设置app_key
  62. taskObject.put(KEY_APP_KEY, appKey);
  63. // 设置音频文件访问链接
  64. taskObject.put(KEY_FILE_LINK, "https://aliyun-nls.oss-cn-hangzhou.aliyuncs.com/asr/fileASR/examples/nls-sample-16k.wav");
  65. String task = taskObject.toJSONString();
  66. // 设置以上JSON字符串为Body参数
  67. postRequest.putBodyParameter(KEY_TASK, task);
  68. // 设置为POST方式的请求
  69. postRequest.setMethod(MethodType.POST);
  70. /**
  71. * 提交录音文件识别请求
  72. */
  73. // 获取录音文件识别请求任务的ID,以供识别结果查询使用
  74. String taskId = "";
  75. CommonResponse postResponse = client.getCommonResponse(postRequest);
  76. if (postResponse.getHttpStatus() == 200) {
  77. JSONObject result = JSONObject.parseObject(postResponse.getData());
  78. String statusText = result.getString(KEY_STATUS_TEXT);
  79. if (statusText.equals("SUCCESS")) {
  80. System.out.println("录音文件识别请求成功响应: " + result.toJSONString());
  81. taskId = result.getString(KEY_TASK_ID);
  82. }
  83. else {
  84. System.err.println("录音文件识别请求失败: " + postResponse.getData());
  85. return;
  86. }
  87. }
  88. else {
  89. System.err.println("录音文件识别请求失败,Http错误码:" + postResponse.getHttpStatus());
  90. System.err.println("录音文件识别请求失败响应:" + postResponse.getData());
  91. return;
  92. }
  93. /**
  94. * 创建CommonRequest 设置任务ID
  95. */
  96. CommonRequest getRequest = new CommonRequest();
  97. // 设置域名
  98. getRequest.setDomain(DOMAIN);
  99. // 设置API版本
  100. getRequest.setVersion(API_VERSION);
  101. // 设置action
  102. getRequest.setAction(GET_REQUEST_ACTION);
  103. // 设置产品名称
  104. getRequest.setProduct(PRODUCT);
  105. // 设置任务ID为查询参数
  106. getRequest.putQueryParameter(KEY_TASK_ID, taskId);
  107. // 设置为GET方式的请求
  108. getRequest.setMethod(MethodType.GET);
  109. /**
  110. * 提交录音文件识别结果查询请求
  111. * 以轮询的方式进行识别结果的查询,直到服务端返回的状态描述为“SUCCESS”、“SUCCESS_WITH_NO_VALID_FRAGMENT”,或者为错误描述,则结束轮询。
  112. */
  113. String statusText = "";
  114. while (true) {
  115. CommonResponse getResponse = client.getCommonResponse(getRequest);
  116. if (getResponse.getHttpStatus() != 200) {
  117. System.err.println("识别结果查询请求失败,Http错误码:" + getResponse.getHttpStatus());
  118. System.err.println("识别结果查询请求失败:" + getResponse.getData());
  119. break;
  120. }
  121. JSONObject result = JSONObject.parseObject(getResponse.getData());
  122. System.out.println("识别查询结果:" + result.toJSONString());
  123. statusText = result.getString(KEY_STATUS_TEXT);
  124. if (statusText.equals("RUNNING") || statusText.equals("QUEUEING")) {
  125. // 继续轮询
  126. Thread.sleep(3000);
  127. }
  128. else {
  129. break;
  130. }
  131. }
  132. if (statusText.equals("SUCCESS") || statusText.equals("SUCCESS_WITH_NO_VALID_FRAGMENT")) {
  133. System.out.println("录音文件识别成功!");
  134. }
  135. else {
  136. System.err.println("录音文件识别失败!");
  137. }
  138. }
  139. }

补充说明:如果使用回调方式,请在task字符串中设置“enable_callback”、“callback_url”参数:

  1. taskObject.put("enable_callback", true);
  2. taskObject.put("callback_url", "您的服务地址");