四博 AI 智能音箱 S3 三网上网双屏异显技术方案

下面是一套偏 工程落地 / 技术评审 / 客户方案书 风格的"四博 AI 智能音箱 S3 + 4G + 蓝牙上网 + 双屏异显方案"。方案重点围绕李博士讲解的几个核心卖点展开:超过 5 米远场拾音、唤醒词打断、实时打断、高噪环境稳定响应、可改唤醒词、蓝牙 / Wi‑Fi / 4G 多方式上网、单屏 / 双屏 / 异显、基于 ESP32‑S3 便于二次开发和接入客户系统

本方案结合了你提供的《2026 年四博智联模组选型手册-乐鑫系》《深圳四博智联 AI 硬件选型表 2026》和《四博智联 AI 开发宝典》。其中,模组选型手册把 ESP32‑S3 系列定位为 Wi‑Fi + BLE、音视频 / AI 市场方向;AI 硬件选型表中也给出了 ESP32‑S3 + VB6824、ESP32‑S3 + 7014 + 4G 等高端 AI 方案;开发宝典则覆盖了 DOIT_AI、AI‑S3、双目双屏、4G / Wi‑Fi 切换、BluFi 配网、AT+MCP、实时打断固件和 VB6824 自定义唤醒词等关键开发路径。

四博 AI 智能音箱 S3 三网上网双屏异显技术方案

1. 方案定位

本方案定义为一款 高端可二次开发 AI 智能音箱主板 / 成品方案,面向以下应用:

复制代码
1. 家用 AI 智能音箱
2. 厨房高噪环境语音助手
3. 车载 / 户外 4G AI 音箱
4. 展厅导览 / 酒店客房 / 商业中控
5. AI 桌面陪伴音箱
6. AI 双屏眼睛音箱 / 双目情绪音箱
7. 客户自有系统接入终端

推荐核心配置:

复制代码
主控:ESP32-S3R8 / ESPS3-32-N16R8
存储:8MB PSRAM + 16MB Flash
语音前端:VB6824
联网:Wi-Fi + BLE / 蓝牙 PAN / 4G
蓝牙:7014 蓝牙 PAN / 蓝牙音频协处理器,可选
显示:1 个 LCD / 2 个 LCD / 双屏异显
音频:麦克风 + AEC 回采 + I2S 功放 + 喇叭
系统:ESP-IDF + DOIT_AI + 小智协议 / 私有后端
扩展:AT+MCP / WebSocket / MQTT / HTTP / UART / GPIO

ESP32‑S3 适合做 AI 音箱主控,是因为其具备双核 240MHz、较丰富 GPIO、Wi‑Fi + BLE、LCD 接口和较好的开发生态。四博模组选型手册中,ESPS3‑32 / ESPS3‑32E 属于 ESP32‑S3 系列,面向音视频 / AI 市场,并兼容 ESP32‑S3‑WROOM 系列模组。


2. 整机技术架构

复制代码
┌─────────────────────────────────────────────────────────────┐
│                 四博 AI 智能音箱 S3 4G 版本                  │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ┌──────────────────────┐       UART / I2C / GPIO           │
│  │ VB6824 语音前端       │◄─────────────────────────────┐    │
│  │ - 远场拾音             │                              │    │
│  │ - 离线唤醒             │                              │    │
│  │ - AEC 回声消除         │                              │    │
│  │ - 高噪降噪             │                              │    │
│  │ - 唤醒词打断           │                              │    │
│  │ - 实时打断             │                              │    │
│  │ - 自定义唤醒词         │                              │    │
│  └─────────┬────────────┘                              │    │
│            │                                           │    │
│        MIC / 回采音频                                   │    │
│                                                        ▼    │
│  ┌────────────────────────────────────────────────────────┐  │
│  │ ESP32-S3R8 + 16M Flash + 8M PSRAM                     │  │
│  │ - FreeRTOS 多任务调度                                 │  │
│  │ - Wi-Fi STA / SoftAP / BluFi                          │  │
│  │ - 4G PPP / ECM / RNDIS 管理                           │  │
│  │ - 7014 蓝牙 PAN / 蓝牙音箱协同                        │  │
│  │ - WebSocket AI 对话                                   │  │
│  │ - OTA / NVS / 设备激活                                │  │
│  │ - 单屏 / 双屏 / 异显 UI                               │  │
│  │ - MCP 工具调用 / 客户系统接入                         │  │
│  └───────────────┬───────────────┬──────────────────────┘  │
│                  │               │                         │
│       ┌──────────▼───────┐ ┌─────▼─────────┐               │
│       │ 4G 通信模组       │ │ 7014 蓝牙模组  │               │
│       │ UART PPP / USB   │ │ PAN / A2DP    │               │
│       └──────────┬───────┘ └─────┬─────────┘               │
│                  │               │                         │
│              SIM / 4G 天线       蓝牙天线                   │
│                                                             │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────────┐  │
│  │ LCD Screen A │  │ LCD Screen B │  │ I2S AMP + Speaker │  │
│  │ 主屏 / 左眼   │  │ 副屏 / 右眼   │  │ TTS / 音乐 / 提示音 │  │
│  └──────────────┘  └──────────────┘  └──────────────────┘  │
│                                                             │
└─────────────────────────────────────────────────────────────┘

云端 / 私有化后端:
┌─────────────────────────────────────────────────────────────┐
│ OTA │ WebSocket Gateway │ ASR │ LLM │ TTS │ MCP │ 客户业务系统 │
└─────────────────────────────────────────────────────────────┘

四博 AI 选型资料中明确提到,ESP32‑C2 / C3 / S3 加 VB6824 的语音方案适合对接各家自己的平台,VB6824 负责音频编解码、AEC、语音唤醒、改唤醒词等功能,让主控芯片专注通信及 UI;这正适合本方案中"客户系统接入 + 屏幕 UI + 多网上网"的产品定位。


3. 核心能力拆解

3.1 远距离拾音与高噪环境响应

本方案的远场语音链路建议如下:

复制代码
用户语音
  ↓
麦克风 / 双麦阵列
  ↓
VB6824 远场拾音 + 降噪 + AEC
  ↓
唤醒词识别 / 打断检测
  ↓
ESP32-S3 停止本地播放并切入 Listening
  ↓
Wi-Fi / 4G / 蓝牙 PAN 上传音频
  ↓
ASR + LLM + TTS
  ↓
本地喇叭播放

VB6824 在开发宝典中被描述为 AI 离线语音识别芯片,具备更远距离唤醒、更低误唤醒率、更强抗噪音能力、更快响应识别时间和免联网离线识别能力,因此它适合承担"超过 5 米也能打断和对话""空气炸锅等高噪环境也能响应"的语音前端职责。

工程设计建议:

复制代码
1. 麦克风与喇叭出音孔保持物理隔离。
2. 麦克风孔避免直接朝向风道、油烟机、空气炸锅出风口。
3. 功放喇叭必须给 VB6824 或主控保留 AEC 回采链路。
4. 4G 天线、Wi-Fi 天线远离麦克风走线和前级放大电路。
5. MIC 供电增加 LC 滤波,功放和 4G 电源分区。
6. TTS 播报时不要关闭回采,否则实时打断能力会下降。
7. 蓝牙音乐播放时启用 ducking,唤醒瞬间降低背景音乐音量。

