全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网

Android SDK

更新时间:2017-07-31 11:30:31

功能介绍

阿里巴巴实时语音SDK的Android版本提供实时录音识别为文字的能力。可直接用于短视频、直播、会议等应用场景。本服务通过Jar包和.so库的形式导入,用户通过本指南可以方便的接入。

SDK和DEMO下载地址

SDK下载地址

实时转写Android SDK

集成指南

导入服务包

将下载的服务包解压后,将NlsRealtimeSDK.jar,以及对应架构的.so包导入你的项目中的libs/目录下。

Json库使用fastjson,参考gradle导入方式:

  1. compile 'com.alibaba:fastjson:1.1.56.android'

Android权限管理

在AndroidManifest.xml文件中添加以下权限申请:

  1. <uses-permission android:name="android.permission.INTERNET" />
  2. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  3. <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  4. <uses-permission android:name="android.permission.RECORD_AUDIO" />
  5. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  6. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  7. <uses-permission android:name="android.permission.WRITE_SETTINGS" />

Proguard配置

如果代码使用了混淆,请在proguard-rules.pro中配置:

  1. -keep class com.alibaba.idst.nls.** {*;}

重要参数说明

AppKey

AppKey 支持语音类型 领域
nls-service-shurufa16khz 16kHz采样率语音 普通话社交聊天
nls-realtime-fangyan 16kHz采样率语音 支持四川、东北、河南话的方言识别
nls-service-en 16kHz采样率语音 支持英文识别

AccessKey&AccessSecret

点击获取Aliyun Access Key。

重要接口说明

com.alibaba.idst.nls.realtime.NlsClient


语音服务的核心服务类,客户端程序通过调用该类的cancel()、start()、stop()等方法来打开、关闭或发送语音数据。

全局配置

public static void configure(Context appContext)

  • 说明 全局配置,在初始化NlsClient前需要被调用,建议放在Application的onCreate()里
  • 参数
    • appContext 传入ApplicationContext参数,用于识别引擎内部访问和Android上下文相关的资源
  • 返回值 null

实例化NlsClient对象

public static NlsClient newInstance(Context context,NlsListener nlsListener,StageListener stageListener, NlsRequest nlsRequest)

  • 说明 获得一个NlsClient, 通过该方法实例化NlsClient。
  • 参数
    • context 传入Context参数,用于识别引擎内部访问和Android上下文相关的资源
    • nlsListener 识别相关的回调接口,用于通知客户端识别结果
    • stageListener 引擎状态回调接口,用于通知客户端当前的引擎状态以及录音音量等
  • 返回值 NlsClient

打开语音识别引擎

public boolean start()

  • 说明 打开语音识别引擎
  • 参数

  • 返回值 isOpen true:打印log false:关闭log

    true:开始录音,并对录音进行语音识别 false:打开语音识别引擎失败,可能重复打开或者远程服务处于不可用状态。

关闭语音识别引擎

public void stop()

  • 说明 关闭语音识别引擎
  • 参数

  • 返回值

判断是否正在进行语音识别

public boolean isStarted()

  • 说明 返回当前引擎是否已启动
  • 参数

  • 返回值 true:引擎已启动 false:引擎未启动

取消此次语音识别

public void cancel()

  • 说明 取消此次语音识别,识别结果为ErrorCode.USER_CANCEL
  • 参数

  • 返回值 null

其它接口

Log开关

public static void openLog(boolean isOpen)

  • 说明 log开关,标识是否需要通过logcat打印识别引擎的相关log
  • 参数
    • isOpen true:打印log false:关闭log
  • 返回值 null

设置音量回调时长

public NlsClient setMinVoiceValueInterval(int interval)

  • 说明 设置获取录音音量的最短时间间隔,防止录音音量回调过于频繁影响客户端对音量的展示逻辑
  • 参数
    • interval 更新间隔 单位ms
  • 返回值 NlsClient

com.alibaba.idst.nls.realtime.internal.protocol.NlsRequest


语音服务的请求封装对象。调用程序需要至少在请求对象里设定好调用者的appKey和语音数据的格式以便后台服务能正确识别并翻译语音。

初始化Nls请求:NlsRequest mNlsRequest = new NlsRequest()

public void setAppkey(String appkey)

  • 说明 设置应用的appkey,appkey需要先申请再使用。获取AppKey参考文档。
  • 参数
    • appkey
  • 返回值 null

public void setVocabularyId(String vocabularyId)

  • 说明 设置调用热词服务的词表id。提供用户自定义热词设置接口,提高语音识别率。用户自定义热词词表的提交方式是RESTFUL接口,详细见「用户自定义热词」。
  • 参数
    • vocabularyId : 热词定义词表时定义的vocabularyId。
  • 返回值 null

public void setResponseMode(String responseMode)

  • 说明 设置返回模式,分为流式返回和非流式返回结果。streaming为流式返回结果,既返回识别的中间结果;normal为非流式返回,既每一句话的结果只返回最终识别结果。
  • 参数
    • responseMode: “streaming”/“normal”。
  • 返回值 null

