跳转至

WIFI 大模型应用*

提示

说明

1. 概述*

WIFI 大模型应用,通过 UART 协议与 WIFI 模组配合工作。MCU 端负责语音算法(KWS、VAD),WIFI 模组端负责联网和大模型业务逻辑。所有事件(唤醒、VAD、音频数据)均通过 UART 协议上报 WIFI 模组,由 WIFI 模组下发指令控制播报、唤醒状态等。

2. 功能特性*

  • UART 协议通信:双向命令/响应协议,与 WIFI 模组交换事件和指令
  • 关键词唤醒桥接:KWS 事件转发到 WIFI 模组,WIFI 模组决定激活/休眠状态
  • VAD 桥接:VAD 状态实时上报 WIFI 模组
  • 延迟唤醒:唤醒词检测后可配置延迟后激活(默认 1000ms)
  • 超时管理:可配置的活动窗口(默认 10s),超时后自动回到监听态
  • UART 音频传输:支持 Opus/PCM 格式扬声器音频流,ACK/GPIO 流控
  • I2S 音频传输:可选 I2S 音频输入/输出
  • 麦克风上传:将麦克风数据上传到 WIFI 模组
  • 固件升级:通过 UART 的 OTA 固件升级
  • 出厂测试:音频环路、录音播放、GPIO 测试
  • 自激活过滤:防止 MCU 自播时误唤醒
  • LED 指示:VAD LED + 状态 LED

3. 目录结构*

app/smartbot_app/
├── smartbot_app.c            # 主程序(事件分派、状态机)
├── app.mk                     # 编译配置
├── app.name                   # Kconfig 选项
├── Kconfig                    # 子配置(超时、UART、LED 等)
├── led/                       # LED 指示灯
│   ├── led.c / led.h
├── timeout_manager/           # 超时管理器
│   ├── timeout_manager.c / .h
├── vad/                       # 语音活动检测
│   ├── vad.c / vad.h
└── uart_protocol/             # UART 协议栈
    ├── uart_protocol.c / .h
    ├── user_kws/              #   用户自定义关键词
    ├── mic_upload/            #   麦克风上传
    ├── spk/                   #   扬声器音频(UART / I2S)
    │   ├── uart_spk/          #     UART 扬声器
    │   │   ├── flow_ctrl/     #       流控制(ACK / GPIO)
    │   │   ├── spk_buf_manager/#     缓冲管理
    │   │   └── uart_spk_player/#     播放器(Opus/PCM 解析)
    │   └── i2s_spk/           #     I2S 扬声器
    ├── factory_test/          #   出厂测试
    ├── upgrade/               #   OTA 升级
    ├── data_query/            #   状态查询
    ├── voice_config/          #   语音配置
    ├── filter_self_act/       #   自激活过滤
    └── utility/               #   通用工具

4. 配置说明*

4.1 顶层配置*

配置项 类型 默认值 说明
CONFIG_APP_KWS_TIME_OUT int 10 KWS 唤醒超时(秒)
CONFIG_DELAY_AWAKE_DELAY_MS int 1000 唤醒后延迟激活时间(毫秒),≤0 则立即激活
CONFIG_ENABLE_REPORT_MCU_PLAY_STATUS bool y 向 WIFI 模组上报播放状态
CONFIG_ENABLE_RESET_VAD_ON_MIC_OPEN bool y MIC 开启时重置 VAD
CONFIG_ENABLE_MIC_AUTO_TOGGLE bool n 唤醒时自动开 MIC,超时时自动关 MIC
CONFIG_ENABLE_WAKE_SKIP_PLAY_AUDIO_CHECK bool n 跳过自播音频检测(允许自播时 KWS 仍工作)
CONFIG_DISABLE_WAKE_TIMEOUT bool n 调试用:禁用唤醒超时

4.2 UART 通信配置*

配置项 类型 默认值 说明
CONFIG_SMARTBOT_UART int 0 UART 接口编号(0-2)
CONFIG_SMARTBOT_UART_BAUDRATE int 1000000 UART 波特率
CONFIG_ENABLE_UART_TRANSMISSION bool y 启用 UART 音频传输

4.3 扬声器配置*

配置项 类型 默认值 说明
CONFIG_ENABLE_FORMAT_OPUS bool 扬声器音频格式:Opus(默认)
CONFIG_ENABLE_FORMAT_PCM bool 扬声器音频格式:PCM
CONFIG_ENABLE_ACK_FLOW_CTRL bool ACK 流控制(默认)
CONFIG_ENABLE_GPIO_FLOW_CTRL bool GPIO 流控制
CONFIG_SPK_FLOW_CTRL_PIN int 9 GPIO 流控制引脚
CONFIG_PLAY_MUTE_DELAY_TIME int 30 播放结束后延迟静音(秒)

4.4 麦克风上传配置*

配置项 类型 默认值 范围 说明
CONFIG_VAD_FALLBACK_FRAMES int 22 15-35 VAD 回落帧数
CONFIG_MIC_FALLBACK_DATA_CONTINUOUS_UPLOAD bool n 连续上传麦克风回落数据

4.5 I2S 传输配置*

配置项 类型 默认值 说明
CONFIG_ENABLE_I2S_TRANSFER bool n 启用 I2S 音频传输(与 UART 传输互斥)
CONFIG_CACHE_TIME_MS int 840 I2S 缓存时间(毫秒)
CONFIG_ENABLE_I2S_RX_M_TX_M bool RX 主 + TX 主模式(默认)
CONFIG_ENABLE_I2S_RX_S_TX_S bool RX 从 + TX 从模式