3.2 唤醒词打断、实时打断与改唤醒词

本方案支持三类打断:

复制代码
1. 唤醒词打断:
   AI 正在说话时,用户再次说唤醒词,设备立即中断 TTS 并进入聆听。

2. 实时打断:
   AI 播放过程中,前端通过 AEC 区分喇叭声音和用户声音,触发 barge-in。

3. 按键打断:
   用户单击或长按物理按键,强制停止播放并进入录音 / 聆听。

开发宝典中"编译实时打断固件"说明了 USE_DEVICE_AECUSE_SERVER_AEC 的配置思路,其中服务端不支持 AEC 时应选择设备端 AEC;VB6824 自定义唤醒词章节也说明,升级语音芯片固件后可以支持选定唤醒词,并且在 AI 说话过程中随时打断。

建议状态机:

复制代码
IDLE
  ↓ 唤醒词 / 按键
LISTENING
  ↓ 语音结束
THINKING
  ↓ TTS 首包
SPEAKING
  ├── 唤醒词打断 → STOP_TTS → LISTENING
  ├── 实时打断   → STOP_TTS → LISTENING
  ├── 按键打断   → STOP_TTS → LISTENING
  └── 播放结束   → IDLE

3.3 蓝牙、Wi‑Fi、4G 三种上网方式

本方案定义三种联网方式:

上网方式 实现路径 典型用途
Wi‑Fi 上网 ESP32‑S3 STA / SoftAP / BluFi 家庭、办公室、展厅、OTA
4G 上网 外接 4G 模组,UART PPP 或 USB ECM/RNDIS 户外、移动、商用、无 Wi‑Fi 场景
蓝牙上网 7014 蓝牙 PAN,通过手机共享网络 手机伴侣、临时网络、低成本户外场景

四博 AI 选型资料中,7014 蓝牙 PAN AI 手机伴侣方案的特点是成本低、可脱离 APP、可通过手机网络通信以解决户外网络问题;同时也有 ESP32‑S3 + 7014 + 摄像头 + 4G 的高端方案,可多模态、可玩游戏、可当蓝牙音箱。

联网优先级建议:

复制代码
1. Wi‑Fi 优先:
   成本低、带宽稳定、适合 OTA 和长时间在线。

2. 4G 备份:
   Wi‑Fi 失败、移动场景或客户要求独立联网时启用。

3. 蓝牙 PAN 兜底:
   无 SIM、无 Wi‑Fi 或临时户外场景,通过手机网络接入。

开发宝典中 AI‑C5 部分给出了 Wi‑Fi 模式和 4G 模式切换方式:4G 模式下重新开机,在等待网络时双击 boot 键可切换到 Wi‑Fi 配网;Wi‑Fi 配网模式下双击 boot 键可切换到 4G 模式并自动连接。这个交互逻辑可迁移到 S3 4G 音箱版本。


3.4 一个屏幕、两个屏幕与异显

显示方案分三档:

复制代码
基础版:1 个屏幕
  - 显示时间、天气、联网状态、对话状态、音量、电量。

双屏版:2 个屏幕镜像显示
  - 两块屏显示同样的 AI 表情或状态动画。

双屏异显版:2 个屏幕显示不同内容
  - 左屏:AI 表情、眼睛动画、角色状态。
  - 右屏:文字、歌词、天气、客户业务数据、设备状态。

开发宝典中 AI‑S3 双目方案包含两块屏幕、一块主板、麦克风、喇叭等器件,并说明主板可采用 2.4G Wi‑Fi 上网,同时也支持 4G 模组连接网络;多模态章节还介绍了基于 ESP32‑S3、两块 1.28 英寸双目屏与摄像头融合交互的开发板,硬件与软件全开源,可用于二次开发或量产制造。

异显推荐实现方式:

复制代码
方案 A:同 SPI 总线 + 双 CS
  LCD_A_CS = GPIO10
  LCD_B_CS = GPIO11
  优点:省 IO
  缺点:两个屏刷新互斥

方案 B:双 SPI 总线
  LCD_A 使用 SPI2
  LCD_B 使用 SPI3
  优点:刷新效率高
  缺点:占 IO 较多

方案 C:一个 SPI 屏 + 一个 RGB / I8080 屏
  适合主屏较大、副屏较小的高端版本

4. 推荐硬件方案

4.1 主控与模组

复制代码
主控芯片:ESP32-S3R8
模组型号:ESPS3-32-N16R8 / ESPS3-32E-N16R8
CPU:Xtensa 双核 240MHz
Flash:16MB
PSRAM:8MB
无线:2.4GHz Wi‑Fi + BLE
显示:SPI / RGB / I8080 LCD 扩展

ESPS3‑32 有 N4、N8、N8R2、N16R2、N16R8 等子型号,芯片覆盖 ESP32‑S3、S3R2、S3R8,18 × 25.5mm 通用模组,兼容 ESP32‑S3‑WROOM‑1 系列;ESPS3‑32E 为 18 × 19.2mm,兼容 ESP32‑S3‑WROOM‑1U 系列。

4.2 语音前端

复制代码
语音芯片:VB6824
功能:
  - 离线唤醒
  - 远场拾音
  - AEC
  - 降噪
  - 唤醒词打断
  - 实时打断
  - 自定义唤醒词
  - 语音到 UART / MCP 控制

4.3 4G 模组

复制代码
推荐:Cat.1 / Cat.4 模组
接口:
  - UART PPP:稳定、接线简单
  - USB ECM/RNDIS:带宽高,软件复杂度更高
必要控制脚:
  - PWRKEY
  - RESET
  - STATUS
  - UART_TX/RX 或 USB D+/D-
  - SIM_DET,可选

4.4 蓝牙 PAN / 蓝牙音箱

复制代码
基础蓝牙:
  ESP32-S3 BLE,用于 BluFi 配网。

蓝牙上网:
  7014 蓝牙 PAN,通过手机网络接入互联网。

蓝牙音箱:
  7014 / 独立蓝牙音频芯片,通过 I2S 或模拟音频接入功放。

4.5 屏幕

复制代码
单屏版:
  1.28 / 1.54 / 2.0 寸 LCD

双屏版:
  0.71 / 1.28 寸 LCD × 2

高端版:
  2.0 / 4.75 寸主屏 + 小副屏

AI 硬件选型表中,AI‑S3 成品板使用 ESP32‑S3R8,支持麦克风、喇叭、电池、1.54 寸屏幕,可选小智、豆包、ChatGPT 等主流大模型,并面向高端 AI 市场、AI 数字相框、高端 AI 玩偶和 AI 智能音响。


5. 软件系统架构

建议使用 ESP‑IDF + DOIT_AI 工程,软件拆分如下:

复制代码
main/
  app_main.c

