全部产品
阿里云办公

Java SDK 2.0

更新时间:2018-11-15 10:41:17

版本提示

本文档中的SDK只适用于7月5日新发布的2.0版语音服务,如果您是之前开通的,要使用此SDK需要新开通2.0版服务

下载安装

可从maven 服务器下载最新版本SDK:

  1. <dependency>
  2. <groupId>com.alibaba.nls</groupId>
  3. <artifactId>nls-sdk-long-asr</artifactId>
  4. <version>2.0.3</version>
  5. </dependency>

使用方式参见下面代码示例。Demo 源码下载链接

关键接口

  • NlsClient:语音处理client,相当于所有语音相关处理类的factory,全局创建一个实例即可。线程安全。
  • SpeechTranscriber:实时语音识别类,设置请求参数,发送请求及声音数据。非线程安全。
  • SpeechTranscriberListener:实时语音识别结果监听类,监听识别结果。非线程安全。

更多介绍参见API文档链接: Java API接口说明

SDK 调用注意事项

  1. NlsClient对象创建一次可以重复使用,每次创建消耗性能。NlsClient使用了netty的框架,创建时比较消耗时间和资源,但创建之后可以重复利用。建议调用程序将NlsClient的创建和关闭与程序本身的生命周期结合。
  2. SpeechTranscriber对象不能重复使用,一个识别任务对应一个SpeechTranscriber对象。例如有N个音频文件,则要进行N次识别任务,创建N个SpeechTranscriber对象。
  3. 实现的SpeechTranscriberListener对象和SpeechTranscriber对象是一一对应的,不能将一个SpeechTranscriberListener对象设置到多个SpeechTranscriber对象中,否则不能区分是哪个识别任务。

代码示例

说明:Demo中使用的音频文件为16000Hz采样率,请在管控台中将appKey对应项目的模型设置为“通用”模型,以获取正确的识别结果;如果使用其他音频,请设置为支持该音频场景的模型,模型设置请阅读管理项目一节。

nls-sample-16k.wav

示例

  1. import com.alibaba.nls.client.protocol.InputFormatEnum;
  2. import com.alibaba.nls.client.protocol.NlsClient;
  3. import com.alibaba.nls.client.protocol.SampleRateEnum;
  4. import com.alibaba.nls.client.protocol.asr.SpeechTranscriber;
  5. import com.alibaba.nls.client.protocol.asr.SpeechTranscriberListener;
  6. import com.alibaba.nls.client.protocol.asr.SpeechTranscriberResponse;
  7. import java.io.InputStream;
  8. /**
  9. * SpeechTranscriberDemo class
  10. *
  11. * 实时音频流识别Demo
  12. */
  13. public class SpeechTranscriberDemo {
  14. private String appKey;
  15. private String accessToken;
  16. NlsClient client;
  17. public SpeechTranscriberDemo(String appKey, String token) {
  18. this.appKey = appKey;
  19. this.accessToken = token;
  20. // Step0 创建NlsClient实例,应用全局创建一个即可,默认服务地址为阿里云线上服务地址
  21. client = new NlsClient(accessToken);
  22. }
  23. private static SpeechTranscriberListener getTranscriberListener() {
  24. SpeechTranscriberListener listener = new SpeechTranscriberListener() {
  25. // 识别出中间结果.服务端识别出一个字或词时会返回此消息.仅当setEnableIntermediateResult(true)时,才会有此类消息返回
  26. @Override
  27. public void onTranscriptionResultChange(SpeechTranscriberResponse response) {
  28. System.out.println("name: " + response.getName() +
  29. // 状态码 20000000 表示正常识别
  30. ", status: " + response.getStatus() +
  31. // 句子编号,从1开始递增
  32. ", index: " + response.getTransSentenceIndex() +
  33. // 当前句子的中间识别结果
  34. ", result: " + response.getTransSentenceText() +
  35. // 当前已处理的音频时长,单位是毫秒
  36. ", time: " + response.getTransSentenceTime());
  37. }
  38. // 识别出一句话.服务端会智能断句,当识别到一句话结束时会返回此消息
  39. @Override
  40. public void onSentenceEnd(SpeechTranscriberResponse response) {
  41. System.out.println("name: " + response.getName() +
  42. // 状态码 20000000 表示正常识别
  43. ", status: " + response.getStatus() +
  44. // 句子编号,从1开始递增
  45. ", index: " + response.getTransSentenceIndex() +
  46. // 当前句子的完整识别结果
  47. ", result: " + response.getTransSentenceText() +
  48. // 当前已处理的音频时长,单位是毫秒
  49. ", time: " + response.getTransSentenceTime() +
  50. // SentenceBegin事件的时间,单位是毫秒
  51. ", begin time: " + response.getSentenceBeginTime() +
  52. // 识别结果置信度,取值范围[0.0, 1.0],值越大表示置信度越高
  53. ", confidence: " + response.getConfidence());
  54. }
  55. // 识别完毕
  56. @Override
  57. public void onTranscriptionComplete(SpeechTranscriberResponse response) {
  58. System.out.println("name: " + response.getName() +
  59. ", status: " + response.getStatus());
  60. }
  61. };
  62. return listener;
  63. }
  64. public void process(InputStream ins) {
  65. SpeechTranscriber transcriber = null;
  66. try {
  67. // Step1 创建实例,建立连接
  68. transcriber = new SpeechTranscriber(client, getTranscriberListener());
  69. transcriber.setAppKey(appKey);
  70. // 输入音频编码方式
  71. transcriber.setFormat(InputFormatEnum.PCM);
  72. // 输入音频采样率
  73. transcriber.setSampleRate(SampleRateEnum.SAMPLE_RATE_16K);
  74. // 是否返回中间识别结果
  75. transcriber.setEnableIntermediateResult(false);
  76. // 是否生成并返回标点符号
  77. transcriber.setEnablePunctuation(true);
  78. // 是否将返回结果规整化,比如将一百返回为100
  79. transcriber.setEnableITN(true);
  80. // Step2 此方法将以上参数设置序列化为json发送给服务端,并等待服务端确认
  81. transcriber.start();
  82. // Step3 语音数据来自声音文件用此方法,控制发送速率;若语音来自实时录音,不需控制发送速率直接调用 recognizer.sent(ins)即可
  83. transcriber.send(ins, 6400, 200);
  84. // Step4 通知服务端语音数据发送完毕,等待服务端处理完成
  85. transcriber.stop();
  86. } catch (Exception e) {
  87. System.err.println(e.getMessage());
  88. } finally {
  89. // Step5 关闭连接
  90. if (null != transcriber) {
  91. transcriber.close();
  92. }
  93. }
  94. }
  95. public void shutdown() {
  96. client.shutdown();
  97. }
  98. public static void main(String[] args) {
  99. if (args.length < 2) {
  100. System.err.println("SpeechTranscriberDemo need params: <app-key> <token>");
  101. System.exit(-1);
  102. }
  103. String appKey = args[0];
  104. String token = args[1];
  105. SpeechTranscriberDemo demo = new SpeechTranscriberDemo(appKey, token);
  106. InputStream ins = SpeechTranscriberDemo.class.getResourceAsStream("/nls-sample-16k.wav");
  107. if (null == ins) {
  108. System.err.println("open the audio file failed!");
  109. return;
  110. }
  111. demo.process(ins);
  112. demo.shutdown();
  113. }
  114. }