Android SDK

更新时间:
复制 MD 格式

使用录音文件识别极速版 Android SDK 上传本地音频文件,通过事件回调获取转写结果。本页介绍 SDK 集成、调用示例和关键接口。

前提条件与使用限制

  • 已开通录音文件识别极速版商用服务。极速版不支持试用,完整服务限制请参见录音文件识别极速版接口说明。

  • 已获取项目 Appkey 和有效的 NLS Token,分别参见管理项目和获取 Token。

  • 准备应用可读取的本地音频文件。支持 WAV、MP3、AAC、MP4、OPUS,文件大小不超过 100 MB,时长不超过 2 小时。项目中的识别模型应与音频语种匹配。

重要

AccessKey ID 和 AccessKey Secret 应保存在服务端,不得写入 App 代码或存储在移动端。由服务端获取 NLS Token 后下发给 App,并在 Token 过期前更新。初始化参数包含凭证,不应将完整参数写入日志。

下载安装

  1. 从移动端 SDK 选择与下载获取支持录音文件识别极速版的 Android SDK 包,并核对兼容性与合规使用要求。

  2. 解压 SDK 包,将 MinSizeRel/nuisdk-release.aar 复制到应用模块的 libs 目录,在模块的 build.gradle 中添加依赖。

    dependencies {
        implementation files('libs/nuisdk-release.aar')
    }
  3. 在 AndroidManifest.xml 中声明网络权限。

    <uses-permission android:name="android.permission.INTERNET" />

SDK 包的 example 目录内提供 Demo 工程 ZIP 包,解压后可在 Android Studio 中查看 FileTranscriberActivity.java。运行 Demo 前,配置项目 Appkey、有效的 NLS Token 和待识别文件。

V2.6.2 起,纯云端功能无需复制资源文件或设置 workspace。

混淆配置

启用代码混淆时,在 proguard-rules.pro 中保留 SDK 类。

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

调用步骤

  1. 创建 NativeNui 实例,传入实现 INativeFileTransCallback 的事件回调并初始化 SDK。

  2. 根据需要调用 setParams 配置参数,或在开始识别时传入任务参数。

  3. 调用 startFileTranscriber 上传本地文件,并保存输出的任务 ID。

  4. 在 EVENT_FILE_TRANS_RESULT 事件中获取最终结果,在 EVENT_ASR_ERROR 事件中处理错误。

  5. 不再使用 SDK 时调用 release 释放资源。需要中止任务时,使用任务 ID 调用 cancelFileTranscriber。

重要

初始化等同步调用应在非 UI 线程执行。不要在 SDK 事件回调中直接调用 SDK 接口,以免死锁;将取消、释放等操作提交到回调之外的工作线程。界面更新应在主线程执行。

代码示例

识别本地文件

以下示例使用 SDK V2.7.4-01B,识别应用私有目录中的 example.wav。将待识别的 WAV 文件保存到 getFilesDir() 对应的目录,替换 Appkey、Token 和设备标识。Token 由服务端获取并下发,设备标识建议使用唯一 ID。使用其他文件时,同时调整文件路径和 nls_config.format。将该 Activity 添加到应用工程,并在 AndroidManifest.xml 中注册。

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.util.Log;
import com.alibaba.idst.nui.AsrResult;
import com.alibaba.idst.nui.Constants;
import com.alibaba.idst.nui.INativeFileTransCallback;
import com.alibaba.idst.nui.NativeNui;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.File;
import java.nio.charset.StandardCharsets;

public class FileTranscriberActivity extends Activity implements INativeFileTransCallback {
    private HandlerThread sdkThread;
    private Handler sdkHandler;
    private NativeNui nui;
    private String taskId;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        sdkThread = new HandlerThread("file-transcriber");
        sdkThread.start();
        sdkHandler = new Handler(sdkThread.getLooper());
        sdkHandler.post(() -> {
            try {
                startRecognition();
            } catch (JSONException e) {
                Log.e("FileTranscriber", "Invalid JSON parameters", e);
                releaseSDK();
            }
        });
    }

    private void startRecognition() throws JSONException {
        String filePath = new File(getFilesDir(), "example.wav").getAbsolutePath();
        JSONObject initParams = new JSONObject();
        initParams.put("app_key", "<APPKEY>");
        initParams.put("token", "<NLS_TOKEN>");
        initParams.put("device_id", "<DEVICE_ID>");
        initParams.put("url", "https://nls-gateway.cn-shanghai.aliyuncs.com/stream/v1/FlashRecognizer");
        initParams.put("service_mode", Constants.ModeFullCloud);

        nui = new NativeNui();
        int ret = nui.initialize(this, initParams.toString(), Constants.LogLevel.LOG_LEVEL_NONE, false);
        if (ret != 0) {
            Log.e("FileTranscriber", "Initialize failed: " + ret);
            releaseSDK();
            return;
        }

        JSONObject config = new JSONObject();
        config.put("format", "wav");
        JSONObject params = new JSONObject();
        params.put("file_path", filePath);
        params.put("nls_config", config);

        byte[] taskIdBuffer = new byte[32];
        ret = nui.startFileTranscriber(params.toString(), taskIdBuffer);
        if (ret != 0) {
            Log.e("FileTranscriber", "Start failed: " + ret);
            releaseSDK();
            return;
        }
        taskId = new String(taskIdBuffer, StandardCharsets.UTF_8);
    }

    @Override
    public void onFileTransEventCallback(Constants.NuiEvent event, int resultCode,
                                        int arg2, AsrResult asrResult, String taskId) {
        if (event == Constants.NuiEvent.EVENT_FILE_TRANS_RESULT) {
            if (asrResult != null) {
                Log.i("FileTranscriber", asrResult.asrResult);
            }
            sdkHandler.post(this::releaseSDK);
        } else if (event == Constants.NuiEvent.EVENT_ASR_ERROR) {
            Log.e("FileTranscriber", "Recognition failed: " + resultCode);
            sdkHandler.post(this::releaseSDK);
        }
    }

    private void releaseSDK() {
        if (nui != null) {
            nui.release();
            nui = null;
            taskId = null;
        }
    }

    @Override
    protected void onDestroy() {
        sdkHandler.post(() -> {
            if (nui != null && taskId != null) {
                nui.cancelFileTranscriber(taskId);
            }
            releaseSDK();
            sdkThread.quitSafely();
        });
        super.onDestroy();
    }
}

