Android SDK

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

前提条件

下载安装

  1. 下载SDK和示例代码

  2. 解压ZIP包,在app/libs目录下获取AAR格式的SDK包,将AAR包集成到您的工程项目中进行依赖。

  3. 使用Android Studio打开此工程查看参考代码实现,其中示例代码为FileTranscriberActivity.java文件,替换Appkey和Token后可直接运行。

SDK关键接口

  • initialize:初始化SDK。

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

    其中,INativeFileTransCallback类型需要实现的回调是onFileTransEventCallback。

    onFileTransEventCallback:文件识别事件回调。

    /**
         * SDK主要事件回调
         * @param event: 回调事件,参见如下事件列表
         * @param resultCode: 参见错误码,在出现EVENT_ASR_ERROR事件时有效
         * @param arg2: 保留参数
         * @param asrResult: 语音识别结果
         * @param taskId: 转写任务ID
         */
        void onFileTransEventCallback(NuiEvent event, final int resultCode, final int arg2, AsrResult asrResult, String taskId);

    事件列表:

    名称

    说明

    EVENT_FILE_TRANS_CONNECTED

    连接文件识别服务成功

    EVENT_FILE_TRANS_UPLOADED

    上传文件成功

    EVENT_FILE_TRANS_RESULT

    识别最终结果

    EVENT_ASR_ERROR

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

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

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

    /**
     * 开始识别
     * @param params: 识别参数,参见接口说明
     * @param taskId: 开始转写的任务ID,SDK生成随机字符串
     * @return: 参见错误码
     */
    public synchronized int startFileTranscriber(String params, byte[] taskId)
  • stopFileTranscriber:结束识别。

    /**
     * 结束识别
     * @return: 参见错误码
     */
    public synchronized int stopFileTranscriber(String taskId)
  • release:释放SDK。

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

调用步骤

  1. 初始化SDK。

  2. 根据业务需求设置参数。

  3. 调用startFileTranscriber开始识别。

  4. 在EVENT_FILE_TRANS_RESULT事件中获取最终识别结果。

  5. 结束调用,使用release接口释放SDK资源。

Proguard配置

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

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

代码示例

说明

接口默认采用GetInstance获得单例,您如果有多例需求,也可以直接new对象进行使用。

NUI SDK初始化

//这里主动调用完成SDK配置文件的拷贝
CommonUtils.copyAssetsData(this);
//获取工作路径
String assets_path = CommonUtils.getModelPath(this);
Log.i(TAG, "use workspace " + assets_path);

int ret = nui_instance.initialize(this, genInitParams(assets_path, debug_path), Constants.LogLevel.LOG_LEVEL_VERBOSE);

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