components/
  board/
    board_sibo_s3_4g_speaker.c
    board_config.h

  audio/
    audio_focus.c
    tts_player.c
    barge_in.c
    vb6824_frontend.c

  network/
    wifi_manager.c
    lte_modem.c
    bt_pan_manager.c
    network_policy.c

  display/
    display_manager.c
    display_single.c
    display_dual.c
    display_heterogeneous.c

  ai/
    websocket_client.c
    ai_session.c
    mcp_uart_bridge.c
    customer_bridge.c

  ota/
    ota_manager.c

  factory/
    factory_test.c

FreeRTOS 任务建议:

任务 优先级 职责
audio_frontend_task VB6824 唤醒、打断、状态事件
ai_session_task WebSocket 对话、ASR/LLM/TTS 状态
network_policy_task 中高 Wi‑Fi / 4G / 蓝牙 PAN 自动切换
mcp_uart_task 中高 AT+MCP 注册、语义控制帧解析
display_task 单屏 / 双屏 / 异显刷新
key_task 单击、双击、三击、长按
ota_task 固件 OTA、资源 OTA
factory_task 产测、老化、SN 写入

6. 编译与开发环境

开发宝典说明,小智 AI 硬件设备开源代码可在 VSCode 中安装 ESP‑IDF 扩展和编译工具进行编译烧录;AI‑S3 标准开发板、双目、多模态和 AI‑C5 都在开发宝典中给出了源码、硬件资料和编译路径。

推荐基础流程:

复制代码
git clone https://github.com/SmartArduino/DOIT_AI.git
cd DOIT_AI

idf.py set-target esp32s3
idf.py menuconfig
idf.py build
idf.py -p /dev/ttyUSB0 flash monitor

建议在 menuconfig 中新增板型:

复制代码
Xiaozhi Assistant
  Board Type:
    Sibo AI Speaker S3 4G DualScreen

Network Configuration Mode:
  BluFi / SoftAP

Audio:
  VB6824
  USE_DEVICE_AEC = y
  USE_SERVER_AEC = n

Display:
  Single Screen / Dual Mirror / Dual Heterogeneous

Network:
  Wi-Fi Enable
  LTE Enable
  Bluetooth PAN Enable

7. 关键代码示例

下面代码是工程框架级示例,实际 GPIO、屏幕驱动、4G 模组 AT 指令、7014 指令需要按最终 PCB 和模组手册调整。


7.1 板级配置 board_config.h

复制代码
#pragma once

#include "driver/gpio.h"
#include "driver/uart.h"
#include "driver/spi_master.h"

/*
 * 四博 AI 智能音箱 S3 + 4G + 蓝牙上网 + 双屏异显
 */

#define BOARD_NAME                      "SIBO_AI_SPEAKER_S3_4G_DUAL"

/* ---------- 主控 ---------- */
#define SOC_NAME                        "ESP32-S3R8"
#define FLASH_SIZE_MB                   16
#define PSRAM_SIZE_MB                   8

/* ---------- VB6824 / AI MCP UART ---------- */
#define AI_UART                         UART_NUM_1
#define AI_UART_BAUD                    115200
#define AI_UART_TX_GPIO                 GPIO_NUM_17
#define AI_UART_RX_GPIO                 GPIO_NUM_18
#define AI_RESET_GPIO                   GPIO_NUM_21

/* ---------- 4G Modem UART ---------- */
#define LTE_UART                        UART_NUM_2
#define LTE_UART_BAUD                   115200
#define LTE_TX_GPIO                     GPIO_NUM_39
#define LTE_RX_GPIO                     GPIO_NUM_40
#define LTE_PWRKEY_GPIO                 GPIO_NUM_41
#define LTE_RESET_GPIO                  GPIO_NUM_42
#define LTE_STATUS_GPIO                 GPIO_NUM_2

/* ---------- 7014 Bluetooth PAN / Audio ---------- */
#define BT7014_UART                     UART_NUM_0
#define BT7014_TX_GPIO                  GPIO_NUM_43
#define BT7014_RX_GPIO                  GPIO_NUM_44
#define BT7014_EN_GPIO                  GPIO_NUM_45

/* ---------- Audio ---------- */
#define AMP_EN_GPIO                     GPIO_NUM_5
#define I2S_BCLK_GPIO                   GPIO_NUM_6
#define I2S_LRCK_GPIO                   GPIO_NUM_7
#define I2S_DOUT_GPIO                   GPIO_NUM_8

/* ---------- Display A ---------- */
#define LCD_A_SPI_HOST                  SPI2_HOST
#define LCD_A_CS_GPIO                   GPIO_NUM_10
#define LCD_A_DC_GPIO                   GPIO_NUM_11
#define LCD_A_RST_GPIO                  GPIO_NUM_12
#define LCD_A_BL_GPIO                   GPIO_NUM_13

/* ---------- Display B ---------- */
#define LCD_B_SPI_HOST                  SPI2_HOST
#define LCD_B_CS_GPIO                   GPIO_NUM_14
#define LCD_B_DC_GPIO                   GPIO_NUM_15
#define LCD_B_RST_GPIO                  GPIO_NUM_16
#define LCD_B_BL_GPIO                   GPIO_NUM_4

/* ---------- Keys ---------- */
#define KEY_BOOT_GPIO                   GPIO_NUM_0
#define KEY_VOL_UP_GPIO                 GPIO_NUM_35
#define KEY_VOL_DOWN_GPIO               GPIO_NUM_36

/* ---------- RGB LED ---------- */
#define RGB_LED_GPIO                    GPIO_NUM_38

/* ---------- Network Policy ---------- */
#define WIFI_CONNECT_TIMEOUT_MS         10000
#define LTE_CONNECT_TIMEOUT_MS          25000
#define BTPAN_CONNECT_TIMEOUT_MS        15000
#define WS_HEARTBEAT_TIMEOUT_MS         15000
#define NETWORK_FAILOVER_THRESHOLD      3

7.2 Kconfig:启用实时打断与双屏异显

开发宝典中实时打断固件通过 USE_DEVICE_AEC / USE_SERVER_AEC 区分设备端和服务端 AEC,本方案建议默认启用设备端 AEC。

复制代码
menu "Sibo AI Speaker S3 4G"

config BOARD_SIBO_AI_SPEAKER_S3_4G
    bool "Sibo AI Speaker S3 4G"
    default y
    help
        ESP32-S3R8 + VB6824 + 4G + Bluetooth PAN + dual display.

config USE_DEVICE_AEC
    bool "Use device side AEC for wake-word barge-in"
    depends on BOARD_SIBO_AI_SPEAKER_S3_4G
    default y
    help
        Use VB6824 / device-side AEC to support real-time interruption
        while TTS or Bluetooth music is playing.

config USE_SERVER_AEC
    bool "Use server side AEC"
    depends on BOARD_SIBO_AI_SPEAKER_S3_4G
    default n
    help
        Enable only when customer backend supports server-side AEC.

choice DISPLAY_MODE
    prompt "Display Mode"
    default DISPLAY_DUAL_HETEROGENEOUS

config DISPLAY_SINGLE
    bool "Single screen"

config DISPLAY_DUAL_MIRROR
    bool "Dual screen mirror"

config DISPLAY_DUAL_HETEROGENEOUS
    bool "Dual screen heterogeneous display"

endchoice

