四博 AI 智能音箱三模联网技术方案

四博 AI 智能音箱三模联网技术方案

1. 方案定位

本方案面向 高端 AI 智能音箱 / AI 桌面助手 / 商用导览终端 / 智能家居中控 / 车载或户外 AI 音箱 ,采用 ESP32-S3 架构 + VB6824 离线语音前端 + Wi-Fi / 蓝牙 / 4G 三模联网 的软硬件组合。

核心目标是:

实现 5 米级远距离唤醒与实时打断;在空气炸锅、厨房、客厅电视、展厅背景声等高噪环境下保持可用唤醒率;支持 Wi-Fi、蓝牙、4G 三种联网路径自动切换;支持本地或云端大模型、知识库、声音克隆、MCP 工具扩展、OTA、二次开发和量产部署。

从四博资料看,AI-S3 标准开发板已是全开源 AI-Speaker 形态,带 240×240 分辨率 1.3 寸屏,支持"四博小助手"小程序、声音克隆、知识库、自建大模型和 MCP;AI-S3 相关硬件也采用 ESP32S3R8 + 16M Flash + VB6824,定位高端 AI 市场并支持二次开发。


2. 总体架构

推荐架构如下:

复制代码
┌────────────────────────────────────────────────────────────┐
│                    四博 AI 智能音箱                         │
├────────────────────────────────────────────────────────────┤
│                                                            │
│  ┌──────────────┐      UART / I2C / GPIO      ┌──────────┐ │
│  │  VB6824       │◄──────────────────────────►│ ESP32-S3 │ │
│  │ 离线语音前端 │                            │ 主控 SoC │ │
│  │ 唤醒 / AEC    │                            │ UI/网络/AI│ │
│  │ 降噪 / 打断   │                            │ 业务调度 │ │
│  └──────┬───────┘                            └────┬─────┘ │
│         │                                         │        │
│   MIC 阵列 / 单麦                                │        │
│   扬声器回采 AEC                                 │        │
│                                                   │        │
│  ┌────────────────────────────────────────────────┼─────┐  │
│  │                  通信子系统                    │     │  │
│  │                                                │     │  │
│  │  Wi-Fi STA / SoftAP / BluFi                    │     │  │
│  │  4G 模组:UART PPP / USB ECM / RNDIS           │     │  │
│  │  蓝牙:BLE 配网 / 7014 蓝牙 PAN / 蓝牙音箱     │     │  │
│  └──────────────────────────────────────────────────────┘  │
│                                                            │
│  ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌─────────┐ │
│  │ 1.3/2.0屏  │ │ 功放+喇叭   │ │ 电池/PMIC   │ │ 按键/LED │ │
│  └────────────┘ └────────────┘ └────────────┘ └─────────┘ │
│                                                            │
└────────────────────────────────────────────────────────────┘

云端 / 私有化后端:
┌────────────────────────────────────────────────────────────┐
│ OTA Server │ WebSocket Gateway │ ASR │ LLM │ TTS │ MCP 工具 │
└────────────────────────────────────────────────────────────┘

这里建议将 ESP32-S3 作为主控,负责 UI、联网、音频流调度、WebSocket、OTA、MCP 工具桥接;将 VB6824 作为语音前端,负责离线唤醒、降噪、AEC、实时打断与唤醒词能力。四博资料中明确提到 ESP32-C2 / C3 / S3 搭配 VB6824 的语音方案中,VB6824 负责音频编解码、AEC、语音唤醒、改唤醒词等功能,从而让主控芯片专注通信与 UI。


3. 硬件方案

3.1 主控:ESP32-S3 / ESPS3-32 系列

推荐选型:

模块 建议规格 作用
主控 SoC ESP32-S3R8 / S3R8 + 16M Flash AI 业务、UI、网络、音频流
四博模组 ESPS3-32 / ESPS3-32E 量产主控模组
PSRAM 8MB 优先 UI、WebSocket buffer、音频 buffer
Flash 16MB 优先 OTA 分区、模型配置、素材、日志

乐鑫系模组选型手册中,ESP32-S3 系列被归类到 Wi-Fi + BLE ESP32-S3 系列,面向音视频 / AI 市场,ESPS3-32、ESPS3-32E 兼容官方模组形态。

需要注意:ESP32-S3 本体是 Wi-Fi + BLE ,不是经典蓝牙 BR/EDR 蓝牙音频芯片。如果产品要求"蓝牙音箱模式"或"蓝牙 PAN 通过手机上网",建议外接 7014 或蓝牙音频 / PAN 协处理器。四博 AI 硬件选型中已经有 ESP32-S3 + 7014 + 4G 高端方案,并说明可以多模态、可以当蓝牙音箱;也有 7014 蓝牙 PAN AI 手机伴侣方案,适合通过手机网络解决户外联网问题。

