全部产品
云市场
云游戏

Android SDK

更新时间:2020-09-03 17:49:00

本文介绍了如何使用阿里云智能语音服务提供的Android NUI SDK,包括SDK下载安装、关键接口及代码示例。

前提条件

  • 使用SDK前,首先阅读接口说明,详情请参见接口说明

  • 已获取项目appkey,详情请参见创建项目

  • 已获取Access Token,详情请参见获取Token

下载安装

  1. 下载SDK和示例代码

  2. 解压ZIP包,在app/libs目录下获取AAR格式的SDK包。
  3. 使用Android Studio打开此工程。

    其中实时语音识别示例代码为SpeechTranscriberActivity.java文件。

SDK关键接口

  • initialize:初始化SDK。

    /**
         * 初始化SDK,SDK为单例,请先释放后再次进行初始化。请勿在UI线程调用,可能会引起阻塞。
         * @param callback:事件监听回调,参见下文具体回调。
         * @param parameters:初始化参数,参见接口说明。
         * @param level:log打印级别,值越小打印越多。
         * @param save_log:是否保存log为文件,存储目录为parameter中的debug_path字段值。
         * @return:参见错误码。
         */
        public synchronized int initialize(final INativeNuiCallback callback,
                                               String parameters,
                                               final Constants.LogLevel level,
                                               final boolean save_log)

    其中,INativeNuiCallback类型包含如下回调。

    • onNuiAudioStateChanged:根据音频状态进行录音功能的开关。

      /**
           * 当start/stop/cancel等接口调用时,SDK通过此回调通知App进行录音的开关操作。
           * @param state:录音需要的状态(打开/关闭)。
           */
          void onNuiAudioStateChanged(AudioState state);
    • onNuiNeedAudioData:在回调中提供音频数据。

      /**
           * 当开始识别时,此回调被连续调用,App需要在回调中进行语音数据填充。
           * @param buffer:用于给用户填充语音的存储区。
           * @param len:需要填充语音的字节数。
           * @return:实际填充的字节数。
           */
          int onNuiNeedAudioData(byte[] buffer, int len);
    • onNuiEventCallback:SDK事件回调。

      /**
           * SDK主要事件回调
           * @param event:回调事件,参见如下事件列表。
           * @param resultCode:参见错误码,在出现EVENT_ASR_ERROR事件时有效。
           * @param arg2:保留参数。
           * @param kwsResult:语音唤醒功能。
           * @param asrResult:语音识别结果。
           */
          void onNuiEventCallback(NuiEvent event, final int resultCode, final int arg2, KwsResult kwsResult, AsrResult asrResult);

      事件列表:

      名称

      说明

      EVENT_VAD_START

      检测到人声起点

      EVENT_VAD_END

      检测到人声尾点

      EVENT_ASR_PARTIAL_RESULT

      语音识别中间结果

      EVENT_ASR_RESULT

      语音识别最终结果

      EVENT_ASR_ERROR

      根据错误码信息判断出错原因

      EVENT_MIC_EEROR

      录音错误

      EVENT_SENTENCE_START

      实时语音识别事件,表示检测到一句话开始。

      EVENT_SENTENCE_END

      实时语音识别事件,表示检测到一句话结束,返回一句的完整结果。

      EVENT_SENTENCE_SEMANTICS

      暂不使用

      EVENT_TRANSCRIBER_COMPLETE

      停止语音识别后上报

  • set_params:以JSON格式设置SDK参数。

    /**
         * 以JSON格式设置参数
         * @param params:参见接口说明。
         * @return:参见错误码。
         */
        public synchronized int setParams(String params)
  • startDialog:开始识别。

    /**
         * 开始识别
         * @param vad_mode:多种模式,对于识别场景,使用P2T。
         * @return:参见错误码。
         */
    public synchronized int startDialog(VadMode vad_mode, String dialog_params)
  • stopDialog:结束识别。

    /**
         * 结束识别,调用该接口后,服务端将返回最终识别结果并结束任务。
         * @return:参见错误码。
         */
        public synchronized int stopDailog()
  • release:释放SDK。

    /**
         * 释放SDK资源
         * @return:参见错误码。
         */
    public synchronized int release()