config LTE_ENABLE
    bool "Enable 4G LTE network"
    default y

config BT_PAN_ENABLE
    bool "Enable Bluetooth PAN network"
    default y

endmenu

7.3 三网上网策略代码

复制代码
#include <stdbool.h>
#include "esp_log.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

#define TAG "NET_POLICY"

typedef enum {
    NET_LINK_NONE = 0,
    NET_LINK_WIFI,
    NET_LINK_LTE,
    NET_LINK_BT_PAN,
} net_link_t;

typedef struct {
    bool up;
    int rssi;
    int latency_ms;
    int fail_count;
    int priority;
    int power_cost;
    int traffic_cost;
} net_metric_t;

static net_link_t s_current_link = NET_LINK_NONE;
static net_link_t s_pending_link = NET_LINK_NONE;

static net_metric_t s_wifi = {
    .up = false,
    .rssi = -90,
    .latency_ms = 999,
    .priority = 3,
    .power_cost = 1,
    .traffic_cost = 0,
};

static net_metric_t s_lte = {
    .up = false,
    .rssi = -100,
    .latency_ms = 999,
    .priority = 2,
    .power_cost = 4,
    .traffic_cost = 4,
};

static net_metric_t s_btpan = {
    .up = false,
    .rssi = -90,
    .latency_ms = 999,
    .priority = 1,
    .power_cost = 2,
    .traffic_cost = 1,
};

static bool ai_session_is_busy(void)
{
    /*
     * TODO:
     * 返回 true 表示正在录音、TTS 播放或音频流传输。
     * 对话中不强制切网,避免音频中断。
     */
    return false;
}

static void wifi_update_metric(net_metric_t *m)
{
    /*
     * TODO:
     * 1. esp_wifi_sta_get_ap_info 获取 RSSI。
     * 2. ping AI gateway 获取 latency。
     * 3. WebSocket 心跳失败则 fail_count++。
     */
    m->up = true;
    m->rssi = -55;
    m->latency_ms = 35;
}

static void lte_update_metric(net_metric_t *m)
{
    /*
     * TODO:
     * 1. AT+CSQ 获取信号。
     * 2. AT+CREG? / AT+CEREG? 判断注册状态。
     * 3. 判断 PPP netif 是否 up。
     * 4. ping AI gateway。
     */
    m->up = true;
    m->rssi = -72;
    m->latency_ms = 95;
}

static void btpan_update_metric(net_metric_t *m)
{
    /*
     * TODO:
     * 1. 查询 7014 PAN 是否已连接手机。
     * 2. 查询手机网络共享状态。
     * 3. ping AI gateway。
     */
    m->up = false;
    m->rssi = -80;
    m->latency_ms = 120;
}

static int calc_score(const net_metric_t *m)
{
    if (!m->up) {
        return -100000;
    }

    int score = 0;
    score += m->priority * 1000;
    score += m->rssi;
    score -= m->latency_ms / 5;
    score -= m->fail_count * 500;
    score -= m->power_cost * 30;
    score -= m->traffic_cost * 50;

    return score;
}

static net_link_t choose_best_link(void)
{
    int wifi_score = calc_score(&s_wifi);
    int lte_score  = calc_score(&s_lte);
    int bt_score   = calc_score(&s_btpan);

    ESP_LOGI(TAG, "score wifi=%d lte=%d btpan=%d",
             wifi_score, lte_score, bt_score);

    if (wifi_score >= lte_score && wifi_score >= bt_score) {
        return NET_LINK_WIFI;
    }

    if (lte_score >= wifi_score && lte_score >= bt_score) {
        return NET_LINK_LTE;
    }

    if (bt_score >= wifi_score && bt_score >= lte_score) {
        return NET_LINK_BT_PAN;
    }

    return NET_LINK_NONE;
}

static void set_default_link(net_link_t link)
{
    switch (link) {
    case NET_LINK_WIFI:
        ESP_LOGI(TAG, "switch to Wi-Fi");
        /*
         * TODO:
         * esp_netif_set_default_netif(wifi_netif);
         * websocket_reconnect();
         */
        break;

    case NET_LINK_LTE:
        ESP_LOGI(TAG, "switch to 4G LTE");
        /*
         * TODO:
         * esp_netif_set_default_netif(ppp_netif);
         * websocket_reconnect();
         */
        break;

    case NET_LINK_BT_PAN:
        ESP_LOGI(TAG, "switch to Bluetooth PAN");
        /*
         * TODO:
         * 通过 7014 建立 PAN 数据链路。
         * websocket_reconnect();
         */
        break;

    default:
        ESP_LOGW(TAG, "no network available, enter provisioning");
        /*
         * TODO:
         * start_blufi_or_softap_provisioning();
         */
        break;
    }

    s_current_link = link;
}

void network_policy_task(void *arg)
{
    while (1) {
        wifi_update_metric(&s_wifi);
        lte_update_metric(&s_lte);
        btpan_update_metric(&s_btpan);

        net_link_t best = choose_best_link();

        if (best != s_current_link) {
            if (ai_session_is_busy()) {
                s_pending_link = best;
                ESP_LOGI(TAG, "AI busy, pending link=%d", best);
            } else {
                set_default_link(best);
                s_pending_link = NET_LINK_NONE;
            }
        }

        if (!ai_session_is_busy() && s_pending_link != NET_LINK_NONE) {
            set_default_link(s_pending_link);
            s_pending_link = NET_LINK_NONE;
        }

        vTaskDelay(pdMS_TO_TICKS(10000));
    }
}

7.4 4G 模组 AT + PPP 初始化框架

复制代码
#include <string.h>
#include "esp_log.h"
#include "esp_timer.h"
#include "driver/uart.h"
#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "board_config.h"

#define TAG "LTE"

static void modem_send_cmd(const char *cmd)
{
    uart_write_bytes(LTE_UART, cmd, strlen(cmd));
    uart_write_bytes(LTE_UART, "\r\n", 2);
    ESP_LOGI(TAG, "MCU -> LTE: %s", cmd);
}

static bool modem_wait_keyword(const char *keyword, int timeout_ms)
{
    uint8_t buf[256];
    int total = 0;
    int64_t start_ms = esp_timer_get_time() / 1000;

    while ((esp_timer_get_time() / 1000 - start_ms) < timeout_ms) {
        int n = uart_read_bytes(
            LTE_UART,
            buf + total,
            sizeof(buf) - 1 - total,
            pdMS_TO_TICKS(100)
        );

        if (n > 0) {
            total += n;
            buf[total] = 0;

            if (strstr((char *)buf, keyword)) {
                ESP_LOGI(TAG, "LTE <- %s", (char *)buf);
                return true;
            }

            if (total > sizeof(buf) - 32) {
                total = 0;
            }
        }
    }

    ESP_LOGW(TAG, "timeout waiting: %s", keyword);
    return false;
}

static bool modem_at_ok(const char *cmd, int timeout_ms)
{
    modem_send_cmd(cmd);
    return modem_wait_keyword("OK", timeout_ms);
}