public void authorize(String id, String secret)

  • 说明 数加认证模块,所有的请求都必须通过authorize方法认证通过,才可以使用。 id和secret需要申请获取。
  • 参数
    • id id。
    • secret 对应密钥。
  • 返回值 null

com.alibaba.idst.nls.realtime.StageListener


语音服务引擎状态变更回调接口,服务状态的改变、音量大小的回调、语音文件的生成通过本接口获取。

录音开始的回调

public void onStartRecording(NlsClient recognizer)

  • 说明 录音开始
  • 参数

  • 返回值 NlsClient

录音结束的回调

public void onStopRecording(NlsClient recognizer)

  • 说明 录音结束
  • 参数

  • 返回值 NlsClient

识别开始的回调

public void onStartRecognizing(NlsClient recognizer)

  • 说明 识别开始
  • 参数

  • 返回值 NlsClient

识别结束的回调

public void onStopRecognizing(NlsClient recognizer)

  • 说明 识别结束
  • 参数

  • 返回值 NlsClient

音量大小回调

public void onVoiceVolume(int volume)

  • 说明 获取音量

  • 参数

    • volume 录音音量,范围0-100
  • 返回值 null

com.alibaba.idst.nls.realtime.NlsListener


语音服务结果的回调类,语音服务是一个相对较长过程,为了不影响客户端的正常工作,语音sdk被设计成异步模式,调用程序将语音客户端建立好并将语音数据交给sdk后就可以离开。在收到语音数据之后的处理需要通过实现该接口来完成。每一个识别过程创建的时候都需要注入listener以响应语音服务的结果。

语音识别的文本回调接口

public void onRecognizingResult(int status, NlsResponse result)

  • 说明 语音识别结果回调接口,识别结果回调。(使用流式返回模式时,一句话会多次回调本接口得到实时识别结果,增量更新)
  • 参数
    • status 标识识别结果的状态,详情见下方。
    • result 返回识别结果的数据结构,详情见下方。
  • 返回值 null
  • NlsResponse:

语音识别的返回结果封装对象。返回结果告知语音识别是否成功,语音识别结果或部分结果(视调用程序需要的返回方式而定),语音识别是否已经结束。

返回参数:

属性 值类型 是否必须 说明 取值方法
version String 协议版本 getVersion()
request_id String 当前请求id getRequestId()
status_code Int 状态码 getStatusCode()
result Object(结构如下) 返回结果,当有识别结果时返回 getResult()
  • 其中请求结果result的字段如下:
属性 值类型 是否必须 说明 取值方法
sentence_id Int 当前句子序号 getRequest_id()
begin_time Int 当前句子开始时间 getBegin_time()
end_time Int 当前句子结束时间,当为streaming模式时,中间结果返回-1 getEnd_time()
status_code Int 状态码,normal模式时,结果为0;streaming模式时,最终结果为0,中间结果为1 getRecognizeStatusCode()
text String 当前识别结果 getText()

错误码

  • 客户端错误码
字段名 错误码 含义
SUCCESS 0 成功
RECOGNIZE_ERROR 1 识别失败
USER_CANCEL 520 用户取消
CONNECT_ERROR 530 网络及通讯异常
NOTHING 540 语音服务异常
RECORDING_ERROR 550 录音及语音识别异常
ERROR_CLICK_TOOMUCH 570 用户点击过快
  • 服务端返回结果错误码
状态 status_code CloseFrame状态码 HTTP语义
成功 200 1000 成功处理
请求格式有误 400 4400 错误请求
需要鉴权信息 401 4401 请求要求身份验证
鉴权失败 403 4403 服务器拒绝请求
超出最大并发量 429 4429 太多请求
请求超时 408 4408 处理请求超时
处理出错 500 4500 服务器内部错误
服务不可用 503 4503 服务不可用