调用步骤

  1. 初始化SDK、录音实例。
  2. 根据业务需求设置参数。
  3. 调用startDialog开始识别。
  4. 根据音频状态回调onNuiAudioStateChanged,打开录音机。
  5. 在onNuiNeedAudioData回调中提供录音数据。
  6. 在EVENT_ASR_PARTIAL_RESULT和EVENT_SENTENCE_END事件回调中获取识别结果。
  7. 调用stopDialog结束识别。
  8. 结束调用,使用release接口释放SDK资源。

Proguard配置

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

-keep class com.alibaba.idst.nui.*{*;}

代码示例

NUI SDK初始化

CommonUtils.copyAssetsData(this);
int ret = NativeNui.GetInstance().initialize(this, genInitParams(path,path2), Constants.LogLevel.LOG_LEVEL_VERBOSE, true);

其中,genInitParams生成为String JSON字符串,包含资源目录和用户信息。其中用户信息包含如下字段。

private String genInitParams(String workpath, String debugpath) {
        String str = "";
        try{
            JSONObject object;
            object.put("app_key","");
            object.put("token","");
            object.put("device_id",Utils.getDeviceId());
            object.put("url","wss://nls-gateway.cn-shanghai.aliyuncs.com:443/ws/v1");
            object.put("workspace", workpath);
            object.put("debug_path",debugpath);
            str = object.toString();
        } catch (JSONException e) {
            e.printStackTrace();
        }
  return str;
}

参数设置

以JSON字符串形式进行设置。

private String genParams() {
  String params = "";
  try {
    JSONObject nls_config = new JSONObject();
    nls_config.put("enable_intermediate_result", true);
    JSONObject parameters = new JSONObject();
    parameters.put("nls_config", nls_config);
    //选择实时语音识别服务
    parameters.put("service_type", Constants.kServiceTypeSpeechTranscriber);
    params = parameters.toString();
  } catch (JSONException e) {
    e.printStackTrace();
  }
  return params;
}
NativeNui.GetInstance().setParams(genParams());

开始识别

通过startDialog接口开启监听。

NativeNui.GetInstance().startDialog(Constants.VadMode.TYPE_P2T, genDialogParams());

回调处理

  • onNuiAudioStateChanged:录音状态回调,SDK内部维护录音状态,根据该状态的回调进行录音机的开关操作。

    public void onNuiAudioStateChanged(Constants.AudioState state) {
            Log.i(TAG, "onNuiAudioStateChanged");
            if (state == Constants.AudioState.STATE_OPEN) {
                Log.i(TAG, "audio recorder start");
                mAudioRecorder.startRecording();
            } else if (state == Constants.AudioState.STATE_CLOSE) {
                Log.i(TAG, "audio recorder close");
                mAudioRecorder.release();
            } else if (state == Constants.AudioState.STATE_PAUSE) {
                Log.i(TAG, "audio recorder pause");
                mAudioRecorder.stop();
            }
        }
  • onNuiNeedAudioData:录音数据回调,在该回调中填充录音数据。

    public int onNuiNeedAudioData(byte[] buffer, int len) {
            int ret = 0;
            if (mAudioRecorder.getState() != AudioRecord.STATE_INITIALIZED) {
                Log.e(TAG, "audio recorder not init");
                return -1;
            }
            ret = mAudioRecorder.read(buffer, 0, len);
            return ret;
        }
  • onNuiEventCallback:NUI SDK事件回调,请勿在事件回调中调用SDK的接口,可能引起死锁。

    public void onNuiEventCallback(Constants.NuiEvent event, final int resultCode, final int arg2, KwsResult kwsResult, AsrResult asrResult) {
            Log.i(TAG, "event=" + event);
            if (event == Constants.NuiEvent.EVENT_ASR_RESULT) {
                showText(asrView, asrResult.asrResult);
            } else if (event == Constants.NuiEvent.EVENT_ASR_PARTIAL_RESULT ||
                       event == Constants.NuiEvent.EVENT_SENTENCE_END) {
                showText(asrView, asrResult.asrResult);
            } else if (event == Constants.NuiEvent.EVENT_ASR_ERROR) {
                ;
            } else if (event == Constants.NuiEvent.EVENT_TRANSCRIBER_COMPLETE) {
                ;
            }
        }

结束识别

NativeNui.GetInstance().stopDialog();