static void modem_power_on(void)
{
    gpio_set_direction(LTE_PWRKEY_GPIO, GPIO_MODE_OUTPUT);
    gpio_set_direction(LTE_RESET_GPIO, GPIO_MODE_OUTPUT);

    gpio_set_level(LTE_RESET_GPIO, 1);
    vTaskDelay(pdMS_TO_TICKS(100));

    gpio_set_level(LTE_PWRKEY_GPIO, 1);
    vTaskDelay(pdMS_TO_TICKS(1200));
    gpio_set_level(LTE_PWRKEY_GPIO, 0);

    vTaskDelay(pdMS_TO_TICKS(5000));
}

bool lte_modem_start_ppp(const char *apn)
{
    char cmd[128];

    modem_power_on();

    for (int i = 0; i < 5; i++) {
        if (modem_at_ok("AT", 1000)) {
            break;
        }
        vTaskDelay(pdMS_TO_TICKS(1000));
    }

    modem_at_ok("ATE0", 1000);
    modem_at_ok("AT+CPIN?", 1000);
    modem_at_ok("AT+CSQ", 1000);
    modem_at_ok("AT+CREG?", 1000);
    modem_at_ok("AT+CEREG?", 1000);
    modem_at_ok("AT+CGATT=1", 5000);

    snprintf(cmd, sizeof(cmd), "AT+CGDCONT=1,\"IP\",\"%s\"", apn);
    modem_at_ok(cmd, 1000);

    /*
     * 不同 4G 模组拨号命令可能不同。
     * 常见命令:ATD*99***1# 或 ATD*99#
     */
    modem_send_cmd("ATD*99***1#");

    if (!modem_wait_keyword("CONNECT", 10000)) {
        ESP_LOGE(TAG, "PPP dial failed");
        return false;
    }

    /*
     * TODO:
     * 收到 CONNECT 后,将 UART 交给 esp_modem / esp_netif PPP。
     */
    ESP_LOGI(TAG, "PPP data mode entered");

    return true;
}

7.5 AT+MCP 串口桥接代码

开发宝典中的 AT+MCP 协议非常适合"接入客户自己的系统":AI 模组通过 UART 接收 AT 指令,AT+ADDMCP 可将自然语言映射为 MCU 可执行的二进制帧;AI 模组主动上报开机、配网、联网、监听、说话、升级、激活等状态。协议默认 UART 为 115200、8N1,帧格式为 55 AA LEN CMD DATA AA 55

复制代码
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include "esp_log.h"
#include "driver/uart.h"
#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "board_config.h"

#define TAG "MCP"

#define FRAME_H1        0x55
#define FRAME_H2        0xAA
#define FRAME_T1        0xAA
#define FRAME_T2        0x55

#define CMD_STATUS      0xFF
#define CMD_RECOVER     0xFC

#define CMD_RGB         0xF1
#define CMD_VOLUME      0xF2
#define CMD_ALARM       0xF3
#define CMD_BT_NET      0xF4
#define CMD_NET_MODE    0xF5
#define CMD_SCREEN_MODE 0xF6
#define CMD_CUSTOMER    0xF7

typedef enum {
    AI_STARTING     = 0x01,
    AI_CONFIGURING  = 0x02,
    AI_IDLE         = 0x03,
    AI_CONNECTING   = 0x04,
    AI_LISTENING    = 0x05,
    AI_SPEAKING     = 0x06,
    AI_UPGRADING    = 0x07,
    AI_ACTIVATING   = 0x08,
} ai_status_t;

static void ai_reset_module(void)
{
    ESP_LOGW(TAG, "reset AI module");

    gpio_set_direction(AI_RESET_GPIO, GPIO_MODE_OUTPUT);
    gpio_set_level(AI_RESET_GPIO, 0);
    vTaskDelay(pdMS_TO_TICKS(300));
    gpio_set_level(AI_RESET_GPIO, 1);
    vTaskDelay(pdMS_TO_TICKS(1500));
}

static void mcp_send_line(const char *line)
{
    uart_write_bytes(AI_UART, line, strlen(line));
    uart_write_bytes(AI_UART, "\r\n", 2);
    ESP_LOGI(TAG, "MCU -> AI: %s", line);
}

static void ui_on_status(ai_status_t status)
{
    switch (status) {
    case AI_STARTING:
        ESP_LOGI(TAG, "AI starting");
        break;
    case AI_CONFIGURING:
        ESP_LOGI(TAG, "AI configuring");
        break;
    case AI_IDLE:
        ESP_LOGI(TAG, "AI idle");
        break;
    case AI_CONNECTING:
        ESP_LOGI(TAG, "AI connecting");
        break;
    case AI_LISTENING:
        ESP_LOGI(TAG, "AI listening");
        break;
    case AI_SPEAKING:
        ESP_LOGI(TAG, "AI speaking");
        break;
    case AI_UPGRADING:
        ESP_LOGI(TAG, "AI upgrading");
        break;
    case AI_ACTIVATING:
        ESP_LOGI(TAG, "AI activating");
        break;
    default:
        ESP_LOGW(TAG, "unknown status 0x%02X", status);
        break;
    }
}

static void speaker_set_rgb(uint8_t r, uint8_t g, uint8_t b)
{
    ESP_LOGI(TAG, "set rgb: %u %u %u", r, g, b);
    /*
     * TODO:
     * WS2812 用 RMT;
     * 三路 LED 用 LEDC PWM。
     */
}

static void speaker_set_volume(uint8_t volume)
{
    if (volume > 100) {
        volume = 100;
    }

    ESP_LOGI(TAG, "set volume: %u", volume);

    /*
     * TODO:
     * 1. 设置播放器音量。
     * 2. 设置功放或 Codec 音量。
     * 3. 保存到 NVS。
     */
}

static void speaker_set_network_mode(uint8_t mode)
{
    ESP_LOGI(TAG, "switch network mode: %u", mode);

    /*
     * mode:
     * 0x01 Wi-Fi
     * 0x02 4G
     * 0x03 Bluetooth PAN
     */
}

static void display_set_mode(uint8_t mode)
{
    ESP_LOGI(TAG, "set display mode: %u", mode);

    /*
     * mode:
     * 0x01 单屏
     * 0x02 双屏镜像
     * 0x03 双屏异显
     */
}

static void customer_system_command(uint8_t scene_id, uint8_t action)
{
    ESP_LOGI(TAG, "customer cmd: scene=%u action=%u", scene_id, action);

    /*
     * TODO:
     * 这里接客户自己的系统。
     * 例如:
     * 1. MQTT 发布到客户云平台。
     * 2. HTTP 调用客户 API。
     * 3. UART 控制外部 MCU。
     * 4. Modbus / RS485 控制设备。
     */
}

