内置语音唤醒

更新时间:2025-06-03 02:15:35下载pdf

概述

Wukong AI 硬件开发框架在 T5 芯片/模组上,支持内置语音唤醒算法,用户可以通过特定的唤醒词来唤醒设备。目前默认支持三种唤醒词:“你好涂鸦”、“小智同学”、“Hey, Tuya”(英文)。

如果想定义个性化的唤醒词,目前需要通过涂鸦来定制。您可以联系您的涂鸦商务,提交需求,并沟通具体的项目细节和计划。

硬件设计要求

内置语音唤醒算法需要硬件的支持。设计音频回采电路,将喇叭播放的声音通过回采电路输入到回声消除算法(AEC),以保障唤醒词在喇叭播放声音的时候正常工作。

关于音频回采电路,您可以参考以下硬件方案:

软件设计要求

内置语音唤醒算法目前工作在涂鸦语音子系统中,尚未对外开放。您只需要设置 TY_AI_TOY_CFG_DEFAULT trigger_modeTY_AI_TRIGGER_MODE_WAKEUP 或者 TY_AI_TRIGGER_MODE_FREE 即自动支持,无需关心其原理以及具体如何使用。

// 交互类型定义
typedef enum {
    TY_AI_TRIGGER_MODE_HOLD,        // 长按触发模式
    TY_AI_TRIGGER_MODE_ONE_SHOT,    // 单次按键,回合制对话模式
    TY_AI_TRIGGER_MODE_WAKEUP,      // 关键词唤醒模式
    TY_AI_TRIGGER_MODE_FREE,        // 关键词唤醒和自由对话模式
} TY_AI_TRIGGER_MODE_E;

// 设置工作模式为关键词唤醒模式
#define TY_AI_TOY_CFG_DEFAULT { \
    .audio_trigger_pin = TUYA_GPIO_NUM_12, \
    .spk_en_pin = TUYA_GPIO_NUM_28, \
    .led_pin = TUYA_GPIO_NUM_1, \
    .trigger_mode = TY_AI_TRIGGER_MODE_WAKEUP, \
    .audio_cfg = TY_AI_AUDIO_CFG_DEF \
}

替换唤醒算法

唤醒算法目前在 CPU1 上运行,接收 VAD 算法判断有人声的数据之后进行唤醒词识别,并将识别成功的通过 IPC(核间通信) 发送给 CPU0,用于唤醒设备进行交互。

仅替换唤醒算法

如果您有语音处理的经验,想要使用自己的唤醒算法,可以重写 tuya_asr_init 函数,将自己的唤醒算法集成进来:

VOID_T tuya_asr_init(VOID_T)
{
    // IPC between cpu0 and cpu1
    tkl_asr_init(asr_cpu1_event, NULL);

    // Queue for the ASR thread, the ASR should fetch data from asr_msg_queue
    tkl_queue_create_init(&asr_msg_queue, sizeof(asr_msg_data_t), 50);

   // New thread for ASR, below are two example threads
#if TUYA_ENABLE_ASR_WANSON     
    tkl_thread_create_in_psram(&sg_hrd_hdl, "tuya_asr_xxx", 1024*4, 4, xxx_asr_task, NULL);
#else
    tkl_thread_create_in_psram(&sg_hrd_hdl, "tuya_asr_yyy", 1024*4, 4, yyy_asr_task, NULL);
#endif
}

替换语音前端算法和唤醒算法

如果您语音处理经验丰富,能够完全使用自己的语音前端处理的算法,可以自行进行 AEC、VAD 算法替换

然后修改 tuya_asr_enable 函数,自行在语音处理流程中添加唤醒算法。

BOOL_T tuya_asr_enable(VOID_T)
{
    return FALSE;
}

唤醒算法在工作的时候,需要对外输出唤醒事件,可以参考以下代码实现:

 int rs = xxx_ASR_Recog((short*)(mic_data + i * RAW_READ_SIZE), 480, (const char **)&text, &score);
 if (rs == 1) {
     bk_printf("xxx_ASR_Recog -> %s \n", text);
     if (os_strcmp(text, "你好涂鸦") == 0   || {      
        tuya_asr_event(1);    // Send wakeup event to cpu0
     } else {
        // Nothing
     }
  }

支持与帮助

在开发过程遇到问题,可以到 TuyaOS 开发者论坛 联网单品开发版块 发帖咨询。