全部产品

Java Demo

更新时间:2019-07-12 16:47:55

提示:

  • 在使用SDK之前,请先确保已阅读了接口说明文档
  • 本文档中的SDK只适用于7月5日新发布的2.0版语音服务,如果您是之前开通的,要使用此SDK需要新开通2.0版服务

SDK 说明

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

注意: 阿里云Java SDK不支持Android开发。

添加Java依赖

您只需依赖阿里云Java SDK的核心库与阿里开源库fastjson即可。阿里云Java SDK的核心库版本支持3.5.0及以上(如果版本在4.0.0及以上,需要增加其对应的第三方依赖,根据错误提示补充即可)。

  1. <dependency>
  2. <groupId>com.aliyun</groupId>
  3. <artifactId>aliyun-java-sdk-core</artifactId>
  4. <version>3.7.1</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("appkey", "您的appkey"); // 设置appkey,传入您管控台项目的appkey
  12. taskObject.put("file_link", "您的录音文件访问链接"); // 设置录音文件访问链接,传入您需要识别的录音文件的链接
  13. taskObject.put(KEY_VERSION, "4.0"); // 新接入请使用4.0版本,已接入(默认2.0)如需维持现状,请注释掉该参数设置
  14. String task = taskObject.toJSONString();
  15. postRequest.putBodyParameter("Task", task); // 设置以上JSON字符串为Body参数
  16. postRequest.setMethod(MethodType.POST); // 设置为POST方式的请求
  17. /**
  18. * 提交录音文件识别请求
  19. */
  20. String taskId = ""; // 获取录音文件识别请求任务的ID,以供识别结果查询使用
  21. CommonResponse postResponse = client.getCommonResponse(postRequest);
  22. if (postResponse.getHttpStatus() == 200) {
  23. JSONObject result = JSONObject.parseObject(postResponse.getData());
  24. String statusText = result.getString("StatusText");
  25. if (statusText.equals("SUCCESS")) {
  26. System.out.println("录音文件识别请求成功响应: " + result.toJSONString());
  27. taskId = result.getString("TaskId");
  28. }
  29. else {
  30. System.out.println("录音文件识别请求失败: " + result.toJSONString());
  31. return;
  32. }
  33. }
  34. else {
  35. System.err.println("录音文件识别请求失败,Http错误码:" + postResponse.getHttpStatus());
  36. System.err.println("录音文件识别请求失败响应:" + JSONObject.toJSONString(postResponse));
  37. return;
  38. }

录音文件识别结果查询