private String genInitParams(String workpath, String debugpath) {
    String str = "";
    try{
        //获取token方式:
        JSONObject object = new JSONObject();

        //账号和项目创建
        //  ak_id ak_secret app_key如何获得,请查看https://help.aliyun.com/document_detail/72138.html
        object.put("app_key", "<您申请创建的app_key>"); // 必填

        //方法1:(强烈推荐)
        //  首先ak_id ak_secret app_key如何获得,请查看https://help.aliyun.com/document_detail/72138.html
        //  然后请看 https://help.aliyun.com/document_detail/466615.html 使用其中方案一获取临时凭证
        //  此方案简介: 远端服务器生成具有有效时限的临时凭证, 下发给移动端进行使用, 保证账号信息ak_id和ak_secret不被泄露
        //  获得Token方法(运行在APP服务端): https://help.aliyun.com/document_detail/450255.html?spm=a2c4g.72153.0.0.79176297EyBj4k
        object.put("token", "<服务器生成的具有时效性的临时凭证>"); // 必填

        //方法2:
        //  STS获取临时凭证方法暂不支持

        //方法3:(强烈不推荐,存在阿里云账号泄露风险)
        //  参考Auth类的实现在端上访问阿里云Token服务获取SDK进行获取。请勿将ak/sk存在本地或端侧环境。
        //  此方法优点: 端侧获得Token, 无需搭建APP服务器。
        //  此方法缺点: 端侧获得ak/sk账号信息, 极易泄露。
//            JSONObject object = Auth.getAliYunTicket();

        object.put("url", "https://nls-gateway.cn-shanghai.aliyuncs.com/stream/v1/FlashRecognizer"); // 必填

        object.put("device_id", Utils.getDeviceId()); // 必填, 推荐填入具有唯一性的id, 方便定位问题。也可用提供Utils.getDeviceId()
        //工作目录路径,SDK从该路径读取配置文件
        object.put("workspace", workpath); // 必填, 且需要有读写权限
        //debug目录。当初始化SDK时的save_log参数取值为true时,该目录用于保存中间音频文件
        object.put("debug_path", debugpath);

        // FullMix = 0   // 选用此模式开启本地功能并需要进行鉴权注册
        // FullCloud = 1
        // FullLocal = 2 // 选用此模式开启本地功能并需要进行鉴权注册
        // AsrMix = 3    // 选用此模式开启本地功能并需要进行鉴权注册
        // AsrCloud = 4
        // AsrLocal = 5  // 选用此模式开启本地功能并需要进行鉴权注册
        // 这里只能选择FullMix和FullCloud
        object.put("service_mode", Constants.ModeFullCloud); // 必填

        str = object.toString();
    } catch (JSONException e) {
        e.printStackTrace();
    }

    return str;
}

开始识别

调用startFileTranscriber方法开启识别。

byte[] task_id = new byte[32];
NativeNui.GetInstance().startFileTranscriber(genDialogParams(), taskId);

private String genDialogParams() {
    String params = "";
    try {
        JSONObject dialog_param = new JSONObject();
        //若想在运行时切换app_key
        //dialog_param.put("app_key", "");
        dialog_param.put("file_path", "/sdcard/test.wav");

        JSONObject nls_config = new JSONObject();
        nls_config.put("format", "wav");

        dialog_param.put("nls_config", nls_config);
        params = dialog_param.toString();
    } catch (JSONException e) {
        e.printStackTrace();
    }

    Log.i(TAG, "dialog params: " + params);
    return params;
}

回调处理

onFileTransEventCallback:NUI SDK事件回调,请勿在事件回调中调用SDK的接口,可能引起死锁。

public void onFileTransEventCallback(Constants.NuiEvent event, final int resultCode, final int arg2, AsrResult asrResult, String taskId) {
        Log.i(TAG, "event=" + event);
    	if (event == Constants.NuiEvent.EVENT_FILE_TRANS_RESULT) {
            showText(asrView, asrResult.asrResult);
        } else if (event == Constants.NuiEvent.EVENT_ASR_ERROR) {
            ;
        }
    }

常见问题

Android SDK调用文件上传转写极速版,调用int startFileTranscriber(String params, byte[] task_id)后无法收到回调,报错提示“EventE/iDST::NativeNui: no java instance, maybe already released”。

您需要核实:

  • 资源文件是否复制成功。

  • CommonUtils.copyAssetsData函数是否已调用。

Android SDK录音文件识别极速版,通过任务ID查询任务状态用哪个API?

不支持通过任务ID查询任务状态,任务中处理安卓端回调就是当前任务的状态。

Android SDK是否可以上传OPUS音频数据,实现实时语音转文字?

ASR中一句话识别和录音文件极速版支持OPUS数据,实时语音转文字仅支持PCM编码、16 bit采样位数、单声道(mono)。具体详情,请参见接口说明

调用Android SDK时,手机报错提示“audio recoder not init”如何解决?

您可以通过以下方式排查:

  • 检查AudioRecord是否初始化正常。

  • 检查语音播放器是否有问题。

  • 系统的录音模块代码如下,也可单独编写AudioRecord录音代码,测试是否正常。编写AudioRecord录音代码