本文为您介绍如何使用阿里云智能语音服务提供的Android SDK,包括SDK下载安装、关键接口及代码示例。
前提条件
下载安装
解压ZIP包,在
app/libs
目录下获取AAR格式的SDK包,将AAR包集成到您的工程项目中进行依赖。使用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()
调用步骤
初始化SDK。
根据业务需求设置参数。
调用startFileTranscriber开始识别。
在EVENT_FILE_TRANS_RESULT事件中获取最终识别结果。
结束调用,使用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) {
;
}
}