3.2 语音前端:VB6824

VB6824 建议作为独立语音前端,承担:

  1. 离线唤醒词识别;

  2. 远距离拾音增强;

  3. AEC 回声消除;

  4. 噪声抑制;

  5. AI 播报过程中的实时打断;

  6. 自定义唤醒词升级;

  7. 通过 UART 向主控上报状态或语义控制帧。

开发宝典中对 VB6824 的描述是:软件采用语音识别算法与语音降噪算法,支持更远距离唤醒、更低误唤醒率、更强抗噪能力、更快响应识别时间,并可进行免联网的纯离线识别。

实时打断方面,开发宝典给出了"编译实时打断固件"的说明:可在工程中启用 USE_DEVICE_AECUSE_SERVER_AEC,其中 USE_SERVER_AEC 需要服务器支持,不支持时选择 USE_DEVICE_AEC 后重新编译即可。

3.3 三模联网设计

联网模式 实现方式 典型场景 优先级建议
Wi-Fi ESP32-S3 STA,SoftAP / BluFi 配网 家庭、办公室、展厅 1
4G 外接 4G 模组,UART PPP 或 USB ECM/RNDIS 户外、移动、无 Wi-Fi 场景 2
蓝牙 BLE 配网;7014 蓝牙 PAN 或蓝牙音频协处理器 手机伴侣、蓝牙音箱、临时联网 3

四博开发宝典中,AI-C5 开发板已经给出 2.4G / 5G Wi-Fi、4G 模组、喇叭、咪头、电池和屏幕等硬件参数,可作为 4G 联网子系统设计参考;AI-S3 双目资料中也提到主板可采用 2.4G Wi-Fi 上网,同时支持 4G 模组连接网络。

联网策略建议:

复制代码
开机:
  1. 读取 NVS 中保存的网络策略
  2. 检查 Wi-Fi 是否可用
  3. Wi-Fi 失败超过 N 次,切换 4G
  4. 4G 未插卡 / 注册失败 / 弱信号,切换蓝牙 PAN
  5. 三路均失败,进入 SoftAP / BluFi 配网

运行中:
  1. 每 10s 检测当前链路质量
  2. Wi-Fi RSSI < -75 dBm 且丢包升高,预连接 4G
  3. WebSocket 心跳失败 3 次,切换备份链路
  4. 音频对话中不立即切换,待 TTS 或会话结束后迁移

开发宝典中还给出了 4G 模式切换 Wi-Fi 模式的交互方式:在 4G 模式下重新开机,屏幕显示等待网络时双击 boot 键,即可切换到 Wi-Fi 配网模式。


4. 软件架构

建议固件采用 ESP-IDF + FreeRTOS 多任务设计。

复制代码
app_main
 ├── board_init()
 ├── audio_frontend_task()
 ├── ai_mcp_bridge_task()
 ├── network_manager_task()
 ├── websocket_client_task()
 ├── ui_task()
 ├── ota_task()
 ├── power_manager_task()
 └── factory_test_task()

4.1 任务划分

任务 优先级 说明
audio_frontend_task 接收 VB6824 唤醒、监听、打断事件
ai_mcp_bridge_task 解析 VB6824 / AI 模组 UART 帧
websocket_client_task 中高 与小智 / 私有后端保持音频和控制通道
network_manager_task Wi-Fi / 4G / 蓝牙 PAN 链路管理
ui_task 屏幕、LED、音量、配网提示
ota_task 固件升级、资源升级、回滚
power_manager_task 电池、电源键、低功耗

4.2 状态机

VB6824 / AI 模组状态可映射为整机状态:

复制代码
STARTING
  ↓
WIFI_CONFIGURING / BLUFI_CONFIGURING
  ↓
CONNECTING
  ↓
IDLE
  ↓ 唤醒词 / 按键
LISTENING
  ↓ ASR / LLM / TTS
SPEAKING
  ↓ 唤醒词打断
LISTENING
  ↓
IDLE

开发宝典中的 AT+MCP 协议列出了状态上报帧,例如开机、配网、空闲、联网中、监听、说话、升级、激活等状态均会通过串口上报,便于 MCU 做 UI 联动和业务状态同步。


5. AI 对话链路

5.1 在线对话链路

复制代码
用户语音
  ↓
MIC / VB6824
  ↓
离线唤醒 + AEC + 降噪 + 打断检测
  ↓
ESP32-S3 音频采集 / 编码
  ↓
Wi-Fi / 4G / 蓝牙 PAN
  ↓
WebSocket Gateway
  ↓