使用上面获得的任务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.exceptions.ClientException;
  7. import com.aliyuncs.http.MethodType;
  8. import com.aliyuncs.profile.DefaultProfile;
  9. public class FileTransJavaDemo {
  10. // 地域ID,常量内容,请勿改变
  11. public static final String REGIONID = "cn-shanghai";
  12. public static final String ENDPOINTNAME = "cn-shanghai";
  13. public static final String PRODUCT = "nls-filetrans";
  14. public static final String DOMAIN = "filetrans.cn-shanghai.aliyuncs.com";
  15. public static final String API_VERSION = "2018-08-17";
  16. public static final String POST_REQUEST_ACTION = "SubmitTask";
  17. public static final String GET_REQUEST_ACTION = "GetTaskResult";
  18. // 请求参数key
  19. public static final String KEY_APP_KEY = "appkey";
  20. public static final String KEY_FILE_LINK = "file_link";
  21. public static final String KEY_VERSION = "version";
  22. public static final String KEY_ENABLE_WORDS = "enable_words";
  23. // 响应参数key
  24. public static final String KEY_TASK = "Task";
  25. public static final String KEY_TASK_ID = "TaskId";
  26. public static final String KEY_STATUS_TEXT = "StatusText";
  27. public static final String KEY_RESULT = "Result";
  28. // 状态值
  29. public static final String STATUS_SUCCESS = "SUCCESS";
  30. private static final String STATUS_RUNNING = "RUNNING";
  31. private static final String STATUS_QUEUEING = "QUEUEING";
  32. // 阿里云鉴权client
  33. IAcsClient client;
  34. public FileTransJavaDemo(String accessKeyId, String accessKeySecret) {
  35. // 设置endpoint
  36. try {
  37. DefaultProfile.addEndpoint(ENDPOINTNAME, REGIONID, PRODUCT, DOMAIN);
  38. } catch (ClientException e) {
  39. e.printStackTrace();
  40. }
  41. // 创建DefaultAcsClient实例并初始化
  42. DefaultProfile profile = DefaultProfile.getProfile(REGIONID, accessKeyId, accessKeySecret);
  43. this.client = new DefaultAcsClient(profile);
  44. }
  45. public String submitFileTransRequest(String appKey, String fileLink) {
  46. /**
  47. * 1. 创建CommonRequest 设置请求参数
  48. */
  49. CommonRequest postRequest = new CommonRequest();
  50. // 设置域名
  51. postRequest.setDomain(DOMAIN);
  52. // 设置API的版本号,格式为YYYY-MM-DD
  53. postRequest.setVersion(API_VERSION);
  54. // 设置action
  55. postRequest.setAction(POST_REQUEST_ACTION);
  56. // 设置产品名称
  57. postRequest.setProduct(PRODUCT);
  58. /**
  59. * 2. 设置录音文件识别请求参数,以JSON字符串的格式设置到请求的Body中
  60. */
  61. JSONObject taskObject = new JSONObject();
  62. // 设置appkey
  63. taskObject.put(KEY_APP_KEY, appKey);
  64. // 设置音频文件访问链接
  65. taskObject.put(KEY_FILE_LINK, fileLink);
  66. // 新接入请使用4.0版本,已接入(默认2.0)如需维持现状,请注释掉该参数设置
  67. taskObject.put(KEY_VERSION, "4.0");
  68. // 设置是否输出词信息,默认为false,开启时需要设置version为4.0及以上
  69. taskObject.put(KEY_ENABLE_WORDS, true);
  70. String task = taskObject.toJSONString();
  71. System.out.println(task);
  72. // 设置以上JSON字符串为Body参数
  73. postRequest.putBodyParameter(KEY_TASK, task);
  74. // 设置为POST方式的请求
  75. postRequest.setMethod(MethodType.POST);
  76. /**
  77. * 3. 提交录音文件识别请求,获取录音文件识别请求任务的ID,以供识别结果查询使用
  78. */
  79. String taskId = null;
  80. try {
  81. CommonResponse postResponse = client.getCommonResponse(postRequest);
  82. System.err.println("提交录音文件识别请求的响应:" + postResponse.getData());
  83. if (postResponse.getHttpStatus() == 200) {
  84. JSONObject result = JSONObject.parseObject(postResponse.getData());
  85. String statusText = result.getString(KEY_STATUS_TEXT);
  86. if (statusText.equals(STATUS_SUCCESS)) {
  87. taskId = result.getString(KEY_TASK_ID);
  88. }
  89. }
  90. } catch (ClientException e) {
  91. e.printStackTrace();
  92. }
  93. return taskId;
  94. }
  95. public String getFileTransResult(String taskId) {
  96. /**
  97. * 1. 创建CommonRequest 设置任务ID
  98. */
  99. CommonRequest getRequest = new CommonRequest();
  100. // 设置域名
  101. getRequest.setDomain(DOMAIN);
  102. // 设置API版本
  103. getRequest.setVersion(API_VERSION);
  104. // 设置action
  105. getRequest.setAction(GET_REQUEST_ACTION);
  106. // 设置产品名称
  107. getRequest.setProduct(PRODUCT);
  108. // 设置任务ID为查询参数
  109. getRequest.putQueryParameter(KEY_TASK_ID, taskId);
  110. // 设置为GET方式的请求
  111. getRequest.setMethod(MethodType.GET);
  112. /**
  113. * 2. 提交录音文件识别结果查询请求
  114. * 以轮询的方式进行识别结果的查询,直到服务端返回的状态描述为“SUCCESS”,或者为错误描述,则结束轮询。
  115. */
  116. String result = null;
  117. while (true) {
  118. try {
  119. CommonResponse getResponse = client.getCommonResponse(getRequest);
  120. System.err.println("识别查询结果:" + getResponse.getData());
  121. if (getResponse.getHttpStatus() != 200) {
  122. break;
  123. }
  124. JSONObject rootObj = JSONObject.parseObject(getResponse.getData());
  125. String statusText = rootObj.getString(KEY_STATUS_TEXT);
  126. if (statusText.equals(STATUS_RUNNING) || statusText.equals(STATUS_QUEUEING)) {
  127. // 继续轮询,注意设置轮询时间间隔
  128. Thread.sleep(3000);
  129. }
  130. else {
  131. // 状态信息为成功,返回识别结果;状态信息为异常,返回空
  132. if (statusText.equals(STATUS_SUCCESS)) {
  133. result = rootObj.getString(KEY_RESULT);
  134. }
  135. break;
  136. }
  137. } catch (Exception e) {
  138. e.printStackTrace();
  139. }
  140. }
  141. return result;
  142. }
  143. public static void main(String args[]) throws Exception {
  144. if (args.length < 3) {
  145. System.err.println("FileTransJavaDemo need params: <AccessKey Id> <AccessKey Secret> <app-key>");
  146. }
  147. final String accessKeyId = args[0];
  148. final String accessKeySecret = args[1];
  149. final String appKey = args[2];
  150. String fileLink = "https://aliyun-nls.oss-cn-hangzhou.aliyuncs.com/asr/fileASR/examples/nls-sample-16k.wav";
  151. FileTransJavaDemo demo = new FileTransJavaDemo(accessKeyId, accessKeySecret);
  152. // 第一步:提交录音文件识别请求,获取任务ID用于后续的识别结果轮询
  153. String taskId = demo.submitFileTransRequest(appKey, fileLink);
  154. if (taskId != null) {
  155. System.out.println("录音文件识别请求成功,task_id: " + taskId);
  156. }
  157. else {
  158. System.out.println("录音文件识别请求失败!");
  159. return;
  160. }
  161. // 第二步:根据任务ID轮询识别结果
  162. String result = demo.getFileTransResult(taskId);
  163. if (result != null) {
  164. System.out.println("录音文件识别结果查询成功:" + result);
  165. }
  166. else {
  167. System.out.println("录音文件识别结果查询失败!");
  168. }
  169. }
  170. }

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

  1. taskObject.put("enable_callback", true);
  2. taskObject.put("callback_url", "回调地址");