4.6 LED 配置*

配置项 类型 默认值 说明
CONFIG_ENABLE_LED bool y 启用 LED
CONFIG_APP_LED_VAD_PIN int 6 VAD LED GPIO
CONFIG_APP_LED_STATUS_PIN int 13 状态 LED GPIO
CONFIG_APP_LED_ON_LEVEL int 1 LED 点亮电平(0: 低有效, 1: 高有效)

5. 工作原理*

5.1 整体架构*

  ┌──────────────┐        UART 协议       ┌──────────────┐
  │   MCU (GX8006)│ ◄──────────────────► │  WIFI 模组     │
  │              │                        │              │
  │  KWS / VAD   │ ──事件上报──►          │  业务逻辑    │
  │  音频处理    │ ◄──指令下发──          │  播报控制    │
  │  麦克风上传  │ ──音频数据──►          │  状态管理    │
  └──────────────┘                        └──────────────┘

5.2 初始化流程*

  1. 读取唤醒源
  2. 启用 VPA 模式自动切换
  3. 初始化超时管理器(默认 10s),初始状态为 TIMEOUT_ACTIVE(允许唤醒)
  4. 初始化 UART 协议栈,建立与 WIFI 模组的通信
  5. 初始化 LED,点亮状态 LED

5.3 状态机*

        唤醒词检测 / WIFI 模组进入唤醒
LISTEN_STATE ────────────────────→ ACTIVE_STATE
     ↑                                  │
     │                                  │ 超时 / WIFI 模组退出唤醒
     └──────────────────────────────────┘
  • LISTEN_STATE:等待唤醒词或 WIFI 模组指令
  • ACTIVE_STATE:已唤醒,VAD 激活,音频处理运行中

超时管理器的语义(注意命名):

超时状态 实际含义
TIMEOUT_ACTIVE 空闲/超时已过期,允许再次唤醒
TIMEOUT_INACTIVE 系统处于活动窗口,尚未超时

5.4 延迟唤醒*

唤醒词检测后不立即激活,注册一个单次定时器:

  1. 收到 KWS 唤醒事件
  2. 等待 CONFIG_DELAY_AWAKE_DELAY_MS(默认 1000ms)
  3. 定时器触发 → 设置 ACTIVE_STATE → 初始化 VAD

5.5 事件处理*

事件 处理逻辑
EVENT_AUDIO_IN_RECORD_DONE 转发到 UART 协议,WIFI 模组可获取原始音频
EVENT_VAD_STATUS 更新 SPL,根据播放状态调整 VAD 灵敏度,转发到 WIFI 模组
EVENT_WAKEUP_ENTER_RX WIFI 模组命令进入唤醒:重置超时,设置 ACTIVE_STATE
EVENT_WAKEUP_EXIT_RX WIFI 模组命令退出唤醒:设置 LISTEN_STATE
KWS 唤醒事件 延迟后设置 ACTIVE_STATE,转发到 WIFI 模组

5.6 主循环*

app_task_loop() 中调用 uart_protocal_loop() 处理 UART 收发。

6. 使用方法*

6.1 编译*

配置文件位于 configs/lightning/,根据传输方式选择:

配置文件 说明
lightning_vad_028_kws_021_ack_flowctrl.config UART 传输 + ACK 流控
lightning_vad_028_kws_021_io_flowctrl.config UART 传输 + GPIO 流控
lightning_vad_028_kws_021_i2s.config I2S 传输
cp configs/lightning/lightning_vad_028_kws_021_ack_flowctrl.config .config
make defconfig
make clean; make

6.2 烧录运行*

cd tools/bootx/
./flash_nor.sh 0 -r 1000000

6.3 WIFI 模组配合*

该 App 需要 WIFI 模组通过 UART 协议配合工作。MCU 端配置完成后,WIFI 模组端需实现对应的 UART 协议栈。

7. 预期输出*

  1. 上电后状态 LED 点亮,等待 WIFI 模组通信就绪
  2. 说出唤醒词 → MCU 上报 KWS 事件 → WIFI 模组决定是否激活
  3. WIFI 模组下发播报指令 → MCU 通过 UART/I2S 播放音频
  4. 超时无活动 → MCU 自动回到监听态,上报超时事件

8. 注意事项*

  1. 依赖 WIFI 模组:该 App 不自带业务逻辑,必须配合 WIFI 模组使用,UART 协议栈需 WIFI 模组端对应实现
  2. UART 初始化失败则中止:如果 UART 协议栈初始化失败,app_init() 会直接返回错误
  3. UART 与 I2S 互斥CONFIG_ENABLE_UART_TRANSMISSIONCONFIG_ENABLE_I2S_TRANSFER 不能同时启用
  4. 超时管理器命名TIMEOUT_INACTIVE 表示活动窗口内(未超时),TIMEOUT_ACTIVE 表示超时已过期,命名与直觉相反
  5. 播报阻止超时:WIFI 模组驱动的播报进行中时,超时计时器会自动重置,防止播报过程中误超时
  6. VAD 可独立唤醒:当唤醒开关关闭但 VAD 开关打开时,VAD 检测可直接触发系统唤醒
  7. 延迟唤醒:默认 1 秒延迟可在 Kconfig 中调整,设为 0 则立即激活
  8. 休眠/唤醒未实现:当前 SDK 不支持休眠功能,app_suspend()app_resume() 保持空实现即可