ASR
  ↓
LLM
  ↓
TTS
  ↓
ESP32-S3 播放
  ↓
功放 / 喇叭

5.2 私有化后端

开发宝典给出了自建小智后端服务思路:设备默认连接小智官方服务,也可以运行开源后端,让设备连接自己的后端;后端包括 OTA 接口和 WebSocket 接口,并可配置 ASR、LLM、TTS、人设等参数。

后端推荐结构:

复制代码
Nginx / Caddy
 ├── HTTPS OTA
 ├── WSS WebSocket
 ├── Auth / Device Token
 ├── xiaozhi-server
 │    ├── ASR: FunASR / SenseVoice / 云 ASR
 │    ├── LLM: 小智 / 豆包 / ChatGPT / DeepSeek / 私有模型
 │    ├── TTS: EdgeTTS / 豆包 TTS / 火山 / 自建 TTS
 │    └── MCP: 天气 / 音乐 / 智能家居 / 业务系统
 └── Admin Panel

示例后端配置片段:

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

device:
  ota_url: "https://your-domain.com/xiaozhi/ota/"
  websocket_url: "wss://your-domain.com/xiaozhi/v1/"

selected_module:
  VAD: SileroVAD
  ASR: FunASR
  LLM: DoubaoLLM
  TTS: DoubaoTTS
  Memory: nomem
  Intent: function_call

persona:
  name: "四博AI音箱"
  prompt: |
    你是一个面向家庭和商业场景的AI语音助手。
    回答要简洁、准确,支持智能家居控制、音乐、天气、知识库问答。

6. 开发环境与编译

开发宝典建议在 VSCode 中安装 ESP-IDF 扩展和编译工具,AI-S3 标准开发板章节中说明使用 ESP-IDF 5.4.1;QA 中也提到 AI-S3 开源工程推荐 espidf >= 5.4.0,C5 需要 espidf >= 5.5.0

基础编译流程:

复制代码
# 1. 获取四博 DOIT_AI 源码
git clone https://github.com/SmartArduino/DOIT_AI.git
cd DOIT_AI

# 2. 设置目标芯片
idf.py set-target esp32s3

# 3. 进入 menuconfig
idf.py menuconfig

# 4. 选择 Board Type
# 选择四博 AI-Speaker / ESP32-S3 / VB6824 对应板型
# 具体名称以 main/boards 目录为准

# 5. 编译
idf.py build

# 6. 烧录并监视
idf.py -p /dev/ttyUSB0 flash monitor

如果使用四博小助手 BluFi 配网或素材替换分支,开发宝典中给出的 S3 示例命令是:

复制代码
git checkout mp_psd

rm -rf build sdkconfig dependencies.lock

idf.py set-target esp32-s3

idf.py @main/boards/doit-esp32s3-eye-6824-v2/build_blufi.cfg build

该命令来自 AI-S3 相关工程说明,实际智能音箱项目可按自己的板型复制一份 board config,并修改屏幕、按键、功放、4G 模组和 GPIO 定义。


7. AT+MCP 串口桥接设计

开发宝典中的 AT+MCP 方案非常适合智能音箱二次开发:通过 UART 让 AI 模组把"人话"映射成 MCU 可执行的二进制控制帧。协议默认 UART 参数为 115200, 8N1AT+ADDMCP 可注册 MCP 能力;模块状态也会主动通过串口上报。

帧格式:

复制代码
AI 模组 -> MCU:

0x55 0xAA LEN CMD DATA... 0xAA 0x55

LEN = CMD + DATA 的总长度
CMD = 命令字
DATA = 参数

典型状态帧:

复制代码
开机中      55 AA 02 FF 01 AA 55
配网模式    55 AA 02 FF 02 AA 55
空闲状态    55 AA 02 FF 03 AA 55
联网中      55 AA 02 FF 04 AA 55
监听状态    55 AA 02 FF 05 AA 55
说话状态    55 AA 02 FF 06 AA 55
升级中      55 AA 02 FF 07 AA 55
激活设备    55 AA 02 FF 08 AA 55

8. ESP-IDF 代码示例:MCP UART 桥接

