四博 AI 智能音箱 4G S3 版本工程方案:三模联网、远场唤醒、AI 会话与打断架构设计

四博 AI 智能音箱 4G S3 版本工程方案:三模联网、远场唤醒、AI 会话与打断架构设计

1. 方案概述

四博 AI 智能音箱 4G S3 版本是一套面向家庭、厨房、户外、门店、展厅及 B 端定制场景的 AI 语音终端方案。产品基于 ESP32-S3 架构 ,支持 Wi-Fi、BLE、4G 三模联网,搭配 VB6824 语音芯片实现远距离唤醒、离线命令、AEC 回声消除和高噪声环境下的语音打断。

四博模组选型资料中,ESP32-S3 系列定位于音视频 / AI 市场,ESPS3-32、ESPS3-32E 系列兼容官方 ESP32-S3-WROOM 系列模组,适合 AI 音箱、AI 相机、多模态终端等产品开发。 四博 AI 硬件资料也明确提到,ESP32-C2/C3/S3 + VB6824 方案已经成熟应用于 S3 双目、S3 拍学机、地球仪、拍拍灯等产品,VB6824 可完成音频编解码、AEC、语音唤醒和唤醒词修改,让主控专注通信和 UI。

需要注意:ESP32-S3 原生支持 Wi-Fi + BLE,不支持经典蓝牙 A2DP 音频。因此,如果产品要实现"手机蓝牙音乐播放"的完整蓝牙音箱能力,建议增加外置经典蓝牙音频芯片或 7014 类蓝牙音频方案;如果只是用于配网、绑定、控制和小程序通信,ESP32-S3 BLE 即可满足。


2. 系统目标

本方案目标不是做一个简单蓝牙音箱,而是做一个具备 AI 能力的三模联网语音终端:

复制代码
  1. Wi-Fi:家庭、办公室、固定场景主联网

  2. 4G:户外、展厅、门店、无 Wi-Fi 场景备用联网

  3. BLE:小程序配网、设备绑定、近场控制

  4. VB6824:远场唤醒、离线命令、AEC、语音打断

  5. ESP32-S3:网络管理、AI 协议、状态机、UI、OTA

  6. 云端 AI:ASR、LLM、TTS、知识库、声音克隆、MCP 工具

四博资料中,AI 智能音响方案已经覆盖 AI 大模型、蓝牙音响、闹钟、声音克隆、声纹识别、APP、小程序和改唤醒词等功能,适合品牌 B 端客户或成品电商客户。


3. 推荐硬件架构

复制代码

┌──────────────────────────────────────┐

│ 四博 AI 智能音箱 4G S3 版 │

├──────────────────────────────────────┤

│ 主控:ESP32-S3 / ESPS3-32 N16R8 │

│ 语音:VB6824 │

│ 联网:Wi-Fi + BLE + 4G Cat.1 │

│ 音频:MIC + Speaker + 功放 │

│ 显示:小屏 / LED 点阵 / RGB 灯效 │

│ 存储:16MB Flash + 8MB PSRAM │

│ 电源:Type-C / 锂电池 / DC 供电 │

│ 扩展:TF Card / 蓝牙音频芯片 / 按键 │

└──────────────────────────────────────┘

推荐配置:

复制代码

主控:ESPS3-32 N16R8

语音:VB6824

4G:Cat.1 模块,UART / USB 接入

蓝牙:ESP32-S3 BLE 用于配网;经典蓝牙音频需外置芯片

音频:I2S DAC / Codec + 功放

麦克风:单 MIC / 双 MIC / 阵列 MIC 可选

屏幕:0.96 / 1.28 / 2.0 寸 LCD 可选

电源:5V Type-C + 锂电池

四博 AI 开发宝典中,AI-C5 类硬件已经包含 Wi-Fi 与 4G 模组接入、喇叭、咪头、电池和 2 寸屏等配置,可作为三模联网 AI 终端设计的参考。


4. 软件工程目录

复制代码

sibo_ai_speaker_4g_s3/

├── main/

│ ├── app_main.c

│ ├── board_config.h

│ ├── app_event.h

│ ├── app_event.c

│ ├── app_state.c

│ ├── app_state.h

│ ├── net_policy.c

│ ├── net_policy.h

│ ├── wifi_port.c

│ ├── wifi_port.h

│ ├── ble_config.c

