# 概览

AIUI支持通过发送AIUIMessage或者修改配置来控制交互方式与交互流程。

# 外部输入

AIUI默认使用SDK内部录音的方式进行语音识别及语义理解,但同时也支持开发者使用外部录音的方式将音频或文本写入SDK。

# 录音来源

修改AIUI配置文件中的data_source字段可以指定AIUI录音来源,值为sdk时使用AIUI内部录音,使用CMD_START_RECORDCMD_STOP_RECORD命令进行控制。另一取值user,表示由外部写入录音数据,使用CMD_WRITECMD_STOP_WRITE命令通知AIUI数据写入和写入结束。

注:data_source取值为sdk,仅在Android平台SDK下可用,其他平台只能取值user,通过外部输入音频数据。

# 开始/停止录音

使用CMD_START_RECORDCMD_STOP_RECORD控制录音开始和停止,当录音开始或结束时会抛出 EVENT_START_RECORDEVENT_STOP_RECORD事件通知。

注:params参数传data_type=audio

# 数据写入

通过CMD_WRITE向AIUI写入数据,params字段中指定数据类型、采样率等描述信息,例如:”data_type=audio,sample_rate=16000”。 data字段为待写入的二进制数据(如音频、图像、文本等)。 params支持的描述字段如下:

参数名称
说明
data_type
数据类型,取值:
audio(音频)、text(文本)、image(图像,暂不支持)。
sample_rate
数据采样率,
audio数据采样取值:16000(单通道)。
msc.lng和msc.lat
GPS经纬度信息。
当使用weather等需要位置信息的语义服务时可以传GPS坐标定位,
在具有GPS模块的Android设备上可以不传。
rec_user_data
识别用的用户私有数据,用于增强特定词语的识别效果。
示例:rec_user_data=”{“recHotWords”: “播报内容|地图显示|
路径优先”, “sceneInfo”: {}}”。

在指定为外部录音后,通过构造CMD_WRITE写入音频,params字段中 必须指定data_type为audio,sample_rate指定写入音频采样率。

除了可以写入音频外,也可以写入文本数据,data_type指定为text。写入的文本会直接作为语义的输入,影响交互的语义上下文,并且如正常交互一样,返回对应的语义结果

Android 示例代码:

//写入音频
byte[] audio = xxx; //初始化
String params = "data_type=audio,sample_rate=16000";
AIUIMessage msg = new AIUIMessage(AIUIConstant.CMD_WRITE, 0, 0, params, audio);
mAIUIAgent.sendMessage(msg);

//停止写入
AIUIMessage msg = new AIUIMessage(AIUIConstant.CMD_STOP_WRITE, 0, 0, params, null);
mAIUIAgent.sendMessage(msg);

//写入文本
byte[] content= "确定预定".getBytes();
String params = "data_type=text";
AIUIMessage msg = new AIUIMessage(AIUIConstant.CMD_WRITE, 0, 0, params, content);
mAIUIAgent.sendMessage(msg);

iOS/Linux/Windows 示例代码:

//写入音频
char audio[length] ;
Buffer* buffer = Buffer::alloc(length);
memcpy(buffer->data, audio, length);
IAIUIMessage* writeMsg=IAIUIMessage::create(AIUIConstant::CMD_WRITE, 0, 0, "data_type=audio,sample_rate=16000", buffer);
m_angent->sendMessage(writeMsg);
writeMsg->destroy();

//写入文本
string text ="确定预定";
Buffer* textData = Buffer::alloc(text.length());
text.copy((char*) textData->data(), text.length());
IAIUIMessage* writeMsg=IAIUIMessage::create(AIUIConstant::CMD_WRITE, 0, 0, "data_type=text", textData);
m_angent->sendMessage(writeMsg);
writeMsg->destroy();

//停止写入
IAIUIMessage* writeMsg=IAIUIMessage::create(AIUIConstant::CMD_STOP_WRITE, 0, 0, "data_type=audio,sample_rate=16000", buffer);
m_angent->sendMessage(writeMsg);
writeMsg->destroy();

若需要同时写入多个文本,获取多个语义结果时,可在发送AIUIMessage时加入tag标签来将结果与写入的数据一一对应。代码示例如下:

//写入文本
byte[] content= "你好".getBytes();
String params = "data_type=text";
AIUIMessage msg = new AIUIMessage(AIUIConstant.CMD_WRITE, 0, 0, "tag=write_data_1", content);
mAIUIAgent.sendMessage(msg);

//结果回调
private void processResult(AIUIEvent event) {
    String tag = event.data.getString("tag");
}

# 延迟休眠

AIUI中有效交互的定义是交互的结果有语义结果,并且语义结果中的rc字段的值为0或3。

AIUI中如果持续一段时间(配置文件interact_timeout可配置)无有效交互,AIUI就会自动休眠。

如用户在AIUI后台的应用管理中只勾选了听写,那客户端收到的交互结果中会一直没有语义结果, 都算是无效交互,在持续一段时间(interact_timeout)后就会自动休眠。对接入AIUI第三方后 处理的情况,也是类似的情况,AIUI无法识别第三方后处理结果中的有效语义,故也算是是无效交互。

对于上述这种情况,AIUI提供CMD_RESULT_VALIDATION_ACK命令,在接收到语义, 听写或者后处理结果后5秒内发送该条指令,AIUI即会认为该条结果为有效交互,并重新开始无效结果自动休眠的倒计时。

# 清除历史

AIUI支持多轮对话,如在问合肥今天的天气怎么样之后,再询问明天的呢,AIUI会结合上一句询问合肥今天 天气的历史,就会回答合肥明天的天气。

AIUI默认在休眠后唤醒会清除交互历史,在交互状态下唤醒,则不会清除交互历史。

AIUI清除历史的方式是可配置的,默认为auto即是上面描述的模式。当配置成user值后, 用户可以通过发送CMD_CLEAN_DIALOG_HISTORY在任何时候手动清除交互的历史。

即使在上面两种情况下,客户端没有主动清除交互历史,服务端保存用户交互历史的时间也是有限的,当用户交互超过5轮后,服务端也会将交互历史清空。