下面是一份可落地改造的 ai_mcp_bridge.c 示例,用于:

  1. 初始化 UART;

  2. 发送 AT 指令;

  3. 注册 MCP 能力;

  4. 解析 AI 模组返回的二进制帧;

  5. 处理状态、RGB 灯、音量、配网等事件。

    #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"

    #define TAG "AI_MCP"

    #define AI_UART UART_NUM_1
    #define AI_UART_TX_PIN GPIO_NUM_17
    #define AI_UART_RX_PIN GPIO_NUM_18
    #define AI_UART_BAUD 115200

    #define AI_FRAME_HEAD1 0x55
    #define AI_FRAME_HEAD2 0xAA
    #define AI_FRAME_TAIL1 0xAA
    #define AI_FRAME_TAIL2 0x55

    #define CMD_STATUS 0xFF
    #define CMD_RECOVER 0xFC

    #define CMD_SET_RGB 0xF1
    #define CMD_SET_VOLUME 0xF2
    #define CMD_PLAY_MUSIC 0xF3
    #define CMD_SET_TIMER 0xF4
    #define CMD_ENTER_PAIRING 0xEE

    typedef enum {
    AI_STATUS_STARTING = 0x01,
    AI_STATUS_CONFIGURING = 0x02,
    AI_STATUS_IDLE = 0x03,
    AI_STATUS_CONNECTING = 0x04,
    AI_STATUS_LISTENING = 0x05,
    AI_STATUS_SPEAKING = 0x06,
    AI_STATUS_UPGRADING = 0x07,
    AI_STATUS_ACTIVATING = 0x08,
    } ai_status_t;

    static void ui_set_status(ai_status_t status)
    {
    switch (status) {
    case AI_STATUS_STARTING:
    ESP_LOGI(TAG, "AI status: starting");
    break;
    case AI_STATUS_CONFIGURING:
    ESP_LOGI(TAG, "AI status: configuring");
    break;
    case AI_STATUS_IDLE:
    ESP_LOGI(TAG, "AI status: idle");
    break;
    case AI_STATUS_CONNECTING:
    ESP_LOGI(TAG, "AI status: connecting");
    break;
    case AI_STATUS_LISTENING:
    ESP_LOGI(TAG, "AI status: listening");
    break;
    case AI_STATUS_SPEAKING:
    ESP_LOGI(TAG, "AI status: speaking");
    break;
    case AI_STATUS_UPGRADING:
    ESP_LOGI(TAG, "AI status: upgrading");
    break;
    case AI_STATUS_ACTIVATING:
    ESP_LOGI(TAG, "AI status: activating");
    break;
    default:
    ESP_LOGW(TAG, "Unknown AI status: 0x%02X", status);
    break;
    }
    }

    static void board_set_rgb(uint8_t r, uint8_t g, uint8_t b)
    {
    ESP_LOGI(TAG, "Set RGB: R=%u G=%u B=%u", r, g, b);

    复制代码
     /*
      * TODO:
      * 1. 如果使用 WS2812,用 RMT 驱动写 RGB。
      * 2. 如果使用 PWM 三路灯,用 ledc_set_duty。
      * 3. 如果无灯,可以映射为屏幕主题颜色。
      */

    }

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

    复制代码
     ESP_LOGI(TAG, "Set volume: %u", volume);
    
     /*
      * TODO:
      * 1. 调整 I2S DAC 音量。
      * 2. 调整功放芯片音量。
      * 3. 保存到 NVS,重启保持。
      */

    }

    static void app_enter_pairing(void)
    {
    ESP_LOGI(TAG, "Enter pairing mode");

    复制代码
     /*
      * TODO:
      * 1. 停止当前 WebSocket。
      * 2. 清理 Wi-Fi 状态。
      * 3. 进入 SoftAP 或 BluFi。
      */

    }

    static void app_recover_ai_module(void)
    {
    ESP_LOGW(TAG, "AI module asks MCU to reboot/recover it");

    复制代码
     /*
      * 开发宝典说明:
      * 收到 55 AA 01 FC AA 55 时,MCU 需要重启 AI 模组并重新下发 MCP 映射。
      *
      * TODO:
      * 1. 拉低 AI 模组 EN / RESET。
      * 2. 延时。
      * 3. 重新上电。
      * 4. 重发 AT+ADDMCP。
      */

    }

    static esp_err_t ai_uart_init(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,
    };

    复制代码
     ESP_ERROR_CHECK(uart_driver_install(AI_UART, 2048, 2048, 0, NULL, 0));
     ESP_ERROR_CHECK(uart_param_config(AI_UART, &cfg));
     ESP_ERROR_CHECK(uart_set_pin(
         AI_UART,
         AI_UART_TX_PIN,
         AI_UART_RX_PIN,
         UART_PIN_NO_CHANGE,
         UART_PIN_NO_CHANGE
     ));
    
     return ESP_OK;

    }

    static void ai_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 ai_register_mcp_tools(void)
    {
    /*
    * 基础通信测试
    */
    ai_send_line("AT");

    复制代码
     /*
      * 上电后不强制进入配网,优先连接已保存网络。
      * 如需强制配网,改为 AT+WIFICFG=1。
      */
     ai_send_line("AT+WIFICFG=0");
     ai_send_line("AT+CONNECT");
    
     /*
      * Type=1:
      * AI 将自然语言参数转成字节返回。
      *
      * 例如:
      * 用户说:"把氛围灯调成红色"
      * AI -> MCU: 55 AA 04 F1 FF 00 00 AA 55
      */
     ai_send_line("AT+ADDMCP=1,set_lamp_color,设置音箱氛围灯颜色,F1,3,R,G,B");
    
     /*
      * 音量控制:
      * 用户说:"音量调到 60"
      * AI -> MCU: 55 AA 02 F2 3C AA 55
      */
     ai_send_line("AT+ADDMCP=1,set_speaker_volume,设置音箱音量,F2,1,volume");
    
     /*
      * 播放音乐:
      * 这里仅返回一个命令字,实际音乐源可由云端 MCP 或本地播放器执行。
      */
     ai_send_line("AT+ADDMCP=0,play_music,播放音乐,2,F3,01");
    
     /*
      * 定时器:
      * 例如"十分钟后提醒我关火",可映射到本地 RTC 或云端任务。
      */
     ai_send_line("AT+ADDMCP=1,set_timer,设置提醒定时器,F4,2,minute,action");
    
     /*
      * 进入配网:
      * 用户说:"重新配网"。
      */
     ai_send_line("AT+ADDMCP=0,enter_pairing,让音箱进入配网模式,2,EE,01");

    }

    static void ai_handle_frame(uint8_t cmd, const uint8_t *data, uint8_t data_len)
    {
    if (cmd == CMD_RECOVER) {
    app_recover_ai_module();
    return;
    }

    复制代码
     if (cmd == CMD_STATUS && data_len >= 1) {
         ui_set_status((ai_status_t)data[0]);
         return;
     }
    
     switch (cmd) {
     case CMD_SET_RGB:
         if (data_len >= 3) {
             board_set_rgb(data[0], data[1], data[2]);
         }
         break;
    
     case CMD_SET_VOLUME:
         if (data_len >= 1) {
             audio_set_volume(data[0]);
         }
         break;
    
     case CMD_PLAY_MUSIC:
         ESP_LOGI(TAG, "Play music command");
         break;
    
     case CMD_SET_TIMER:
         if (data_len >= 2) {
             ESP_LOGI(TAG, "Set timer: minute=%u action=%u", data[0], data[1]);
         }
         break;
    
     case CMD_ENTER_PAIRING:
         app_enter_pairing();
         break;
    
     default:
         ESP_LOGW(TAG, "Unhandled MCP cmd=0x%02X len=%u", cmd, data_len);
         break;
     }

    }

    static void ai_mcp_bridge_task(void *arg)
    {
    uint8_t buf[128];
    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;
         }
    
         /*
          * 简单帧同步:
          * 55 AA LEN CMD DATA... AA 55
          */
         if (pos == 0 && b != AI_FRAME_HEAD1) {
             continue;
         }
    
         if (pos == 1 && b != AI_FRAME_HEAD2) {
             pos = 0;
             expected = -1;
             continue;
         }
    
         buf[pos++] = b;
    
         if (pos == 3) {
             uint8_t len = buf[2];
    
             if (len == 0 || len > 120) {
                 ESP_LOGW(TAG, "Invalid len=%u", len);
                 pos = 0;
                 expected = -1;
                 continue;
             }
    
             expected = 2 + 1 + len + 2;
         }
    
         if (expected > 0 && pos >= expected) {
             uint8_t len = buf[2];
    
             if (buf[3 + len] == AI_FRAME_TAIL1 &&
                 buf[4 + len] == AI_FRAME_TAIL2) {
    
                 uint8_t cmd = buf[3];
                 const uint8_t *data = &buf[4];
                 uint8_t data_len = len - 1;
    
                 ai_handle_frame(cmd, data, data_len);
             } else {
                 ESP_LOGW(TAG, "Bad frame tail");
             }
    
             pos = 0;
             expected = -1;
         }
    
         if (pos >= sizeof(buf)) {
             pos = 0;
             expected = -1;
         }
     }

    }

    void ai_mcp_bridge_start(void)
    {
    ESP_ERROR_CHECK(ai_uart_init());

    复制代码
     /*
      * 等待 AI 模组启动完成。
      */
     vTaskDelay(pdMS_TO_TICKS(1500));
    
     ai_register_mcp_tools();
    
     xTaskCreate(
         ai_mcp_bridge_task,
         "ai_mcp_bridge",
         4096,
         NULL,
         10,
         NULL
     );

    }

