下面是一套偏 工程落地 / 技术评审 / 客户方案书 风格的"四博 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_AEC 与 USE_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 智能音箱方案。