跳到主要内容

唤醒词对话模式

名词解释

名词解释
KWS关键词唤醒(Keyword Spotting),用于检测特定的唤醒词,触发设备进入监听状态。
VAD语音活动检测(Voice Activity Detection),用于检测是否有语音输入。

功能简述

ai_mode_wakeup 是 TuyaOpen AI 应用框架中的唤醒词模式实现,提供了一种免接触的语音交互方式,类似智能音箱的工作模式。用户通过说出特定的唤醒词触发后,设备进入监听状态,自动通过 VAD 检测语音活动并完成录音上传,完成一轮对话后自动返回空闲状态,需要重新唤醒才能进行下一轮对话。

  • 唤醒词触发:通过 KWS 检测唤醒词触发,进入监听状态
  • 自动 VAD:使用自动 VAD 模式,唤醒后自动检测语音活动,无需手动控制录音
  • 单轮对话:唤醒后仅支持一轮对话,完成对话后自动返回空闲状态,需要重新唤醒
  • 自动超时:在无语音活动或播放完成后,自动超时(默认 30 秒)返回空闲状态
  • LED 指示:不同状态显示不同的 LED 效果(需启用 LED 组件)
    • 空闲:LED 关闭
    • 聆听:LED 闪烁(500ms)
    • 思考:LED 闪烁(2000ms)
    • 说话:LED 常亮

工作流程

模块架构图

状态机流程

唤醒词模式通过状态机管理整个交互流程,从空闲状态开始,通过唤醒词进入监听,完成一轮语音交互后自动返回空闲状态,需要重新唤醒才能进行下一轮对话。

唤醒流程

用户通过说出唤醒词触发唤醒词模式。

语音交互流程

唤醒后,设备自动通过 VAD 检测语音活动,完成一轮完整的语音交互后自动返回空闲状态。

配置说明

配置文件路径

ai_components/ai_mode/Kconfig

功能使能

menuconfig ENABLE_COMP_AI_PRESENT_MODE
bool "enable ai present mode"
default y

config ENABLE_COMP_AI_MODE_WAKEUP
bool "enable ai mode wakeup"
default y

依赖组件

  • 音频组件ENABLE_COMP_AI_AUDIO):必需,用于音频输入输出和 VAD 检测
  • LED 组件ENABLE_LED):可选,用于状态指示
  • 按键组件ENABLE_BUTTON):可选,用于按键唤醒功能(作为备用触发方式)

开发流程

接口说明

注册唤醒词模式

将唤醒词模式注册到模式管理器中。

/**
* @brief Register wakeup mode
* @return OPERATE_RET Operation result
*/
OPERATE_RET ai_mode_wakeup_register(void);

开发步骤

  1. 注册模式:在应用启动时调用 ai_mode_wakeup_register() 注册唤醒词模式
  2. 初始化模式:通过 ai_mode_init(AI_CHAT_MODE_WAKEUP) 初始化唤醒词模式
  3. 运行模式任务:在任务循环中调用 ai_mode_task_running() 运行状态机
  4. 处理事件:确保用户事件、VAD 状态变化、按键事件等已正确转发到模式管理器

参考示例

注册和初始化

#include "ai_mode_wakeup.h"
#include "ai_manage_mode.h"

// 注册唤醒词模式
OPERATE_RET register_wakeup_mode(void)
{
OPERATE_RET rt = OPRT_OK;

// 注册唤醒词模式
TUYA_CALL_ERR_RETURN(ai_mode_wakeup_register());

return rt;
}

// 初始化唤醒词模式
OPERATE_RET init_wakeup_mode(void)
{
OPERATE_RET rt = OPRT_OK;

// 初始化唤醒词模式
TUYA_CALL_ERR_RETURN(ai_mode_init(AI_CHAT_MODE_WAKEUP));

return rt;
}

模式切换

// 切换到唤醒词模式
void switch_to_wakeup_mode(void)
{
OPERATE_RET rt = ai_mode_switch(AI_CHAT_MODE_WAKEUP);
if (OPRT_OK == rt) {
PR_NOTICE("切换到唤醒词模式");
} else {
PR_ERR("切换模式失败: %d", rt);
}
}

查询模式状态

void query_wakeup_mode_state(void)
{
AI_MODE_STATE_E state = ai_mode_get_state();
PR_NOTICE("唤醒词模式当前状态: %s", ai_get_mode_state_str(state));
}