app_main.c 中调用:

复制代码
void app_main(void)
{
    /*
     * TODO:
     * board_init();
     * display_init();
     * audio_init();
     * network_manager_start();
     */

    ai_mcp_bridge_start();
}

9. 三模联网管理代码框架

下面是联网决策层示例。实际项目中,Wi-Fi 用 esp_wifi,4G 可用 PPPoS / ECM / RNDIS,蓝牙 PAN 建议交给 7014 或蓝牙协处理器,ESP32-S3 侧只维护链路状态和路由选择。

复制代码
typedef enum {
    NET_LINK_NONE = 0,
    NET_LINK_WIFI,
    NET_LINK_4G,
    NET_LINK_BT_PAN,
} net_link_t;

typedef struct {
    bool up;
    int rssi;                 // Wi-Fi / 4G 信号强度
    int latency_ms;            // 后端 ping 延迟
    int fail_count;            // WebSocket / ping 失败次数
    int power_cost;            // 功耗权重,越大越耗电
    int money_cost;            // 流量费用权重,越大越贵
} net_metric_t;

static net_metric_t g_wifi;
static net_metric_t g_4g;
static net_metric_t g_btpan;

static net_link_t g_current_link = NET_LINK_NONE;

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

    int score = 0;

    score += priority * 1000;
    score += m->rssi;
    score -= m->latency_ms / 10;
    score -= m->fail_count * 500;
    score -= m->power_cost * 20;
    score -= m->money_cost * 30;

    return score;
}

