# 概览

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

# 交互模式

通过speech下的interact_mode参数配置AIUI的交互模式。

AIUI默认的交互模式是一次唤醒后可持续交互,对应配置值continuous。 另一配置值oneshot表示oneshot模式,在该交互模式下一次唤醒交互后即会自动休眠。

# 外部输入

AIUI支持开发者使用外部录音的方式将音频或文本写入SDK进行语义理解,而不仅仅局限于使用SDK内部录音的方式,采用软核模式集成的开发者可使用此方式写入音频数据。

# speech配置

speech中可以对录音参数进行配置,具体参数配置见下表:

参数 可选配置及描述
data_source
用于指定音频来源

sdk:内部录音
user:外部通过CMD_WRITE写入音频
audio_captor
指定内部录音(data_source为sdk)时的录音方式

alsa:Alsa录音机,录制原始音频
system:Android系统接口录音方式(评估板不支持)

有如下三种组合:

  1. sdk alsa(评估板默认模式)
  2. sdk system
  3. user

另一配置参数wakeup_mode是由上面两个参数的配置决定的。

sdk alsa(评估板默认模式)

wakeup_mode为cae,由AIUI内部处理唤醒,AIUI评估板默认模式。

sdk system

wakeup_mode为off,由外部通过,使用系统录音机,由外部通过CMD_WAKEUP同步改变 AIUI内部唤醒状态,通过录音控制控制录音开始和停止。

user 用户通过CMD_WRITE命令写入数据的不同,wakeup_mode也不同。

  • 使用CMD_WRITE命令写入96k原始音频,wakeup_mode为cae,由AIUI通过原始音频处理唤醒。
  • 使用CMD_WRITE命令写入16k普通音频,wakeup_mode为off,由外部通过CMD_WAKEUP同步改变AIUI内部唤醒状态。

AIUI只有在唤醒状态下才会处理用户的交互。如果wakeup_mode为off,那只有显式 调用CMD_WAKEUP之后,后续的录音写入才会有效。

# 数据写入

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

params支持的描述字段如下:

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

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

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

代码示例:

//写入音频
byte[] audio;
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);

若需要同时写入多个文本,获取多个语义结果时,可在发送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。

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

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

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

# 清除交互历史

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

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

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

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

# 设置拾音波束

用户唤醒AIUI之后,AIUI会增强唤醒角度(拾音波束号)上的拾音权重,抑制其他角度上拾音的效果,提高唤醒后的交互体验。 同时拾音波束号也支持动态设置,在唤醒后通过构造CMD_SET_BEAM消息(arg1是设置拾音波束号),发送给AIUI, 更改拾音波束号。

关于4、5、6麦中拾音波束号的定义参见麦克风设计参考 (opens new window)

# 获取降噪音频

保存交互过程中的所有降噪音频和vad处理的音频,参考评估板音频保存

如果需要实时获取降噪音频,通过CMD_START_THROW_AUDIOCMD_STOP_THROW_AUDIO控制降噪后音频对外抛出。 AIUI通过EVENT_AUDIO返回降噪后音频。通过如下示例代码获取:

byte[] audio = event.data.getByteArray("audio");

如果是采用上位机方式集成,在上位机中并不会收到EVENT_AUDIO事件,音频可通过I2S设备接收。