static void mcp_register_tools(void)
{
    mcp_send_line("AT");
    mcp_send_line("AT+WIFICFG=0");
    mcp_send_line("AT+CONNECT");

    /*
     * 用户说:"把氛围灯调成红色"
     * AI -> MCU: 55 AA 04 F1 FF 00 00 AA 55
     */
    mcp_send_line(
        "AT+ADDMCP=1,set_lamp_color,设置音箱氛围灯颜色,F1,3,R,G,B"
    );

    /*
     * 用户说:"音量调到 60"
     */
    mcp_send_line(
        "AT+ADDMCP=1,set_speaker_volume,设置音箱音量,F2,1,volume"
    );

    /*
     * 用户说:"十分钟后提醒我关火"
     */
    mcp_send_line(
        "AT+ADDMCP=1,set_alarm,设置提醒闹钟,F3,2,minute,action"
    );

    /*
     * 用户说:"打开蓝牙上网"
     */
    mcp_send_line(
        "AT+ADDMCP=0,open_bluetooth_pan,打开蓝牙上网,2,F4,01"
    );

    /*
     * 用户说:"切换到 4G 网络"
     */
    mcp_send_line(
        "AT+ADDMCP=1,set_network_mode,切换联网方式,F5,1,mode"
    );

    /*
     * 用户说:"切换到双屏异显"
     */
    mcp_send_line(
        "AT+ADDMCP=1,set_screen_mode,设置屏幕显示模式,F6,1,mode"
    );

    /*
     * 用户说:"打开会议室灯"或"启动客户系统的一号场景"
     */
    mcp_send_line(
        "AT+ADDMCP=1,customer_scene_control,控制客户业务系统,F7,2,scene_id,action"
    );
}

static void mcp_handle_frame(uint8_t cmd, const uint8_t *data, uint8_t len)
{
    if (cmd == CMD_RECOVER) {
        /*
         * 开发宝典要求:
         * 收到 55 AA 01 FC AA 55 后,MCU 重启 AI 模组并重新发送 MCP 映射。
         */
        ai_reset_module();
        mcp_register_tools();
        return;
    }

    if (cmd == CMD_STATUS && len >= 1) {
        ui_on_status((ai_status_t)data[0]);
        return;
    }

    switch (cmd) {
    case CMD_RGB:
        if (len >= 3) {
            speaker_set_rgb(data[0], data[1], data[2]);
        }
        break;

    case CMD_VOLUME:
        if (len >= 1) {
            speaker_set_volume(data[0]);
        }
        break;

    case CMD_ALARM:
        if (len >= 2) {
            ESP_LOGI(TAG, "alarm minute=%u action=%u", data[0], data[1]);
        }
        break;

    case CMD_BT_NET:
        ESP_LOGI(TAG, "open bluetooth pan");
        break;

    case CMD_NET_MODE:
        if (len >= 1) {
            speaker_set_network_mode(data[0]);
        }
        break;

    case CMD_SCREEN_MODE:
        if (len >= 1) {
            display_set_mode(data[0]);
        }
        break;

    case CMD_CUSTOMER:
        if (len >= 2) {
            customer_system_command(data[0], data[1]);
        }
        break;

    default:
        ESP_LOGW(TAG, "unhandled cmd=0x%02X len=%u", cmd, len);
        break;
    }
}

static void mcp_rx_task(void *arg)
{
    uint8_t frame[160];
    uint8_t pos = 0;
    int expected = -1;

    while (1) {
        uint8_t b = 0;
        int n = uart_read_bytes(AI_UART, &b, 1, pdMS_TO_TICKS(100));

        if (n <= 0) {
            continue;
        }

        if (pos == 0 && b != FRAME_H1) {
            continue;
        }

        if (pos == 1 && b != FRAME_H2) {
            pos = 0;
            expected = -1;
            continue;
        }

        frame[pos++] = b;

        if (pos == 3) {
            uint8_t len = frame[2];

            if (len == 0 || len > 150) {
                pos = 0;
                expected = -1;
                continue;
            }

            expected = 2 + 1 + len + 2;
        }

        if (expected > 0 && pos >= expected) {
            uint8_t len = frame[2];

            if (frame[3 + len] == FRAME_T1 &&
                frame[4 + len] == FRAME_T2) {

                uint8_t cmd = frame[3];
                const uint8_t *data = &frame[4];
                uint8_t data_len = len - 1;

                mcp_handle_frame(cmd, data, data_len);
            } else {
                ESP_LOGW(TAG, "bad frame tail");
            }

            pos = 0;
            expected = -1;
        }

        if (pos >= sizeof(frame)) {
            pos = 0;
            expected = -1;
        }
    }
}

void mcp_uart_bridge_start(void)
{
    uart_config_t cfg = {
        .baud_rate = AI_UART_BAUD,
        .data_bits = UART_DATA_8_BITS,
        .parity    = UART_PARITY_DISABLE,
        .stop_bits = UART_STOP_BITS_1,
        .flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
        .source_clk = UART_SCLK_DEFAULT,
    };

    uart_driver_install(AI_UART, 2048, 2048, 0, NULL, 0);
    uart_param_config(AI_UART, &cfg);
    uart_set_pin(
        AI_UART,
        AI_UART_TX_GPIO,
        AI_UART_RX_GPIO,
        UART_PIN_NO_CHANGE,
        UART_PIN_NO_CHANGE
    );

    ai_reset_module();
    mcp_register_tools();

    xTaskCreate(mcp_rx_task, "mcp_rx", 4096, NULL, 10, NULL);
}

7.6 双屏异显管理代码

复制代码
#include <stdbool.h>
#include "esp_log.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

#define TAG "DISPLAY"

typedef enum {
    DISPLAY_MODE_SINGLE = 1,
    DISPLAY_MODE_DUAL_MIRROR,
    DISPLAY_MODE_DUAL_HETEROGENEOUS,
} display_mode_t;

typedef enum {
    AI_UI_IDLE = 0,
    AI_UI_LISTENING,
    AI_UI_THINKING,
    AI_UI_SPEAKING,
    AI_UI_NETWORK_ERROR,
    AI_UI_OTA,
} ai_ui_state_t;

static display_mode_t s_display_mode = DISPLAY_MODE_DUAL_HETEROGENEOUS;
static ai_ui_state_t s_ui_state = AI_UI_IDLE;

static void lcd_a_draw_face(ai_ui_state_t state)
{
    /*
     * TODO:
     * 左屏显示 AI 眼睛 / 表情 / 角色动画。
     */
    ESP_LOGI(TAG, "LCD A draw face state=%d", state);
}

static void lcd_b_draw_info(ai_ui_state_t state)
{
    /*
     * TODO:
     * 右屏显示文字、联网状态、时间、天气、客户业务数据。
     */
    ESP_LOGI(TAG, "LCD B draw info state=%d", state);
}

static void lcd_b_draw_face(ai_ui_state_t state)
{
    /*
     * 镜像显示时,右屏也显示表情。
     */
    ESP_LOGI(TAG, "LCD B mirror face state=%d", state);
}

void display_set_mode_runtime(display_mode_t mode)
{
    s_display_mode = mode;
}

void display_set_ai_state(ai_ui_state_t state)
{
    s_ui_state = state;
}

static void display_refresh_once(void)
{
    switch (s_display_mode) {
    case DISPLAY_MODE_SINGLE:
        lcd_a_draw_face(s_ui_state);
        break;

    case DISPLAY_MODE_DUAL_MIRROR:
        lcd_a_draw_face(s_ui_state);
        lcd_b_draw_face(s_ui_state);
        break;

    case DISPLAY_MODE_DUAL_HETEROGENEOUS:
        lcd_a_draw_face(s_ui_state);
        lcd_b_draw_info(s_ui_state);
        break;

    default:
        lcd_a_draw_face(s_ui_state);
        break;
    }
}