static net_link_t choose_best_link(void)
{
    /*
     * 优先级:
     * Wi-Fi > 4G > 蓝牙 PAN
     */
    int wifi_score = calc_score(&g_wifi, 3);
    int g4_score   = calc_score(&g_4g, 2);
    int bt_score   = calc_score(&g_btpan, 1);

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

    if (g4_score >= wifi_score && g4_score >= bt_score) {
        return NET_LINK_4G;
    }

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

    return NET_LINK_NONE;
}

static void switch_link(net_link_t target)
{
    if (target == g_current_link) {
        return;
    }

    /*
     * 对话过程中不建议硬切链路。
     * 可设置 pending_link,等本轮 TTS 结束后切换。
     */
    switch (target) {
    case NET_LINK_WIFI:
        ESP_LOGI("NET", "Switch to Wi-Fi");
        // esp_netif_set_default_netif(wifi_netif);
        break;

    case NET_LINK_4G:
        ESP_LOGI("NET", "Switch to 4G");
        // esp_netif_set_default_netif(ppp_netif);
        break;

    case NET_LINK_BT_PAN:
        ESP_LOGI("NET", "Switch to Bluetooth PAN");
        // route to BT PAN co-processor
        break;

    default:
        ESP_LOGW("NET", "No network available, enter provisioning");
        // start_softap_or_blufi();
        break;
    }

    g_current_link = target;
}

static void network_manager_task(void *arg)
{
    while (1) {
        /*
         * TODO:
         * 1. 更新 Wi-Fi RSSI。
         * 2. 查询 4G 注册状态、RSSI、PDP 状态。
         * 3. 查询 7014 / 蓝牙 PAN 状态。
         * 4. ping OTA / WebSocket 网关。
         */
        net_link_t best = choose_best_link();
        switch_link(best);

        vTaskDelay(pdMS_TO_TICKS(10000));
    }
}

10. 4G 模组接入示例

4G 模组常见两种方式:

  1. UART + PPPoS:接线简单,适合低速控制和语音流;

  2. USB ECM / RNDIS:吞吐更高,但 USB Host 和驱动复杂度更高。

UART PPP AT 初始化逻辑示例:

复制代码
static void modem_send_at(const char *cmd)
{
    /*
     * TODO:
     * 写入 4G 模组 UART,并等待 OK。
     */
    printf("MODEM -> %s\r\n", cmd);
}

static esp_err_t modem_prepare_ppp(const char *apn)
{
    char cmd[128];

    modem_send_at("AT");
    modem_send_at("ATE0");
    modem_send_at("AT+CPIN?");
    modem_send_at("AT+CSQ");
    modem_send_at("AT+CREG?");
    modem_send_at("AT+CGATT=1");

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

    /*
     * 常见 PPP 拨号命令,不同模组可能不同:
     * Quectel / SIMCom / 移远 / 广和通需按实际 AT 手册适配。
     */
    modem_send_at("ATD*99***1#");

    /*
     * 收到 CONNECT 后,将 UART 切给 PPPoS。
     * TODO:
     * 绑定 esp_netif PPP。
     */
    return ESP_OK;
}

量产时建议增加:

复制代码
1. SIM 卡检测;
2. APN 自动匹配;
3. 4G RSSI / RSRP / RSRQ 上报;
4. 流量用量统计;
5. 断网自动重拨;
6. 4G 模组电源硬复位;
7. 低电量时禁止 4G 常驻;
8. OTA 时优先 Wi-Fi,避免 4G 流量成本过高。

11. 蓝牙能力设计

本方案中"蓝牙"建议拆成三层:

11.1 BLE 配网

采用四博小助手 BluFi 配网,流程为:

复制代码
设备进入配网模式
  ↓
小程序搜索设备
  ↓
选择 BluFi 配网添加
  ↓
输入 Wi-Fi SSID / 密码
  ↓
设备连接网络
  ↓
绑定智能体并开始对话

开发宝典中明确给出四博小助手 BluFi 配网流程:打开微信小程序,搜索四博小助手,创建智能体,进入设备配置,选择 BluFi 配网添加,搜索设备后输入网络密码即可使用。

11.2 蓝牙 PAN 手机伴侣

适合户外和临时网络场景:

复制代码
手机 4G/5G
  ↓
蓝牙 PAN
  ↓
7014 / 蓝牙协处理器
  ↓
UART / SPI
  ↓
ESP32-S3
  ↓
AI 后端

11.3 蓝牙音箱模式

如果产品要求"能当传统蓝牙音箱",建议采用:

复制代码
手机 A2DP
  ↓
蓝牙音频芯片 / 7014
  ↓
I2S / 模拟音频
  ↓
功放
  ↓
喇叭

ESP32-S3 仍作为 UI 和 AI 主控,蓝牙音频芯片作为音频输入源之一。音频仲裁建议:

复制代码
优先级:
AI TTS 播报 > 电话 / 系统提示 > 蓝牙音乐 > 本地提示音

如果 AI 被唤醒:
  1. 蓝牙音乐自动 ducking,音量降低 12~18 dB;
  2. 进入 LISTENING;
  3. TTS 播报结束 1 秒后恢复蓝牙音乐。

12. 唤醒、打断与高噪优化

12.1 目标指标

建议把你提出的能力转化为工程验收指标:

项目 建议指标
唤醒距离 5 m,正前方,普通家庭混响
高噪环境 空气炸锅 / 油烟机 / 电视背景声
唤醒词 默认"你好小智",支持定制
打断 AI 播报过程中可实时唤醒打断
误唤醒 安静环境连续 24 h 低误触发
响应延迟 唤醒到提示音 < 500 ms,网络对话首包按后端能力优化
AEC 自身 TTS 播放时仍可唤醒

开发宝典中 VB6824 唤醒词更换流程说明:设备进入 VB6824 升级模式后,可通过页面输入设备码和授权码更换唤醒词;升级完成后,可支持选定唤醒词,并在 AI 说话过程中随时打断。

12.2 结构声学建议

复制代码
1. 麦克风避开喇叭出音口和倒相孔;
2. MIC 开孔增加防尘网,但避免过厚声阻材料;
3. 喇叭腔体与主板隔振,降低结构传导噪声;
4. 4G 天线、Wi-Fi 天线远离 MIC 走线和音频功放;
5. MIC 供电单独 LC 滤波;
6. 功放电源和 4G 峰值电流电源分区;
7. 量产测试中增加"播放 TTS 同时唤醒"项目。

13. OTA 与量产分区建议

建议 Flash 16MB 起步。示例分区:

复制代码
# 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. 固件 OTA:ESP32-S3 app 双分区;
2. 资源 OTA:提示音、屏幕素材、配置文件独立 storage;
3. VB6824 OTA:通过升级模式或产测工具单独升级;
4. 失败回滚:app 校验失败自动回退;
5. 灰度发布:按 device_id / batch_id / project_id 分批升级;
6. 安全:HTTPS OTA + 固件签名 + NVS 加密保存 token。

14. 产测方案

14.1 工厂测试项

复制代码
1. UART 通信:
   - ESP32-S3 <-> VB6824
   - ESP32-S3 <-> 4G 模组
   - ESP32-S3 <-> 7014 蓝牙协处理器

2. 音频:
   - MIC 录音电平
   - 喇叭播放 1 kHz 测试音
   - AEC 回采链路
   - 唤醒词测试

3. 网络:
   - Wi-Fi 扫描
   - Wi-Fi 连接
   - 4G 注册
   - 4G 拨号
   - 蓝牙广播 / 连接

4. UI:
   - 屏幕显示
   - RGB / LED
   - 按键单击、双击、三击、长按

5. 云端:
   - 获取 OTA
   - WebSocket 连接
   - 设备激活
   - MCP 指令闭环

14.2 产测 AT 指令建议