│ ├── ble_config.h

│ ├── modem_4g.c

│ ├── modem_4g.h

│ ├── vb6824_port.c

│ ├── vb6824_port.h

│ ├── ai_session.c

│ ├── ai_session.h

│ ├── audio_route.c

│ ├── audio_route.h

│ ├── speaker_ui.c

│ ├── speaker_ui.h

│ ├── ota_service.c

│ └── ota_service.h

├── components/

│ ├── audio_player/

│ ├── json_helper/

│ ├── lcd_driver/

│ └── storage/

├── partitions.csv

├── sdkconfig.defaults

└── CMakeLists.txt


5. board_config.h

复制代码

#pragma once

#include "driver/uart.h"

#include "driver/gpio.h"

/* Device */

#define DEVICE_NAME "SIBO_AI_SPEAKER_4G_S3"

#define DEVICE_ID "SIBO_S3_4G_001122334455"

/* AI Server */

#define AI_WS_URL "wss://ai.example.com/sibo/speaker/ws"

/* VB6824 */

#define VB6824_UART_NUM UART_NUM_1

#define VB6824_UART_TX GPIO_NUM_17

#define VB6824_UART_RX GPIO_NUM_18

#define VB6824_UART_BAUD 115200

/* 4G Module */

#define MODEM_UART_NUM UART_NUM_2

#define MODEM_UART_TX GPIO_NUM_40

#define MODEM_UART_RX GPIO_NUM_41

#define MODEM_PWR_GPIO GPIO_NUM_42

#define MODEM_UART_BAUD 115200

/* I2S Audio */

#define I2S_BCLK_GPIO GPIO_NUM_5

#define I2S_WS_GPIO GPIO_NUM_6

#define I2S_DOUT_GPIO GPIO_NUM_7

#define I2S_DIN_GPIO GPIO_NUM_8

#define AMP_EN_GPIO GPIO_NUM_9

/* Keys */

#define KEY_WAKE_GPIO GPIO_NUM_0

#define KEY_VOL_UP_GPIO GPIO_NUM_10

#define KEY_VOL_DOWN_GPIO GPIO_NUM_11

/* Network */

#define WIFI_CONNECT_TIMEOUT_MS 10000

#define MODEM_CONNECT_TIMEOUT_MS 15000

/* OTA */

#define OTA_MANIFEST_URL "https://cdn.example.com/sibo_speaker/manifest.json"


6. 事件总线设计

AI 音箱是典型异步系统,不能把 Wi-Fi、4G、语音、播放、AI 返回全部写进一个大循环。推荐统一走事件总线。

复制代码

#pragma once

#include <stdint.h>

#include <stddef.h>

typedef enum {

APP_EVT_NONE = 0,

APP_EVT_WIFI_READY,

APP_EVT_WIFI_LOST,

APP_EVT_4G_READY,

APP_EVT_4G_LOST,

APP_EVT_BLE_CONFIG_DONE,

APP_EVT_NET_READY,

APP_EVT_NET_LOST,

APP_EVT_WAKEUP,

APP_EVT_BARGE_IN,

APP_EVT_CMD_CHAT,

APP_EVT_CMD_STOP,

APP_EVT_CMD_VOL_UP,

APP_EVT_CMD_VOL_DOWN,

APP_EVT_CMD_MUSIC,

APP_EVT_CMD_ALARM,

APP_EVT_AI_CONNECTED,

APP_EVT_AI_DISCONNECTED,

APP_EVT_AI_RESULT,

APP_EVT_AI_TTS_URL,

APP_EVT_AUDIO_PLAY_START,

APP_EVT_AUDIO_PLAY_DONE,

APP_EVT_AUDIO_STOPPED,

APP_EVT_OTA_NOTIFY,

APP_EVT_OTA_START,

APP_EVT_OTA_SUCCESS,

APP_EVT_OTA_FAIL,

} app_evt_id_t;

typedef struct {

app_evt_id_t id;

void *data;

size_t len;

} app_evt_t;

复制代码

#include "freertos/FreeRTOS.h"

#include "freertos/queue.h"

#include "app_event.h"

static QueueHandle_t s_app_queue;

void app_event_init(void)

{

s_app_queue = xQueueCreate(32, sizeof(app_evt_t));

}

void app_event_send(app_evt_id_t id, void *data, size_t len)