取消识别

需要中止尚未完成的任务时,在同一 Activity 中使用以下代码。SDK 调用仍在 sdkHandler 的工作线程执行。

sdkHandler.post(() -> {
    if (nui != null && taskId != null) {
        int ret = nui.cancelFileTranscriber(taskId);
        Log.i("FileTranscriber", "Cancel result: " + ret);
    }
});

SDK 关键接口

NativeNui.GetInstance() 获取单例;需要独立实例时,可以使用 new NativeNui()。同一实例再次初始化前先释放。同步方法返回 0 表示调用成功,识别结果和异步错误通过事件回调返回。错误码及处理方法请参见错误码查询。

初始化与参数配置

初始化 SDK

public synchronized int initialize(INativeFileTransCallback callback,
                                   String parameters,
                                   Constants.LogLevel level);

public synchronized int initialize(INativeFileTransCallback callback,
                                   String parameters,
                                   Constants.LogLevel level,
                                   boolean save_log);

参数

类型

说明

callback

INativeFileTransCallback

文件识别事件回调,需实现 onFileTransEventCallback。

parameters

String

初始化参数 JSON,包含 Appkey、NLS Token、设备标识和服务地址。

level

Constants.LogLevel

SDK 日志级别,枚举值越小,输出的日志越多。

save_log

boolean

是否保存 SDK 日志到初始化参数 debug_path 指定的目录。

设置参数

public synchronized int setParams(String params);

params 为 JSON 字符串,可设置识别配置或更新 NLS Token。初始化和任务参数的字段说明请参见移动端 SDK 说明。

任务控制

public synchronized int startFileTranscriber(String params, byte[] taskId);
public synchronized int cancelFileTranscriber(String taskId);
public synchronized int release();

方法

说明

startFileTranscriber

开始识别。params 为任务参数 JSON,包含 file_path 和音频格式等配置;taskId 为输出缓冲区,接收 SDK 生成的任务 ID。示例使用 32 字节数组。

cancelFileTranscriber

取消对应任务。将开始识别返回的任务 ID 转为 String 后传入。

release

不再使用 SDK 时释放资源。

事件回调

void onFileTransEventCallback(Constants.NuiEvent event,
                             int resultCode,
                             int arg2,
                             AsrResult asrResult,
                             String taskId);

event 为事件类型,resultCode 在 EVENT_ASR_ERROR 时表示错误码,arg2 为保留参数,asrResult 包含识别结果,taskId 为本次任务 ID。

事件

说明

EVENT_FILE_TRANS_CONNECTED

已连接文件识别服务。

EVENT_FILE_TRANS_UPLOADED

文件已上传。

EVENT_FILE_TRANS_RESULT

最终识别结果,可通过 asrResult.asrResult 获取。

EVENT_ASR_ERROR

识别发生错误,根据 resultCode 处理。

常见问题

开始识别后未收到回调,如何排查?

检查 initialize 的返回值、传入的 INativeFileTransCallback 实现,以及 SDK 实例的生命周期。处理任务期间应保留该实例,在收到最终结果或错误回调后再释放。纯云端功能从 V2.6.2 起不需要复制模型资源文件。

如何获取任务状态和结果?

通过 onFileTransEventCallback 获取当前任务的状态和结果。上传完成对应 EVENT_FILE_TRANS_UPLOADED,最终结果对应 EVENT_FILE_TRANS_RESULT,错误对应 EVENT_ASR_ERROR;回调中的 taskId 用于关联任务。

是否支持 OPUS 文件?

支持。将 file_path 设置为应用可读取的 OPUS 文件路径,并将 nls_config.format 设置为 opus。

相关文档

关于移动端凭证的安全获取与使用,请参见移动端应用如何安全访问智能语音交互服务。