回调服务示例:该服务用于回调方式获取转写结果,仅供参考,假设设置的回调地址是:http://ip:port/filetrans/callback/result

  1. package com.example.filetrans;
  2. import com.alibaba.fastjson.JSONObject;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.RequestMethod;
  5. import org.springframework.web.bind.annotation.RestController;
  6. import javax.servlet.ServletInputStream;
  7. import javax.servlet.http.HttpServletRequest;
  8. import java.io.IOException;
  9. import java.util.regex.Matcher;
  10. import java.util.regex.Pattern;
  11. @RequestMapping("/filetrans/callback")
  12. @RestController
  13. public class FiletransCallBack {
  14. // 以4开头的状态码是客户端错误
  15. private static final Pattern PATTERN_CLIENT_ERR = Pattern.compile("4105[0-9]*");
  16. // 以5开头的状态码是服务端错误
  17. private static final Pattern PATTERN_SERVER_ERR = Pattern.compile("5105[0-9]*");
  18. // 必须是post的方式
  19. @RequestMapping(value = "result", method = RequestMethod.POST)
  20. public void GetResult(HttpServletRequest request) {
  21. byte [] buffer = new byte[request.getContentLength()];
  22. ServletInputStream in = null;
  23. try {
  24. in = request.getInputStream();
  25. in.read(buffer, 0 ,request.getContentLength());
  26. in.close();
  27. // 获取json格式的文件转写结果
  28. String result = new String(buffer);
  29. JSONObject jsonResult = JSONObject.parseObject(result);
  30. // 解析并输出相关结果内容
  31. System.out.println("获取文件中转写回调结果:" + result);
  32. System.out.println("TaskId: " + jsonResult.getString("TaskId"));
  33. System.out.println("StatusCode: " + jsonResult.getString("StatusCode"));
  34. System.out.println("StatusText: " + jsonResult.getString("StatusText"));
  35. Matcher matcherClient = PATTERN_CLIENT_ERR.matcher(jsonResult.getString("StatusCode"));
  36. Matcher matcherServer = PATTERN_SERVER_ERR.matcher(jsonResult.getString("StatusCode"));
  37. // 以2开头状态码为正常状态码,回调方式方式正常状态只返回"21050000"
  38. if(jsonResult.getString("StatusCode").equals("21050000")) {
  39. System.out.println("RequestTime: " + jsonResult.getString("RequestTime"));
  40. System.out.println("SolveTime: " + jsonResult.getString("SolveTime"));
  41. System.out.println("BizDuration: " + jsonResult.getString("BizDuration"));
  42. System.out.println("Result.Sentences.size: " +
  43. jsonResult.getJSONObject("Result").getJSONArray("Sentences").size());
  44. for (int i = 0; i < jsonResult.getJSONObject("Result").getJSONArray("Sentences").size(); i++) {
  45. System.out.println("Result.Sentences[" + i + "].BeginTime: " +
  46. jsonResult.getJSONObject("Result").getJSONArray("Sentences").getJSONObject(i).getString("BeginTime"));
  47. System.out.println("Result.Sentences[" + i + "].EndTime: " +
  48. jsonResult.getJSONObject("Result").getJSONArray("Sentences").getJSONObject(i).getString("EndTime"));
  49. System.out.println("Result.Sentences[" + i + "].SilenceDuration: " +
  50. jsonResult.getJSONObject("Result").getJSONArray("Sentences").getJSONObject(i).getString("SilenceDuration"));
  51. System.out.println("Result.Sentences[" + i + "].Text: " +
  52. jsonResult.getJSONObject("Result").getJSONArray("Sentences").getJSONObject(i).getString("Text"));
  53. System.out.println("Result.Sentences[" + i + "].ChannelId: " +
  54. jsonResult.getJSONObject("Result").getJSONArray("Sentences").getJSONObject(i).getString("ChannelId"));
  55. System.out.println("Result.Sentences[" + i + "].SpeechRate: " +
  56. jsonResult.getJSONObject("Result").getJSONArray("Sentences").getJSONObject(i).getString("SpeechRate"));
  57. System.out.println("Result.Sentences[" + i + "].EmotionValue: " +
  58. jsonResult.getJSONObject("Result").getJSONArray("Sentences").getJSONObject(i).getString("EmotionValue"));
  59. }
  60. }
  61. else if(matcherClient.matches()) {
  62. System.out.println("状态码以4开头表示客户端错误......");
  63. }
  64. else if(matcherServer.matches()) {
  65. System.out.println("状态码以5开头表示服务端错误......");
  66. }
  67. else {
  68. }
  69. } catch (IOException e) {
  70. e.printStackTrace();
  71. }
  72. }
  73. }