使用录音文件识别极速版 Android SDK 上传本地音频文件,通过事件回调获取转写结果。本页介绍 SDK 集成、调用示例和关键接口。
前提条件与使用限制
已开通录音文件识别极速版商用服务。极速版不支持试用,完整服务限制请参见录音文件识别极速版接口说明。
准备应用可读取的本地音频文件。支持 WAV、MP3、AAC、MP4、OPUS,文件大小不超过 100 MB,时长不超过 2 小时。项目中的识别模型应与音频语种匹配。
AccessKey ID 和 AccessKey Secret 应保存在服务端,不得写入 App 代码或存储在移动端。由服务端获取 NLS Token 后下发给 App,并在 Token 过期前更新。初始化参数包含凭证,不应将完整参数写入日志。
下载安装
从移动端 SDK 选择与下载获取支持录音文件识别极速版的 Android SDK 包,并核对兼容性与合规使用要求。
解压 SDK 包,将
MinSizeRel/nuisdk-release.aar复制到应用模块的libs目录,在模块的build.gradle中添加依赖。dependencies { implementation files('libs/nuisdk-release.aar') }在
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.* { *; }调用步骤
创建
NativeNui实例,传入实现INativeFileTransCallback的事件回调并初始化 SDK。根据需要调用
setParams配置参数,或在开始识别时传入任务参数。调用
startFileTranscriber上传本地文件,并保存输出的任务 ID。在
EVENT_FILE_TRANS_RESULT事件中获取最终结果,在EVENT_ASR_ERROR事件中处理错误。不再使用 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);参数 | 类型 | 说明 |
| INativeFileTransCallback | 文件识别事件回调,需实现 |
| String | 初始化参数 JSON,包含 Appkey、NLS Token、设备标识和服务地址。 |
| Constants.LogLevel | SDK 日志级别,枚举值越小,输出的日志越多。 |
| boolean | 是否保存 SDK 日志到初始化参数 |
设置参数
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();方法 | 说明 |
| 开始识别。 |
| 取消对应任务。将开始识别返回的任务 ID 转为 String 后传入。 |
| 不再使用 SDK 时释放资源。 |
事件回调
void onFileTransEventCallback(Constants.NuiEvent event,
int resultCode,
int arg2,
AsrResult asrResult,
String taskId);event 为事件类型,resultCode 在 EVENT_ASR_ERROR 时表示错误码,arg2 为保留参数,asrResult 包含识别结果,taskId 为本次任务 ID。
事件 | 说明 |
| 已连接文件识别服务。 |
| 文件已上传。 |
| 最终识别结果,可通过 |
| 识别发生错误,根据 |
常见问题
开始识别后未收到回调,如何排查?
检查 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。
相关文档
关于移动端凭证的安全获取与使用,请参见移动端应用如何安全访问智能语音交互服务。