void display_task(void *arg)
{
    while (1) {
        display_refresh_once();

        /*
         * 表情动画可 20~30 FPS;
         * 信息屏 5~10 FPS 即可。
         * 这里示例统一 20 FPS。
         */
        vTaskDelay(pdMS_TO_TICKS(50));
    }
}

7.7 音频焦点与实时打断代码

复制代码
#include <stdbool.h>
#include "esp_log.h"

#define TAG "AUDIO_FOCUS"

typedef enum {
    AUDIO_SRC_NONE = 0,
    AUDIO_SRC_SYSTEM_ALERT,
    AUDIO_SRC_WAKEUP_LISTENING,
    AUDIO_SRC_AI_TTS,
    AUDIO_SRC_ALARM,
    AUDIO_SRC_BT_MUSIC,
    AUDIO_SRC_UI_TONE,
} audio_source_t;

static audio_source_t s_current_audio = AUDIO_SRC_NONE;

static int audio_priority(audio_source_t src)
{
    switch (src) {
    case AUDIO_SRC_SYSTEM_ALERT:     return 100;
    case AUDIO_SRC_WAKEUP_LISTENING: return 90;
    case AUDIO_SRC_AI_TTS:           return 80;
    case AUDIO_SRC_ALARM:            return 70;
    case AUDIO_SRC_BT_MUSIC:         return 50;
    case AUDIO_SRC_UI_TONE:          return 30;
    default:                         return 0;
    }
}

static void stop_tts_player(void)
{
    ESP_LOGI(TAG, "stop TTS");
    /*
     * TODO:
     * 停止 I2S 播放 / 清空 TTS ringbuffer。
     */
}

static void duck_bt_music(void)
{
    ESP_LOGI(TAG, "duck Bluetooth music");
    /*
     * TODO:
     * 将蓝牙音乐音量降低 12~18 dB。
     */
}

static void pause_bt_music(void)
{
    ESP_LOGI(TAG, "pause Bluetooth music");
    /*
     * TODO:
     * 通过 7014 或蓝牙音频芯片暂停 A2DP。
     */
}

bool audio_request_focus(audio_source_t src)
{
    if (audio_priority(src) < audio_priority(s_current_audio)) {
        return false;
    }

    if (s_current_audio == AUDIO_SRC_AI_TTS &&
        src == AUDIO_SRC_WAKEUP_LISTENING) {
        stop_tts_player();
    }

    if (s_current_audio == AUDIO_SRC_BT_MUSIC &&
        src == AUDIO_SRC_WAKEUP_LISTENING) {
        duck_bt_music();
    }

    s_current_audio = src;
    return true;
}

void on_wakeup_word_detected(void)
{
    ESP_LOGI(TAG, "wake word detected");

    audio_request_focus(AUDIO_SRC_WAKEUP_LISTENING);

    /*
     * TODO:
     * 1. 更新 UI 到 Listening。
     * 2. 停止 TTS 或降低蓝牙音乐。
     * 3. 打开上行音频流。
     * 4. 通知 WebSocket 开始新一轮会话。
     */
}

void on_realtime_barge_in_detected(void)
{
    ESP_LOGI(TAG, "real-time barge-in detected");

    audio_request_focus(AUDIO_SRC_WAKEUP_LISTENING);

    /*
     * 实时打断与唤醒词打断处理类似。
     */
}

void on_ai_tts_start(void)
{
    audio_request_focus(AUDIO_SRC_AI_TTS);
}

void on_ai_tts_finish(void)
{
    s_current_audio = AUDIO_SRC_NONE;
}

7.8 客户系统接入示例:MQTT / HTTP / UART

"基于 ESP32‑S3 方便二次开发,便于接入客户自己的系统"可以落到三种接口:

复制代码
1. 云端接口:
   MQTT / HTTP / WebSocket,接客户云平台。

2. 本地接口:
   UART / RS485 / CAN / GPIO,接客户 MCU 或控制板。

3. MCP 工具:
   通过 AI 语义解析,把"打开会议室灯"转成客户系统指令。

示例:MCP 指令转 MQTT 主题。

复制代码
#include <stdio.h>
#include "esp_log.h"

#define TAG "CUSTOMER"

typedef struct {
    uint8_t scene_id;
    uint8_t action;
} customer_cmd_t;

static void mqtt_publish_customer_cmd(const customer_cmd_t *cmd)
{
    char topic[64];
    char payload[128];

    snprintf(topic, sizeof(topic),
             "sibo/speaker/%s/customer/scene",
             "device_001");

    snprintf(payload, sizeof(payload),
             "{\"scene_id\":%u,\"action\":%u}",
             cmd->scene_id,
             cmd->action);

    ESP_LOGI(TAG, "MQTT topic=%s payload=%s", topic, payload);

    /*
     * TODO:
     * esp_mqtt_client_publish(client, topic, payload, 0, 1, 0);
     */
}

void customer_handle_mcp(uint8_t scene_id, uint8_t action)
{
    customer_cmd_t cmd = {
        .scene_id = scene_id,
        .action = action,
    };

    mqtt_publish_customer_cmd(&cmd);
}

8. 配网与使用交互

开发宝典中设备配网支持 SoftAP 和四博小助手 BluFi;BluFi 方式可以通过微信小程序使用蓝牙给芯片联网,减少传统浏览器配网流程。

建议按键定义:

复制代码
单击:
  切换对讲状态 / 停止 TTS / 开始聆听

双击:
  4G / Wi‑Fi 模式切换,或进入 VB6824 唤醒词升级模式

三击:
  进入配网模式

长按:
  开机 / 关机

开发宝典中 S3 双目使用说明也给出类似按键逻辑:默认唤醒词为"你好小智";单击切换小智对讲状态;双击用于 VB6824 更改唤醒词;三击进入配网模式;长按用于开关机。


9. 自定义唤醒词流程

VB6824 自定义唤醒词建议作为售后 / 客户定制流程:

复制代码
1. 设备进入 VB6824 升级模式。
2. 设备播报升级模式和设备码。
3. 在同一局域网内访问唤醒词升级页面。
4. 输入设备码和授权码。
5. 选择默认唤醒词或客户定制唤醒词。
6. 在线升级 VB6824 语音固件。
7. 升级完成后重启设备。
8. 验证唤醒词和 AI 播报中打断能力。

开发宝典中说明,自定义唤醒词需要先让 VB6824 进入升级模式,并且设备和电脑需要在同一局域网;完成升级后即可支持选定唤醒词以及 AI 说话过程中的随时打断。


10. 后端服务与私有化部署

AI 对话后端建议支持两种:

复制代码
1. 标准小智服务:
   快速接入,适合样机和标准产品。

2. 客户私有化服务:
   接客户自有 LLM、知识库、TTS、业务系统。

开发宝典说明,设备默认可连接小智官方服务,也可以运行开源后端服务,让设备连接到自己的后端;后端包含 OTA 接口和 WebSocket 接口,并可配置 LLM、TTS、人设等参数。