复制代码
FACTORY_WIFI_SCAN
FACTORY_WIFI_CONNECT
FACTORY_MIC_LEVEL
FACTORY_SPK_PLAY
FACTORY_WAKE_TEST
FACTORY_4G_CSQ
FACTORY_BT_ADV
FACTORY_LCD_TEST
FACTORY_LED_TEST
FACTORY_KEY_TEST
FACTORY_SN_WRITE
FACTORY_TOKEN_WRITE

15. 成品功能清单

最终成品建议实现:

复制代码
AI 对话:
  - 唤醒词唤醒
  - 按键对话
  - 实时打断
  - 多轮对话
  - 本地 / 云端智能体

联网:
  - Wi-Fi
  - 4G
  - 蓝牙配网
  - 蓝牙 PAN / 手机伴侣
  - 链路自动切换

音频:
  - 蓝牙音箱
  - AI 播报
  - 本地提示音
  - 音量语音控制
  - TTS 播报 ducking

扩展:
  - MCP 控制智能家居
  - 天气、音乐、提醒、闹钟
  - 私有知识库
  - 声音克隆
  - 声纹识别
  - OTA
  - 小程序配置

二开:
  - ESP-IDF 工程开源
  - 板级配置独立
  - UART AT+MCP
  - 后端可私有化
  - 支持品牌定制

四博 AI 硬件选型表中,AI 智能音响形态已经覆盖 PCBA 主板、电池包、显示屏、麦克风、喇叭、线材等主要配件,并具备 AI 大模型、蓝牙音响、闹钟、声音克隆、声纹识别、APP / 小程序、改唤醒词等功能方向。


16. 推荐落地版本

标准版:S3 + VB6824 + Wi-Fi / BLE

适合家用和室内场景:

复制代码
ESP32-S3R8 + 16M Flash
VB6824
1.3 寸 240×240 屏
单麦 / 双麦
3W 喇叭
Wi-Fi + BLE BluFi
小智 / 豆包 / ChatGPT / 私有后端

三模版:S3 + VB6824 + 4G + 7014

适合你描述的全场景灵活适配:

复制代码
ESP32-S3R8 + 16M Flash
VB6824
4G Cat.1 / Cat.4 模组
7014 蓝牙 PAN / 蓝牙音频协处理器
Wi-Fi STA / SoftAP
BLE BluFi 配网
1.3 / 2.0 寸屏
3W~5W 喇叭
电池 + 充电管理
MCP 工具扩展
OTA + 私有化后端

高端版:S3 + VB6824 + 4G + 摄像头 + 屏幕

适合多模态 AI 音箱 / AI 桌面机器人:

复制代码
ESP32-S3R8 + 16M Flash
VB6824
4G
摄像头
1.8 / 2.0 / 4.75 寸屏
触摸按键
多模态识别
视觉问答
AI 陪伴
展厅导览

17. 一句话方案总结

四博 AI 智能音箱建议采用 ESP32-S3 主控 + VB6824 语音前端 + 7014 蓝牙协处理器 + 4G 模组 的四芯协同架构:S3 负责 AI 业务、UI、Wi-Fi、WebSocket、OTA 和二次开发;VB6824 负责远场唤醒、AEC、降噪、实时打断和唤醒词;7014 负责蓝牙 PAN / 蓝牙音箱;4G 模组负责户外和无 Wi-Fi 场景联网。通过 DOIT_AI 开源工程、四博小助手 BluFi 配网、AT+MCP 语义控制和私有化小智后端,可快速形成可量产、可定制、可集成的 AI 智能音箱平台。

相关推荐
ManThink Technology2 小时前
KS31 4-20mA 模拟量采集器通过LoRaWAN 接入ThinkLink
人工智能·物联网
龙侠九重天2 小时前
RAG 检索增强生成:原理与应用场景
ai·大模型·rag·检索增强生成
Rubin智造社2 小时前
04月25日AI每日参考:谷歌豪掷400亿押注Anthropic,DeepSeek V4横空出世
大数据·人工智能·物联网·comfyui·deepseek v4·谷歌anthropic投资·meta亚马逊芯片
weixin_699602442 小时前
Midjourney 视频 API 集成指南
ai
深念Y2 小时前
大模型API缓存的底层原理:从显存到网关
缓存·ai·llm·api·硬件·显存·kvcache
俊哥V2 小时前
每日 AI 研究简报 · 2026-04-25
人工智能·ai
va学弟3 小时前
Agent入门开发(2):个性化功能添加
java·服务器·ai
杨浦老苏3 小时前
AI使用追踪和代理网关GoModel
人工智能·docker·ai·api·群晖
企业架构师老王3 小时前
药品生产环节:用实在Agent自动生成批记录与打印领料单的合规设计与架构落地
大数据·人工智能·ai·架构