{

if (!s_app_queue) {

return;

}

app_evt_t evt = {

.id = id,

.data = data,

.len = len,

};

xQueueSend(s_app_queue, &evt, pdMS_TO_TICKS(20));

}

QueueHandle_t app_event_queue(void)

{

return s_app_queue;

}


7. 网络策略:Wi-Fi 优先,4G 兜底,BLE 配网

三模联网不是简单"都打开",而是要有优先级策略。

复制代码

typedef enum {

NET_LINK_NONE = 0,

NET_LINK_WIFI,

NET_LINK_4G,

} net_link_t;

typedef struct {

bool wifi_ready;

bool g4_ready;

bool ble_configured;

net_link_t active_link;

} net_policy_t;

static net_policy_t s_net;

static void net_policy_select(void)

{

net_link_t old = s_net.active_link;

if (s_net.wifi_ready) {

s_net.active_link = NET_LINK_WIFI;

} else if (s_net.g4_ready) {

s_net.active_link = NET_LINK_4G;

} else {

s_net.active_link = NET_LINK_NONE;

}

if (old != s_net.active_link) {

if (s_net.active_link == NET_LINK_NONE) {

app_event_send(APP_EVT_NET_LOST, NULL, 0);

} else {

app_event_send(APP_EVT_NET_READY, NULL, 0);

}

}

}

void net_policy_on_event(app_evt_id_t evt)

{

switch (evt) {

case APP_EVT_WIFI_READY:

s_net.wifi_ready = true;

break;

case APP_EVT_WIFI_LOST:

s_net.wifi_ready = false;

modem_4g_connect_async();

break;

case APP_EVT_4G_READY:

s_net.g4_ready = true;

break;

case APP_EVT_4G_LOST:

s_net.g4_ready = false;

break;

case APP_EVT_BLE_CONFIG_DONE:

s_net.ble_configured = true;

wifi_port_connect_saved();

break;

default:

break;

}

net_policy_select();

}

const char *net_policy_active_name(void)

{

switch (s_net.active_link) {

case NET_LINK_WIFI:

return "wifi";

case NET_LINK_4G:

return "4g";

default:

return "none";

}

}


8. 4G 模块 AT 初始化

4G 模块建议先完成 AT 检测、SIM 卡检测、信号检测和注册状态检测,再进入 PPP 或透传联网。

复制代码

#include "driver/uart.h"

#include "esp_log.h"

#include "board_config.h"

static const char *TAG = "MODEM_4G";

void modem_4g_init(void)