完整示例

  1. package com.alibaba.idst.nlsdemo;
  2. import android.app.Activity;
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.os.Bundle;
  6. import android.util.Log;
  7. import android.view.View;
  8. import android.widget.Button;
  9. import android.widget.EditText;
  10. import android.widget.Toast;
  11. import com.alibaba.fastjson.JSON;
  12. import com.alibaba.idst.R;
  13. import com.alibaba.idst.nls.realtime.NlsClient;
  14. import com.alibaba.idst.nls.realtime.NlsListener;
  15. import com.alibaba.idst.nls.realtime.StageListener;
  16. import com.alibaba.idst.nls.realtime.internal.protocol.NlsRequest;
  17. import com.alibaba.idst.nls.realtime.internal.protocol.NlsResponse;
  18. import java.util.HashMap;
  19. public class PublicAsrActivity extends Activity {
  20. private boolean isRecognizing = false;
  21. private EditText mFullEdit;
  22. private EditText mResultEdit;
  23. private Button mStartButton;
  24. private Button mStopButton;
  25. private NlsClient mNlsClient;
  26. private NlsRequest mNlsRequest;
  27. private Context context;
  28. private String id ;
  29. private String secret;
  30. private String appKey;
  31. private HashMap<Integer,String> resultMap = new HashMap<Integer, String>();
  32. private int sentenceId = 0;
  33. @Override
  34. protected void onCreate(Bundle savedInstanceState) {
  35. super.onCreate(savedInstanceState);
  36. setContentView(R.layout.activity_public_asr);
  37. context = getApplicationContext();
  38. mFullEdit = (EditText) findViewById(R.id.editText2);
  39. mResultEdit = (EditText) findViewById(R.id.editText);
  40. mStartButton = (Button) findViewById(R.id.button);
  41. mStopButton = (Button) findViewById(R.id.button2);
  42. mNlsRequest = new NlsRequest();
  43. Intent intent = getIntent();
  44. appKey = ""; //参考文档
  45. id = "";
  46. secret = "";//请替换为用户申请到的数加认证Access Key和Access Srcret,见上方文档
  47. resultMap = new HashMap<Integer, String>();
  48. mNlsRequest.setAppkey(appKey); //appkey请从 "快速开始" 帮助页面的appkey列表中获取
  49. mNlsRequest.setResponseMode("streaming");//流式为streaming,非流式为normal
  50. //设置热词相关属性
  51. //mNlsRequest.setVocabularyId("vocab_id");//详情参考热词相关接口
  52. NlsClient.openLog(true);
  53. NlsClient.configure(getApplicationContext()); //全局配置
  54. mNlsClient = NlsClient.newInstance(this, mRecognizeListener, mStageListener,mNlsRequest);//实例化NlsClient
  55. initStartRecognizing();
  56. initStopRecognizing();
  57. }
  58. private void initStartRecognizing(){
  59. mStartButton.setOnClickListener(new View.OnClickListener() {
  60. @Override
  61. public void onClick(View view) {
  62. isRecognizing = true;
  63. mResultEdit.setText("正在录音,请稍候!");
  64. mNlsRequest.authorize(id,secret); //请替换为用户申请到的数加认证Access Key和Access Srcret,见上方文档
  65. mNlsClient.start();
  66. mStartButton.setText("录音中。。。");
  67. }
  68. });
  69. }
  70. private void initStopRecognizing(){
  71. mStopButton.setOnClickListener(new View.OnClickListener() {
  72. @Override
  73. public void onClick(View view) {
  74. isRecognizing = false;
  75. mResultEdit.setText("");
  76. mNlsClient.stop();
  77. mStartButton.setText("开始 录音");
  78. }
  79. });
  80. }
  81. private NlsListener mRecognizeListener = new NlsListener() {
  82. @Override
  83. public void onRecognizingResult(int status, NlsResponse result) {
  84. switch (status) {
  85. case NlsClient.ErrorCode.SUCCESS:
  86. if (result!=null){
  87. if(result.getResult()!=null) {
  88. //获取句子id对应结果。
  89. if (sentenceId != result.getSentenceId()) {
  90. sentenceId = result.getSentenceId();
  91. }
  92. resultMap.put(sentenceId,result.getText());
  93. Log.i("asr", "[demo] callback onRecognizResult :" + result.getResult().getText());
  94. mResultEdit.setText(resultMap.get(sentenceId));
  95. mFullEdit.setText(JSON.toJSONString(result.getResult()));
  96. }
  97. }else {
  98. Log.i("asr", "[demo] callback onRecognizResult finish!" );
  99. mResultEdit.setText("Recognize finish!");
  100. mFullEdit.setText("Recognize finish!");
  101. }
  102. break;
  103. case NlsClient.ErrorCode.RECOGNIZE_ERROR:
  104. Toast.makeText(PublicAsrActivity.this, "recognizer error", Toast.LENGTH_LONG).show();
  105. break;
  106. case NlsClient.ErrorCode.RECORDING_ERROR:
  107. Toast.makeText(PublicAsrActivity.this,"recording error", Toast.LENGTH_LONG).show();
  108. break;
  109. case NlsClient.ErrorCode.NOTHING:
  110. Toast.makeText(PublicAsrActivity.this,"nothing", Toast.LENGTH_LONG).show();
  111. break;
  112. }
  113. isRecognizing = false;
  114. }
  115. } ;
  116. private StageListener mStageListener = new StageListener() {
  117. @Override
  118. public void onStartRecognizing(NlsClient recognizer) {
  119. super.onStartRecognizing(recognizer); //To change body of overridden methods use File | Settings | File Templates.
  120. }
  121. @Override
  122. public void onStopRecognizing(NlsClient recognizer) {
  123. super.onStopRecognizing(recognizer); //To change body of overridden methods use File | Settings | File Templates.
  124. mResultEdit.setText("");
  125. mNlsClient.stop();
  126. mStartButton.setText("开始 录音");
  127. }
  128. @Override
  129. public void onStartRecording(NlsClient recognizer) {
  130. super.onStartRecording(recognizer); //To change body of overridden methods use File | Settings | File Templates.
  131. }
  132. @Override
  133. public void onStopRecording(NlsClient recognizer) {
  134. super.onStopRecording(recognizer); //To change body of overridden methods use File | Settings | File Templates.
  135. }
  136. @Override
  137. public void onVoiceVolume(int volume) {
  138. super.onVoiceVolume(volume);
  139. }
  140. };
  141. }
本文导读目录