Android SDK
本文介绍了如何使用阿里云智能语音服务提供的Android NUI SDK,包括SDK下载安装、关键接口及代码示例。
前提条件
下载安装
- 说明
请下载后在样例初始化代码中替换您的阿里云账号信息、Appkey和Token才可运行。
解压ZIP包,在
app/libs
目录下获取AAR格式的SDK包,将AAR包集成到您的工程项目中进行依赖。使用Android Studio打开此工程查看参考代码实现,其中实时语音识别示例代码为SpeechTranscriberActivity.java文件,替换Appkey和Token后可直接运行。
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);
onNuiAudioRMSChanged:音频能量值回调。
/** * 音频能量值回调 * @param val: 音频数据能量值回调,范围-160至0,一般用于UI展示语音动效 */ public void onNuiAudioRMSChanged(float val);
事件列表:
名称
说明
EVENT_VAD_START
检测到人声起点
EVENT_VAD_END
检测到人声尾点
EVENT_ASR_PARTIAL_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()
调用步骤
初始化SDK、录音实例。
根据业务需求设置参数。
调用startDialog开始识别。
根据音频状态回调onNuiAudioStateChanged,打开录音机。
在onNuiNeedAudioData回调中提供录音数据。
在EVENT_ASR_PARTIAL_RESULT和EVENT_SENTENCE_END事件回调中获取识别结果。
调用stopDialog结束识别。
结束调用,使用release接口释放SDK资源。
Proguard配置
如果代码使用了混淆,请在proguard-rules.pro中配置:
-keep class com.alibaba.idst.nui.*{*;}
代码示例
接口默认采用GetInstance获得单例,您如果有多例需求,也可以直接new对象进行使用。
NUI SDK初始化
//拷贝资源
CommonUtils.copyAssetsData(this);
//SDK初始化
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_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();