{

uart_config_t cfg = {

.baud_rate = MODEM_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(MODEM_UART_NUM, 4096, 4096, 0, NULL, 0);

uart_param_config(MODEM_UART_NUM, &cfg);

uart_set_pin(MODEM_UART_NUM, MODEM_UART_TX, MODEM_UART_RX,

UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);

ESP_LOGI(TAG, "4G modem uart ready");

}

static void modem_send_cmd(const char *cmd)

{

uart_write_bytes(MODEM_UART_NUM, cmd, strlen(cmd));

uart_write_bytes(MODEM_UART_NUM, "\r\n", 2);

}

void modem_4g_probe(void)

{

modem_send_cmd("AT");

vTaskDelay(pdMS_TO_TICKS(300));

modem_send_cmd("ATE0");

vTaskDelay(pdMS_TO_TICKS(300));

modem_send_cmd("AT+CPIN?");

vTaskDelay(pdMS_TO_TICKS(300));

modem_send_cmd("AT+CSQ");

vTaskDelay(pdMS_TO_TICKS(300));

modem_send_cmd("AT+CREG?");

vTaskDelay(pdMS_TO_TICKS(300));

modem_send_cmd("AT+CGATT?");

vTaskDelay(pdMS_TO_TICKS(300));

}

void modem_4g_connect_async(void)

{

/*

* 实际项目建议放到 modem_task 中执行:

* 1. AT 探测

* 2. SIM 卡检测

* 3. 信号检测

* 4. PDP 激活

* 5. PPP 拨号

* 6. 获取 IP 后发送 APP_EVT_4G_READY

*/

modem_4g_probe();

}


9. VB6824 语音命令接入

VB6824 负责远场唤醒、离线命令、AEC 和高噪场景下的识别。四博 AI 开发宝典中也提到,VB6824 采用语音识别与降噪算法,具备更远距离唤醒、更低误唤醒率、更强抗噪能力和更快响应时间。

建议命令码:

复制代码

typedef enum {

VB_CMD_WAKEUP = 0x01,

VB_CMD_BARGE_IN = 0x02,

VB_CMD_CHAT = 0x03,

VB_CMD_STOP = 0x04,

VB_CMD_VOL_UP = 0x05,

VB_CMD_VOL_DOWN = 0x06,

VB_CMD_MUSIC = 0x07,

VB_CMD_ALARM = 0x08,

} vb_cmd_t;

VB6824 串口解析:

复制代码

#include "driver/uart.h"

#include "esp_log.h"

#include "app_event.h"

#include "board_config.h"

static const char *TAG = "VB6824";

void vb6824_port_init(void)

{

uart_config_t cfg = {

.baud_rate = VB6824_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(VB6824_UART_NUM, 1024, 0, 0, NULL, 0);

uart_param_config(VB6824_UART_NUM, &cfg);

uart_set_pin(VB6824_UART_NUM, VB6824_UART_TX, VB6824_UART_RX,

UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);

ESP_LOGI(TAG, "VB6824 uart ready");

}

static uint8_t checksum(uint8_t *buf, int len)

{

uint8_t sum = 0;

for (int i = 0; i < len; i++) {

sum += buf[i];

}

return sum;

}

static void vb6824_dispatch(uint8_t cmd)

{

switch (cmd) {

case VB_CMD_WAKEUP:

app_event_send(APP_EVT_WAKEUP, NULL, 0);

break;

case VB_CMD_BARGE_IN:

app_event_send(APP_EVT_BARGE_IN, NULL, 0);

break;

case VB_CMD_CHAT:

app_event_send(APP_EVT_CMD_CHAT, NULL, 0);

break;

case VB_CMD_STOP:

app_event_send(APP_EVT_CMD_STOP, NULL, 0);

break;

case VB_CMD_VOL_UP:

app_event_send(APP_EVT_CMD_VOL_UP, NULL, 0);

break;

case VB_CMD_VOL_DOWN:

app_event_send(APP_EVT_CMD_VOL_DOWN, NULL, 0);

break;

case VB_CMD_MUSIC:

app_event_send(APP_EVT_CMD_MUSIC, NULL, 0);

break;

case VB_CMD_ALARM:

app_event_send(APP_EVT_CMD_ALARM, NULL, 0);

break;

default:

ESP_LOGW(TAG, "unknown cmd: 0x%02X", cmd);

break;

}

}

void vb6824_task(void *arg)

{

uint8_t buf[64];

while (1) {

int len = uart_read_bytes(VB6824_UART_NUM, buf, sizeof(buf), pdMS_TO_TICKS(100));

if (len < 5) {

continue;

}

/*

* Frame:

* 0xAA 0x55 LEN CMD CHECKSUM

*/

if (buf[0] == 0xAA && buf[1] == 0x55) {

uint8_t cmd = buf[3];

uint8_t sum = buf[4];

if (checksum(buf, 4) == sum) {

vb6824_dispatch(cmd);

} else {

ESP_LOGW(TAG, "checksum error");

}

}

}

}


10. 音频状态机:解决播放中打断

AI 音箱必须支持"正在播报时被打断"。例如音箱正在播放 TTS,用户说"小博小博",系统需要立即停止播放,进入聆听状态。

复制代码

typedef enum {

AUDIO_IDLE = 0,

AUDIO_LISTENING,

AUDIO_UPLOADING,

AUDIO_PLAYING_TTS,

AUDIO_BT_PLAYING,

AUDIO_INTERRUPTED,

} audio_state_t;

static audio_state_t s_audio_state = AUDIO_IDLE;

static int s_volume = 70;

void audio_state_set(audio_state_t state)

{

s_audio_state = state;

}

audio_state_t audio_state_get(void)

{

return s_audio_state;

}

void audio_volume_up(void)

{

if (s_volume < 100) {

s_volume += 5;

}

audio_player_set_volume(s_volume);

}

void audio_volume_down(void)

{

if (s_volume > 0) {

s_volume -= 5;

}

audio_player_set_volume(s_volume);

}

void audio_barge_in(void)

{

if (s_audio_state == AUDIO_PLAYING_TTS ||

s_audio_state == AUDIO_BT_PLAYING) {

audio_player_stop();

audio_state_set(AUDIO_INTERRUPTED);

speaker_ui_show_status("已打断,请继续说");

}

}


11. AI WebSocket 会话管理

AI 音箱建议使用 WebSocket 长连接,而不是每次 HTTP 请求。长连接更适合 AI 对话、打断、TTS 播放、设备状态同步和 OTA 通知。

复制代码

#include "esp_websocket_client.h"

#include "esp_log.h"

#include "cJSON.h"

#include "board_config.h"

#include "app_event.h"

#include "net_policy.h"

static const char *TAG = "AI_SESSION";

static esp_websocket_client_handle_t s_ws;

static void ai_ws_event_handler(void *args,

esp_event_base_t base,

int32_t event_id,

void *event_data)

{

esp_websocket_event_data_t *data = (esp_websocket_event_data_t *)event_data;

switch (event_id) {

case WEBSOCKET_EVENT_CONNECTED:

app_event_send(APP_EVT_AI_CONNECTED, NULL, 0);

break;

case WEBSOCKET_EVENT_DISCONNECTED:

app_event_send(APP_EVT_AI_DISCONNECTED, NULL, 0);

break;

case WEBSOCKET_EVENT_DATA:

if (data->op_code == 0x1) {

char *msg = calloc(1, data->data_len + 1);

if (msg) {

memcpy(msg, data->data_ptr, data->data_len);

app_event_send(APP_EVT_AI_RESULT, msg, data->data_len);

}

}

break;

default:

break;

}

}

void ai_session_start(void)

{

esp_websocket_client_config_t cfg = {

.uri = AI_WS_URL,

.reconnect_timeout_ms = 3000,

.network_timeout_ms = 10000,

};

s_ws = esp_websocket_client_init(&cfg);

esp_websocket_register_events(s_ws, WEBSOCKET_EVENT_ANY, ai_ws_event_handler, NULL);

esp_websocket_client_start(s_ws);

}

static bool ai_session_ready(void)

{

return s_ws && esp_websocket_client_is_connected(s_ws);

}

void ai_session_send_json(cJSON *root)

{

if (!ai_session_ready()) {

return;

}

char *json = cJSON_PrintUnformatted(root);

if (!json) {

return;

}

esp_websocket_client_send_text(s_ws, json, strlen(json), portMAX_DELAY);

cJSON_free(json);

}

设备上线 hello:

复制代码

void ai_session_send_hello(void)

{

cJSON *root = cJSON_CreateObject();

cJSON_AddStringToObject(root, "type", "hello");

cJSON_AddStringToObject(root, "device_id", DEVICE_ID);

cJSON_AddStringToObject(root, "product", DEVICE_NAME);

cJSON_AddStringToObject(root, "net", net_policy_active_name());

cJSON *cap = cJSON_CreateObject();

cJSON_AddBoolToObject(cap, "wifi", true);

cJSON_AddBoolToObject(cap, "ble", true);

cJSON_AddBoolToObject(cap, "g4", true);

cJSON_AddBoolToObject(cap, "barge_in", true);

cJSON_AddBoolToObject(cap, "far_field", true);

cJSON_AddStringToObject(cap, "wake_word", "小博小博");

cJSON_AddItemToObject(root, "capability", cap);

ai_session_send_json(root);

cJSON_Delete(root);

}


12. AI 对话协议

设备发送:

复制代码

{

"type": "chat",

"device_id": "SIBO_S3_4G_001122334455",

"session_id": "session_0001",

"text": "帮我播放一首轻音乐",

"scene": "ai_speaker",

"tts": true

}

云端返回:

复制代码

{

"type": "ai_result",

"text": "好的,正在为你播放轻音乐。",

"tts_url": "https://cdn.example.com/tts/001.mp3",

"action": {

"name": "play_music",

"params": {

"keyword": "轻音乐"

}

}

}

解析 AI 返回:

复制代码

#include "cJSON.h"

#include "audio_route.h"

#include "speaker_ui.h"

#include "app_event.h"

void ai_session_parse_result(const char *json)

{

cJSON *root = cJSON_Parse(json);

if (!root) {

return;

}

cJSON *type = cJSON_GetObjectItem(root, "type");

if (cJSON_IsString(type) && strcmp(type->valuestring, "ai_result") == 0) {

cJSON *text = cJSON_GetObjectItem(root, "text");

cJSON *tts = cJSON_GetObjectItem(root, "tts_url");

cJSON *action = cJSON_GetObjectItem(root, "action");

if (cJSON_IsString(text)) {

speaker_ui_show_text(text->valuestring);

}

if (cJSON_IsString(tts)) {

audio_route_play_tts(tts->valuestring);

}

if (cJSON_IsObject(action)) {

ai_session_handle_action(action);

}

}

if (cJSON_IsString(type) && strcmp(type->valuestring, "ota_notify") == 0) {

cJSON *url = cJSON_GetObjectItem(root, "firmware_url");

if (cJSON_IsString(url)) {

char *copy = strdup(url->valuestring);

app_event_send(APP_EVT_OTA_NOTIFY, copy, strlen(copy));

}

}

cJSON_Delete(root);

}


13. 音频路由:AI TTS / 本地提示音 / 蓝牙音频

复制代码

typedef enum {

AUDIO_ROUTE_LOCAL = 0,

AUDIO_ROUTE_AI_TTS,

AUDIO_ROUTE_BT_AUDIO,

} audio_route_t;

static audio_route_t s_route = AUDIO_ROUTE_LOCAL;

void audio_route_set(audio_route_t route)

{

s_route = route;

switch (route) {

case AUDIO_ROUTE_LOCAL:

external_bt_audio_enable(false);

amp_enable(true);

break;

case AUDIO_ROUTE_AI_TTS:

external_bt_audio_enable(false);

amp_enable(true);

break;

case AUDIO_ROUTE_BT_AUDIO:

external_bt_audio_enable(true);

amp_enable(true);

break;

default:

break;

}

}

void audio_route_play_tts(const char *url)

{

audio_route_set(AUDIO_ROUTE_AI_TTS);

audio_state_set(AUDIO_PLAYING_TTS);

audio_player_play_url(url);

}

void audio_route_play_prompt(const char *path)

{

audio_route_set(AUDIO_ROUTE_LOCAL);

audio_player_play_local(path);

}

void audio_route_bt_mode_enable(bool enable)

{

if (enable) {

audio_route_set(AUDIO_ROUTE_BT_AUDIO);

speaker_ui_show_status("蓝牙音箱模式");

} else {

audio_route_set(AUDIO_ROUTE_LOCAL);

speaker_ui_show_status("AI 音箱模式");

}

}


14. 应用事件分发

复制代码

static void app_handle_event(app_evt_t *evt)

{

switch (evt->id) {

case APP_EVT_NET_READY:

speaker_ui_show_status("网络已连接");

ai_session_start();

break;

case APP_EVT_AI_CONNECTED:

speaker_ui_show_status("AI 服务在线");

ai_session_send_hello();

break;

case APP_EVT_WAKEUP:

audio_barge_in();

audio_state_set(AUDIO_LISTENING);

audio_route_play_prompt("/spiffs/wakeup.mp3");

speaker_ui_show_status("我在,请说");

break;

case APP_EVT_BARGE_IN:

audio_barge_in();

break;

case APP_EVT_CMD_CHAT:

speaker_ui_show_status("正在思考...");

ai_session_send_chat("用户发起语音对话");

break;

case APP_EVT_CMD_STOP:

audio_player_stop();

audio_state_set(AUDIO_IDLE);

speaker_ui_show_status("已停止");

break;

case APP_EVT_CMD_VOL_UP:

audio_volume_up();

break;

case APP_EVT_CMD_VOL_DOWN:

audio_volume_down();

break;

case APP_EVT_AI_RESULT:

ai_session_parse_result((const char *)evt->data);

free(evt->data);

break;

case APP_EVT_OTA_NOTIFY:

ota_service_start((const char *)evt->data);

free(evt->data);

break;

default:

net_policy_on_event(evt->id);

break;

}

}

void app_dispatch_task(void *arg)

{

QueueHandle_t q = app_event_queue();

app_evt_t evt;

while (1) {

if (xQueueReceive(q, &evt, portMAX_DELAY) == pdTRUE) {

app_handle_event(&evt);

}

}

}


15. app_main.c

复制代码

#include "nvs_flash.h"

#include "esp_log.h"

#include "app_event.h"

#include "wifi_port.h"

#include "ble_config.h"

#include "modem_4g.h"

#include "vb6824_port.h"

#include "audio_route.h"

#include "speaker_ui.h"

#include "ota_service.h"

static const char *TAG = "SIBO_SPEAKER";

void app_main(void)

{

ESP_LOGI(TAG, "SIBO AI Speaker 4G S3 boot");

esp_err_t ret = nvs_flash_init();

if (ret == ESP_ERR_NVS_NO_FREE_PAGES ||

ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {

ESP_ERROR_CHECK(nvs_flash_erase());

ESP_ERROR_CHECK(nvs_flash_init());

}

app_event_init();

speaker_ui_init();

speaker_ui_show_status("四博 AI 智能音箱启动中...");

audio_route_init();

wifi_port_init();

ble_config_init();

modem_4g_init();

vb6824_port_init();

ota_service_init();

xTaskCreate(app_dispatch_task, "app_dispatch", 8192, NULL, 8, NULL);

xTaskCreate(vb6824_task, "vb6824_task", 4096, NULL, 7, NULL);

wifi_port_connect_saved();

ble_config_start();

modem_4g_prepare();

speaker_ui_show_status("正在连接 Wi-Fi / 4G...");

}


16. sdkconfig.defaults

复制代码

CONFIG_IDF_TARGET="esp32s3"

CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y

CONFIG_SPIRAM=y

CONFIG_SPIRAM_USE_MALLOC=y

CONFIG_SPIRAM_SPEED_80M=y

CONFIG_FREERTOS_HZ=1000

CONFIG_ESP_MAIN_TASK_STACK_SIZE=8192

CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=10

CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM=32

CONFIG_ESP_WIFI_TX_BUFFER_TYPE_DYNAMIC=y

CONFIG_LWIP_TCP_SND_BUF_DEFAULT=8192

CONFIG_LWIP_TCP_WND_DEFAULT=8192

CONFIG_LWIP_TCP_RECVMBOX_SIZE=16

CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN=16384

CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096

CONFIG_BT_ENABLED=y

CONFIG_BT_NIMBLE_ENABLED=y

CONFIG_LWIP_PPP_SUPPORT=y

CONFIG_PPP_SUPPORT=y


17. 总结

四博 AI 智能音箱 4G S3 版本的核心设计是:

复制代码

ESP32-S3 做系统主控;

VB6824 做远场唤醒、离线命令、AEC 和打断;

Wi-Fi 做固定场景联网;

4G 做户外和无 Wi-Fi 场景联网;

BLE 做小程序配网和设备绑定;

外置蓝牙音频芯片扩展传统蓝牙音箱能力;

WebSocket 接入云端 AI,实现对话、TTS、工具调用和 OTA。

这套方案适合 AI 音箱、厨房语音助手、户外便携 AI 音箱、门店讲解终端、展厅接待音箱、智能家居语音入口等场景。与普通蓝牙音箱相比,它的重点不是播放,而是 联网稳定、远场可唤醒、高噪可打断、AI 可扩展、系统可升级

相关推荐
风落无尘2 小时前
Claude Code 常用命令速查手册
人工智能
努力努力再努力FFF2 小时前
律师想了解AI法律咨询工具,能否用它提升案件检索效率?
大数据·人工智能
极智视界2 小时前
分类数据集 - 自然灾害场景飓风野火洪水地震分类数据集下载
人工智能·yolo·数据集·图像分类·算法训练·自然灾害检测
GlobalInfo2 小时前
全球人工智能停车机器人市场份额、规模、技术研究报告2026
人工智能·机器人
XD7429716363 小时前
科技早报|2026年4月30日:AI 基础设施竞赛继续升温
人工智能·科技·科技新闻·科技早报
刘~浪地球3 小时前
DeepSeek V4 技术解读:MoE架构优化深度解析
人工智能·架构·deepseek v4
码点滴3 小时前
私有 Gateway 接入企业 IM:从消息路由到多租户隔离——Hermes Agent 工程实战
人工智能·架构·gateway·prompt·智能体·hermes
财迅通Ai3 小时前
德适发布医疗AI评测平台DoctorBench 智诊科技、谷歌、OpenAl位列三甲
人工智能·科技·德适-b
xiaozhazha_3 小时前
企业级AI视频会议私有化部署实践:应对安全合规与成本挑战的技术架构解析
人工智能·安全·架构