通过不同平台设置录音API tinyalsa获取到原始音频,经过回声消除、噪声抑制的简单算法处理得到的单声道音频数据,之后进行关键词唤醒、AI交互、语义理解以及各种TTS播报等场景的使用了。下面就对AIUI交互使用场景中的关键节点以及关键状态为的check问题进行一些分析,方便以后定位问题。
1.AIUI流程分析
项目中用到的一些AIUI关键节点及事件状态,基本一套完整的AIUI交互就是以下事件中的不同状态间的切换并对不同状态进行处理即可。
public class AIUIConstant {
...
public static final int EVENT_CONNECTED_TO_SERVER = 13; //连接服务器成功
public static final int EVENT_ERROR = 2;
public static final int EVENT_RESULT = 1; //返回结果
public static final int EVENT_SERVER_DISCONNECTED = 14; //连接服务器失败
public static final int EVENT_SLEEP = 5; //长时间未交互
public static final int EVENT_STATE = 3; //服务器工作状态
public static final int EVENT_TTS = 15; //TTS播报相关
public static final int EVENT_VAD = 6; //音频输入相关
public static final int EVENT_WAKEUP = 4; //成功唤醒
...
public static final int CMD_RESET_WAKEUP = 8; //AIUI进入SLEEP状态
public static final int CMD_RESULT_VALIDATION_ACK = 20; //AIUI重置interac_timeout
public static final int CMD_TTS = 27; //AIUI进入TTS播报状态
public static final int CMD_WAKEUP = 7; //AIUI进入唤醒状态
public static final int CMD_SET_PARAMS = 10; //手动修改AIUI配置参数
public static final int CMD_WRITE = 2; //手动向AIUI写入音频数据
...
///*服务器具体工作状态
public static final int STATE_IDLE = 1;
public static final int STATE_READY = 2;
public static final int STATE_WORKING = 3;
///*服务器TTS具体状态
public static final int TTS_SPEAK_BEGIN = 1;
public static final int TTS_SPEAK_COMPLETED = 5;
public static final int TTS_SPEAK_PAUSED = 2;
public static final int TTS_SPEAK_PROGRESS = 4;
public static final int TTS_SPEAK_RESUMED = 3;
///*服务器VAD具体状态
public static final int VAD_BOS = 0; //语音输入开始前端点检测
public static final int VAD_BOS_TIMEOUT = 3; //语音输入在检测到前端点之后长时间未说话
public static final int VAD_EOS = 2; //语音输入结束后端点检测
public static final int VAD_VOL = 1; //语音输入过程
...
}
1.Connect to Server
2.Trigger WakeUp
3.Change AIUI State to Working
4.Trigger TTS and play "你好"
5. AIUI TTS: begin -> progress -> completed,播报时间1.6s
6.AIUI VAD:bos -> vol -> eos ,音频输入2s时间
7.AIUI Recognise Result
AIUI VAD检测阶段,返回识别到的音频输入内容-"琵琶行"
AIUI VAD结束阶段,返回语音理解之后的内容-琵琶行诗的内容
8.对AIUI返回的result结果进行关键字段检索,获取需要的text文本进行TTS播报,一次交互完成。
2.AIUI异常结果处理
1.概率性交互不回复
EVENT_SLEEP:
触发机制:长时间不与AIUI进行会话交互触发,会关闭当前会话。
check之前AIUI交互场景18:32:05时开启音频输入,持续了6s,触发交互超时,再之前是TTS播报过程。
2.概率性TTS播报没有声音
EVENT_TTS TTS_SPEAK_PAUSED
时间触发机制:SDK内部主动发送暂停事件或外部触发了别的播放事件抢占音频焦点
check外部触发CMD_TTS抢占音频焦点的情况,发现事件发生在17:57:13,30s之前,排除了这个原因,最后确定是SDK主动发送的暂停事件,需要对这一特殊情况进行特殊处理。
3.嘈杂环境异常处理
EVENT_VAD VAD_EOS
AIUI根据输入的内容进行流式识别结果反馈时,解析的关键字端iatText拿不到输入的音频数据,为null,此时不做异常处理,会默认针对结果为null的提问服务器有应答且进行TTS播报,但实际情况是没有应答且没有播报的。
3.AIUI结果解析
项目中这一块结果解析不是我负责的,从同事那边薅来的劳动成果,已支付版权费,阅。
总结
AIUI交互的重头戏在于一些动画、对话框等内容的美化上,这个后面再说。