后端结构建议:

复制代码
Nginx / Caddy
  ├── HTTPS OTA
  ├── WSS WebSocket
  ├── Device Auth
  ├── ASR
  ├── LLM
  ├── TTS
  ├── MCP Tool Server
  └── Customer API Gateway

配置示例:

复制代码
server:
  ip: 0.0.0.0
  websocket_port: 8000
  ota_port: 8002

device:
  ota_url: "https://ai.customer.com/xiaozhi/ota/"
  websocket_url: "wss://ai.customer.com/xiaozhi/v1/"

selected_module:
  VAD: SileroVAD
  ASR: FunASR
  LLM: CustomerLLM
  TTS: CustomerTTS
  Memory: nomem
  Intent: function_call

persona:
  name: "四博AI智能音箱"
  prompt: |
    你是客户业务系统的语音入口。
    回答要简洁准确。
    支持设备控制、业务查询、知识库问答和多轮对话。

11. OTA 与分区设计

建议 16MB Flash 起步:

复制代码
# Name,     Type, SubType, Offset,   Size
nvs,        data, nvs,     0x9000,   0x6000
otadata,    data, ota,     0xF000,   0x2000
phy_init,   data, phy,     0x11000,  0x1000
factory,    app,  factory, 0x20000,  0x300000
ota_0,      app,  ota_0,   0x320000, 0x300000
ota_1,      app,  ota_1,   0x620000, 0x300000
storage,    data, fat,     0x920000, 0x500000
coredump,   data, coredump,0xE20000, 0x100000

OTA 策略:

复制代码
1. S3 主控固件 OTA:
   双分区升级,失败回滚。

2. UI 资源 OTA:
   表情、眼睛动画、提示音、屏幕素材放 storage 分区。

3. VB6824 语音固件:
   单独走语音芯片升级流程,避免与主控 OTA 混淆。

4. 4G 网络 OTA:
   默认只允许小补丁或紧急升级。
   大版本升级建议要求用户切换 Wi‑Fi。

5. 客户灰度:
   按 project_id / batch_id / device_id 分批升级。

12. 产测方案

12.1 工厂测试项目

复制代码
主控:
  - ESP32-S3 Flash / PSRAM 检测
  - MAC / SN / Batch ID 写入
  - NVS 读写
  - 看门狗复位

语音:
  - VB6824 UART 通信
  - MIC 电平
  - 喇叭播放
  - AEC 回采
  - 5 米唤醒
  - 高噪唤醒
  - 播报中实时打断
  - 唤醒词更换验证

网络:
  - Wi‑Fi 扫描
  - Wi‑Fi 连接
  - 4G SIM 检测
  - 4G CSQ
  - 4G 注册
  - PPP 拨号
  - 蓝牙广播
  - 蓝牙 PAN 上网
  - WebSocket 连接

显示:
  - 单屏显示
  - 双屏镜像
  - 双屏异显
  - 背光 PWM
  - 屏幕老化

客户接口:
  - MCP 指令
  - MQTT / HTTP
  - UART / RS485
  - GPIO 控制

12.2 高噪测试建议

复制代码
1. 安静环境:
   1m / 3m / 5m 唤醒率测试。

2. 空气炸锅环境:
   空气炸锅距离设备 0.5m~1m,用户距离 3m / 5m 唤醒。

3. 油烟机环境:
   高档风量,用户正前方和侧向唤醒。

4. 电视背景音:
   电视音量 60%,测试误唤醒与有效唤醒。

5. TTS 打断:
   设备播报时,用户 3m / 5m 说唤醒词打断。

6. 蓝牙音乐打断:
   蓝牙音乐播放时,用户唤醒,验证 ducking 和进入聆听。

13. 推荐版本划分

13.1 标准 S3 AI 音箱版

复制代码
ESP32-S3R8 + 16M Flash
VB6824
Wi‑Fi + BLE BluFi
单屏 LCD
麦克风 + 3W 喇叭
小智 / 豆包 / ChatGPT / 私有后端
AT+MCP 二次开发

适合:室内音箱、桌面助手、AI 玩具、智能家居控制。


13.2 S3 + 4G 三网上网版

复制代码
ESP32-S3R8 + 16M Flash
VB6824
Wi‑Fi
4G Cat.1 / Cat.4
BLE 配网
7014 蓝牙 PAN,可选
单屏 / 双屏
电池供电
实时打断
自定义唤醒词

适合:户外音箱、展厅导览、车载语音终端、移动 AI 设备。


13.3 S3 + 7014 + 4G + 双屏异显高端版

复制代码
ESP32-S3R8 + 16M Flash + 8M PSRAM
VB6824
4G
7014 蓝牙 PAN / 蓝牙音箱
双 LCD 异显
RGB 氛围灯
3W~5W 喇叭
双麦 / 高信噪比麦克风
Wi‑Fi / 蓝牙 / 4G 三网上网
MCP + 客户系统 API
私有化 AI 后端

适合:高端 B 端定制、品牌 AI 音箱、AI 双目陪伴设备、客户专用语音入口。


14. 方案总结

四博 AI 智能音箱建议采用 ESP32‑S3R8 + 16M Flash + VB6824 + 4G + 7014 + 双屏 LCD 的平台化架构:ESP32‑S3 负责联网、屏幕、WebSocket、OTA、二次开发和客户系统接入;VB6824 负责远场拾音、离线唤醒、AEC、高噪降噪、唤醒词打断、实时打断和自定义唤醒词;4G 模组解决无 Wi‑Fi 和移动场景联网;7014 负责蓝牙 PAN 上网和蓝牙音箱能力;双屏系统支持单屏、双屏镜像和双屏异显。通过 DOIT_AI、四博小助手 BluFi、AT+MCP 和私有化小智后端,可形成一套可量产、可定制、可接入客户系统的高端 AI 智能音箱方案。

相关推荐
qq_411262421 小时前
四博皮克斯苹果 AI 台灯 / AI 智能音箱 S3 视觉机械臂方案
人工智能·智能音箱
了不起的云计算V1 小时前
从DeepSeek V4适配看国产算力的三个拐点
数据库·人工智能
Cosolar2 小时前
大模型应用开发工程师 · 学习路线(完整技术栈版)
人工智能·面试·架构
MadPrinter2 小时前
Ollama 本地部署 Google Gemma 4 26B MoE 旗舰模型
人工智能
憨波个2 小时前
【说话人日志】多说话人数据仿真 Property-Aware Simulation
人工智能·深度学习·音频·语音识别
code_pgf2 小时前
MNN Whisper 实时 ASR 工程实现
人工智能·whisper·mnn
AC赳赳老秦2 小时前
OpenClaw实战案例:用Agent实现每日工作日报自动生成+发送
人工智能·python·职场和发展·eclipse·github·deepseek·openclaw
敢敢のwings2 小时前
NVIDIA Thor学习之 |在Jetson AGX Thor上部署OpenClaw并基于Ollama的边缘AI协作实战(二)
人工智能·学习
OFIRM碳基硅基2 小时前
OFIRM-AGI-ASI官方标志图01版,发布
人工智能·agi·ofirm颠覆性