package com.demo.aidemo.aiui;
im
port android.content.Context;
im
port android.text.TextUtils;
im
port android.util.Log;
im
port com.demo.aidemo.utils.FileUtils;
im
port com.iflytek.aiui.AIUIAgent;
im
port com.iflytek.aiui.AIUIConstant;
im
port com.iflytek.aiui.AIUIEvent;
im
port com.iflytek.aiui.AIUIListener;
im
port com.iflytek.aiui.AIUIMessage;
im
port org.json.JSONException;
im
port org.json.JSONObject;
im
port java.io.UnsupportedEncodingException;
public class AIUIManager {
private static final String TAG = AIUIManager.class.getSimpleName();
private static AIUIManager instance = null;
private Co
ntext mContext;
private AIUIAgent mAIUIAgent = null;
private int mAIUIState = AIUIConstant.STATE_IDLE;
private o
nNlpListener mListener;
public static AIUIManager getInstance() {
if (instance == null) {
instance = new AIUIManager();
}
return instance;
}
public void init(Co
ntext context) {
this.mCo
ntext = context;
createAgent();
}
public void seto
nNlpListener(o
nNlpListener listener) {
this.mListener = listener;
}
private void createAgent() {
if (null == mAIUIAgent) {
Log.i(TAG, "create aiui agent");
mAIUIAgent = AIUIAgent.createAgent(mContext, getAIUIParams(), mAIUIListener);
}
if (null == mAIUIAgent) {
Log.i(TAG, "创建AIUIAgent失败!");
} else {
Log.i(TAG, "AIUIAgent已创建");
}
}
public void destroyAgent() {
if (null != mAIUIAgent) {
Log.i(TAG, "destroy aiui agent");
mAIUIAgent.destroy();
mAIUIAgent = null;
Log.i(TAG, "AIUIAgent已销毁");
} else {
Log.i(TAG, "AIUIAgent为空");
}
}
public void startVoiceNlp() {
if (null == mAIUIAgent) {
Log.i(TAG, "AIUIAgent为空,请先创建");
return;
}
Log.i(TAG, "start voice nlp");
// 先发送唤醒消息,改变AIUI内部状态,只有唤醒状态才能接收语音输入
// 默认为oneshot模式,即一次唤醒后就进入休眠。可以修改aiui_phone.cfg中speech参数的interact_mode为continuous以支持持续交互
// if (AIUIConstant.STATE_WORKING != mAIUIState)
{
AIUIMessage wakeupMsg = new AIUIMessage(AIUIConstant.CMD_WAKEUP, 0, 0, "", null);
mAIUIAgent.sendMessage(wakeupMsg);
}
// 打开AIUI内部录音机,开始录音。若要使用上传的个性化资源增强识别效果,则在参数中添加pers_param设置
// 个性化资源使用方法可参见http://doc.xfyun.cn/aiui_mobile/的用户个性化章节
// 在输入参数中设置tag,则对应结果中也将携带该tag,可用于关联输入输出
String params = "sample_rate=16000,data_type=audio,pers_param={"uid":""},tag=audio-tag";
AIUIMessage startRecord = new AIUIMessage(AIUIConstant.CMD_START_RECORD, 0, 0, params, null);
mAIUIAgent.sendMessage(startRecord);
}
public void stopVoiceNlp() {
if (null == mAIUIAgent) {
Log.i(TAG,"AIUIAgent 为空,请先创建");
return;
}
Log.i(TAG, "stop voice nlp");
// 停止录音
String params = "sample_rate=16000,data_type=audio";
AIUIMessage stopRecord = new AIUIMessage(AIUIConstant.CMD_STOP_RECORD, 0, 0, params, null);
mAIUIAgent.sendMessage(stopRecord);
}
public void startTextNlp(String text) {
if (null == mAIUIAgent) {
Log.i(TAG, "AIUIAgent 为空,请先创建");
return;
}
// 先发送唤醒消息,改变AIUI内部状态,只有唤醒状态才能接收文本输入
// if (AIUIConstant.STATE_WORKING != mAIUIState)
{
AIUIMessage wakeupMsg = new AIUIMessage(AIUIConstant.CMD_WAKEUP, 0, 0, "", null);
mAIUIAgent.sendMessage(wakeupMsg);
}
Log.i(TAG, "start text nlp");
try {
// 在输入参数中设置tag,则对应结果中也将携带该tag,可用于关联输入输出
String params = "data_type=text,tag=text-tag";
byte[] textData = text.getBytes("utf-8");
AIUIMessage write = new AIUIMessage(AIUIConstant.CMD_WRITE, 0, 0, params, textData);
mAIUIAgent.sendMessage(write);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
private AIUIListener mAIUIListener = new AIUIListener() {
@Override
public void o
nEvent(AIUIEvent event) {
Log.i(TAG, "on event: " + event.eventType);
switch (event.eventType) {
case AIUIConstant.EVENT_CONNECTED_TO_SERVER:
Log.i(TAG, "已连接服务器");
break;
case AIUIConstant.EVENT_SERVER_DISCONNECTED:
Log.i(TAG, "与服务器断连");
break;
case AIUIConstant.EVENT_RESULT: {
try {
JSo
nObject bizParamJson = new JSo
nObject(event.info);
JSo
nObject data = bizParamJson.getJSo
nArray("data").getJSo
nObject(0);
JSo
nObject params = data.getJSo
nObject("params");
JSo
nObject co
ntent = data.getJSo
nArray("content").getJSo
nObject(0);
if (content.has("cnt_id")) {
String cnt_id = content.getString("cnt_id");
String cntStr = new String(event.data.getByteArray(cnt_id), "utf-8");
if (TextUtils.isEmpty(cntStr)) {
return;
}
JSo
nObject cntJson = new JSo
nObject(cntStr);
String sub = params.optString("sub");
if ("nlp".equals(sub)) {
// 解析得到语义结果
String resultStr = cntJson.optString("intent");
parseTextResult(resultStr);
Log.i(TAG, resultStr);
}
}
} catch (Throwable e) {
e.printStackTrace();
}
}
break;
case AIUIConstant.EVENT_ERROR: {
Log.i(TAG, "错误: " + event.arg1 + "