# 概览
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系统接口录音方式(评估板不支持) |
有如下三种组合:
- sdk alsa(评估板默认模式)
- sdk system
- 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 | |
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_AUDIO
,CMD_STOP_THROW_AUDIO
控制降噪后音频对外抛出。 AIUI通过EVENT_AUDIO
返回降噪后音频。通过如下示例代码获取:
byte[] audio = event.data.getByteArray("audio");
如果是采用上位机方式集成,在上位机中并不会收到EVENT_AUDIO
事件,音频可通过I2S设备接收。