基于 ESP32-S3 + VB6824 + I2S Codec 的四博AI睡眠眼罩/AI智能音箱方案:白噪音、音乐播放与AI情绪陪伴实现

标题

基于 ESP32-S3 + VB6824 + I2S Codec 的四博AI睡眠眼罩/AI智能音箱方案:白噪音、音乐播放与AI情绪陪伴实现

1. 方案定位

本文设计一套基于四博智联ESP系列模组的AI睡眠眼罩方案。该方案也可以复用到AI智能音箱、AI小夜灯、AI玩具、桌面陪伴机器人等产品中。

硬件侧推荐使用 ESPS3-32E / ESPS3-32 系列作为主控。四博模组选型手册中,ESP32-S3系列被归类到音视频/AI市场,并提供ESPS3-32、ESPS3-32E等模组规格;AI-C3资料中则已有 ESP32-C3 + VB6824 离线语音芯片、BluFi配网、Coze智能体接入等方案基础。

系统目标:

复制代码
复制代码
1. 支持本地白噪音播放
2. 支持本地音乐 / TF卡音乐 / 云端TTS播放
3. 支持AI情绪陪伴对话
4. 支持BLE BluFi配网
5. 支持小程序/App配置
6. 支持离线唤醒词
7. 支持定时关闭和低功耗休眠

2. 系统框图

复制代码
复制代码
+------------------------------------------------+
|                四博AI睡眠眼罩                  |
+------------------------------------------------+
| ESP32-S3 / ESPS3-32E                            |
|                                                |
|  Wi-Fi  <-------> AI Server / Coze / Xiaozhi    |
|  BLE    <-------> 小程序 / App BluFi配网         |
|                                                |
|  I2S RX <-------  MIC / Codec                   |
|  I2S TX ------->  Codec / AMP / Speaker         |
|                                                |
|  UART  <------->  VB6824 离线语音芯片            |
|  GPIO  <------->  Touch / Button / Motor        |
|  SPI   <------->  Flash / TF Card               |
|  ADC   <------->  Battery Detect                |
+------------------------------------------------+

3. 推荐工程目录

复制代码
复制代码
main/
├── app_main.c
├── app_config.h
├── audio_manager.c
├── audio_manager.h
├── white_noise.c
├── white_noise.h
├── ai_companion.c
├── ai_companion.h
├── blufi_manager.c
├── blufi_manager.h
├── sleep_mode.c
├── sleep_mode.h
├── codec_es8311.c
├── codec_es8311.h
└── CMakeLists.txt

四博AI开发宝典中建议基于ESP-IDF环境进行开发,并提供了AI-C2、AI-C3、AI-S3等硬件选型、SoftAP配网、BluFi配网、OTA、在线烧录等开发路径。


4. app_config.h

复制代码
复制代码
#pragma once

#define DEVICE_NAME                 "SIBO_AI_SLEEP_MASK"
#define FIRMWARE_VERSION            "1.0.0"

/* 音频参数 */
#define AUDIO_SAMPLE_RATE           16000
#define AUDIO_BITS_PER_SAMPLE       16
#define AUDIO_CHANNEL_NUM           1

/* I2S 引脚,根据实际PCB修改 */
#define I2S_BCLK_GPIO               4
#define I2S_WS_GPIO                 5
#define I2S_DOUT_GPIO               6
#define I2S_DIN_GPIO                7
#define I2S_MCLK_GPIO               16

/* 外设 */
#define TOUCH_KEY_GPIO              10
#define MOTOR_GPIO                  11
#define BATTERY_ADC_CHANNEL         3

/* 默认音量 */
#define DEFAULT_VOLUME              35

/* AI服务器地址,量产时建议由小程序下发 */
#define AI_SERVER_URL               "wss://your-ai-server.example.com/ws"

5. 音频模式状态机

AI眼罩的音频模式不能简单写成"播放/暂停",而应该拆成不同业务状态:

复制代码
复制代码
#pragma once

typedef enum {
    AUDIO_STATE_IDLE = 0,
    AUDIO_STATE_WHITE_NOISE,
    AUDIO_STATE_LOCAL_MUSIC,
    AUDIO_STATE_BLUETOOTH_MUSIC,
    AUDIO_STATE_AI_LISTENING,
    AUDIO_STATE_AI_SPEAKING,
    AUDIO_STATE_SLEEP_TIMER,
} audio_state_t;

typedef enum {
    NOISE_WHITE = 0,
    NOISE_PINK,
    NOISE_BROWN,
    NOISE_RAIN,
    NOISE_OCEAN,
    NOISE_FOREST
} noise_type_t;

typedef struct {
    audio_state_t state;
    noise_type_t noise_type;
    int volume;
    int timer_min;
    bool ai_enable;
    bool vibration_enable;
} audio_context_t;

void audio_manager_init(void);
void audio_manager_set_state(audio_state_t state);
void audio_manager_set_volume(int volume);
void audio_manager_start_noise(noise_type_t type);
void audio_manager_stop(void);
复制代码
复制代码
#include <stdio.h>
#include <string.h>
#include "audio_manager.h"

static audio_context_t g_audio_ctx = {
    .state = AUDIO_STATE_IDLE,
    .noise_type = NOISE_RAIN,
    .volume = 35,
    .timer_min = 30,
    .ai_enable = true,
    .vibration_enable = true,
};

void audio_manager_init(void)
{
    printf("音频管理器初始化完成\n");
    // i2s_driver_init();
    // codec_init();
    // amp_enable(true);
}

void audio_manager_set_state(audio_state_t state)
{
    if (g_audio_ctx.state == state) {
        return;
    }

    printf("音频状态切换: %d -> %d\n", g_audio_ctx.state, state);
    g_audio_ctx.state = state;

    switch (state) {
    case AUDIO_STATE_WHITE_NOISE:
        audio_manager_start_noise(g_audio_ctx.noise_type);
        break;

    case AUDIO_STATE_AI_LISTENING:
        printf("开始采集用户语音\n");
        // mic_start_capture();
        break;

    case AUDIO_STATE_AI_SPEAKING:
        printf("开始播放AI回复\n");
        // tts_stream_play();
        break;

    case AUDIO_STATE_IDLE:
    default:
        audio_manager_stop();
        break;
    }
}

void audio_manager_set_volume(int volume)
{
    if (volume < 0) volume = 0;
    if (volume > 100) volume = 100;

    g_audio_ctx.volume = volume;
    printf("设置音量: %d\n", volume);

    // codec_set_volume(volume);
}

void audio_manager_start_noise(noise_type_t type)
{
    g_audio_ctx.noise_type = type;

    switch (type) {
    case NOISE_WHITE:
        printf("播放白噪音\n");
        break;
    case NOISE_PINK:
        printf("播放粉噪音\n");
        break;
    case NOISE_BROWN:
        printf("播放棕噪音\n");
        break;
    case NOISE_RAIN:
        printf("播放雨声音效\n");
        break;
    case NOISE_OCEAN:
        printf("播放海浪音效\n");
        break;
    case NOISE_FOREST:
        printf("播放森林音效\n");
        break;
    default:
        printf("未知白噪音类型\n");
        break;
    }

    // white_noise_start(type);
}

void audio_manager_stop(void)
{
    printf("停止当前音频\n");
    // white_noise_stop();
    // music_stop();
    // mic_stop_capture();
}

6. 实时白噪音生成示例

量产产品建议使用预制高质量音频资源;但在开发阶段,可以先用软件生成PCM白噪音验证I2S链路。

复制代码
复制代码
#include <stdint.h>
#include <stdlib.h>
#include <stdbool.h>
#include "white_noise.h"

#define PCM_FRAME_SAMPLES 320

static bool s_noise_running = false;
static int16_t s_pcm_buf[PCM_FRAME_SAMPLES];

static int16_t generate_white_noise_sample(void)
{
    int32_t r = rand() % 65536;
    r -= 32768;
    return (int16_t)(r / 6);  // 降低幅度,避免刺耳
}

void white_noise_start(noise_type_t type)
{
    s_noise_running = true;

    while (s_noise_running) {
        for (int i = 0; i < PCM_FRAME_SAMPLES; i++) {
            switch (type) {
            case NOISE_WHITE:
                s_pcm_buf[i] = generate_white_noise_sample();
                break;

            case NOISE_BROWN: {
                static int32_t last = 0;
                last = (last * 15 + generate_white_noise_sample()) / 16;
                s_pcm_buf[i] = (int16_t)last;
                break;
            }

            default:
                s_pcm_buf[i] = generate_white_noise_sample();
                break;
            }
        }

        // i2s_write_data((uint8_t *)s_pcm_buf, sizeof(s_pcm_buf));
        // vTaskDelay(pdMS_TO_TICKS(10));
    }
}

void white_noise_stop(void)
{
    s_noise_running = false;
}

7. AI情绪陪伴流程

AI情绪陪伴建议拆成五个阶段:

复制代码
复制代码
1. 唤醒:VB6824离线唤醒 / 按键唤醒 / 触摸唤醒
2. 采集:ESP32-S3通过I2S采集麦克风PCM
3. 上传:通过WebSocket上传音频流
4. 生成:云端ASR + LLM + TTS
5. 播放:设备接收TTS音频流并通过I2S播放

AI-C3资料中已经提到支持小智AI引擎和Coze智能体,其中Coze智能体适合做硬件化陪伴分身;这一点非常适合"AI情绪陪伴眼罩"场景。

AI消息协议建议

复制代码
复制代码
{
  "device_id": "sibo_sleep_mask_001",
  "type": "emotion_chat",
  "payload": {
    "text": "我今天有点焦虑,睡不着",
    "scene": "sleep",
    "volume": 35,
    "noise": "rain",
    "user_state": "anxious"
  }
}

ai_companion.c 示例

复制代码
复制代码
#include <stdio.h>
#include <string.h>
#include "ai_companion.h"
#include "audio_manager.h"

typedef enum {
    AI_EVT_WAKEUP = 0,
    AI_EVT_USER_SPEECH_START,
    AI_EVT_USER_SPEECH_END,
    AI_EVT_SERVER_TEXT,
    AI_EVT_TTS_STREAM,
    AI_EVT_FINISH,
    AI_EVT_ERROR
} ai_event_t;

static bool s_ai_connected = false;

void ai_companion_init(void)
{
    printf("AI情绪陪伴模块初始化\n");
    // websocket_client_init(AI_SERVER_URL);
}

void ai_companion_connect(void)
{
    printf("连接AI服务器\n");
    // websocket_client_start();
    s_ai_connected = true;
}

void ai_companion_on_wakeup(void)
{
    if (!s_ai_connected) {
        ai_companion_connect();
    }

    printf("AI已唤醒,请开始说话\n");
    audio_manager_set_state(AUDIO_STATE_AI_LISTENING);

    // mic_start_capture();
    // vad_start();
}

void ai_companion_send_text(const char *text)
{
    if (!s_ai_connected || text == NULL) {
        return;
    }

    char json[512];

    snprintf(json, sizeof(json),
        "{"
        "\"device_id\":\"%s\","
        "\"type\":\"emotion_chat\","
        "\"payload\":{"
            "\"text\":\"%s\","
            "\"scene\":\"sleep\","
            "\"noise\":\"rain\""
        "}"
        "}",
        DEVICE_NAME,
        text
    );

    printf("发送AI请求: %s\n", json);

    // websocket_send_text(json);
}

void ai_companion_on_server_reply(const char *reply)
{
    printf("AI回复文本: %s\n", reply);

    /*
     * 云端可返回:
     * 1. 文本
     * 2. TTS音频URL
     * 3. Opus/PCM流
     * 4. 推荐白噪音类型
     */

    audio_manager_set_state(AUDIO_STATE_AI_SPEAKING);

    // tts_play(reply);
}

void ai_companion_finish(void)
{
    printf("AI陪伴结束,切回助眠白噪音\n");
    audio_manager_set_state(AUDIO_STATE_WHITE_NOISE);
}

8. 小程序下发配置

四博AI开发宝典中已经包含BluFi配网和小程序接入流程,产品化时建议把Wi-Fi配置、AI服务地址、默认音色、白噪音类型、定时关闭时间都放到小程序端配置。

设备端接收配置示例:

复制代码
复制代码
{
  "cmd": "set_sleep_config",
  "data": {
    "noise": "rain",
    "volume": 30,
    "timer_min": 45,
    "ai_enable": true,
    "voice": "soft",
    "wake_word": "小博小博"
  }
}

C语言解析逻辑示例:

复制代码
复制代码
#include "cJSON.h"
#include "audio_manager.h"

void app_handle_config_json(const char *json_str)
{
    cJSON *root = cJSON_Parse(json_str);
    if (!root) {
        printf("JSON解析失败\n");
        return;
    }

    cJSON *cmd = cJSON_GetObjectItem(root, "cmd");
    cJSON *data = cJSON_GetObjectItem(root, "data");

    if (cmd && data && strcmp(cmd->valuestring, "set_sleep_config") == 0) {
        cJSON *volume = cJSON_GetObjectItem(data, "volume");
        cJSON *noise = cJSON_GetObjectItem(data, "noise");
        cJSON *timer = cJSON_GetObjectItem(data, "timer_min");

        if (volume) {
            audio_manager_set_volume(volume->valueint);
        }

        if (noise && noise->valuestring) {
            if (strcmp(noise->valuestring, "white") == 0) {
                audio_manager_start_noise(NOISE_WHITE);
            } else if (strcmp(noise->valuestring, "brown") == 0) {
                audio_manager_start_noise(NOISE_BROWN);
            } else if (strcmp(noise->valuestring, "rain") == 0) {
                audio_manager_start_noise(NOISE_RAIN);
            }
        }

        if (timer) {
            printf("设置定时关闭: %d分钟\n", timer->valueint);
            // sleep_timer_start(timer->valueint);
        }
    }

    cJSON_Delete(root);
}

9. 低功耗策略

AI眼罩是可穿戴音频产品,功耗比普通智能音箱更敏感。建议采用以下策略:

复制代码
复制代码
1. 白噪音本地播放,减少Wi-Fi常连接
2. 非AI对话时关闭麦克风采集
3. 定时关闭后进入light sleep或deep sleep
4. VB6824负责离线唤醒,主控保持低功耗
5. 蓝牙只在配网或配置时开启
6. 音频功放使用EN脚控制,空闲时关闭

参考代码:

复制代码
复制代码
void power_enter_sleep_after_audio_stop(void)
{
    printf("准备进入低功耗模式\n");

    // amp_enable(false);
    // mic_power_enable(false);
    // wifi_stop_if_not_needed();
    // ble_stop_if_not_needed();

    /*
     * 量产时根据唤醒源选择:
     * 1. GPIO触摸唤醒
     * 2. RTC定时唤醒
     * 3. 外部语音芯片中断唤醒
     */

    // esp_sleep_enable_ext0_wakeup(TOUCH_KEY_GPIO, 0);
    // esp_light_sleep_start();
}

10. 产品化扩展

结合四博现有AI智能音响资料,后续可以扩展:

复制代码
复制代码
1. 声音克隆:用户选择专属陪伴声音
2. 声纹识别:区分家庭成员
3. 闹钟提醒:柔和音乐 + 震动唤醒
4. 情绪标签:焦虑、疲惫、开心、孤独
5. 小程序素材更新:白噪音包、冥想课程、睡前故事
6. OTA升级:持续更新AI能力
7. CozyLife联动:睡觉时关闭灯光、打开香薰、调节空调

四博产品资料中的AI智能音响已经规划了AI大模型、蓝牙音响、闹钟、声音克隆、声纹识别、APP、小程序和改唤醒词等能力,这些可以作为AI眼罩方案的功能演进路线。


11. 总结

这套四博AI睡眠眼罩方案,本质上是把AI智能音箱从"桌面设备"变成"贴身设备"。

技术上,它由以下几个核心模块组成:

复制代码
复制代码
ESP32-S3:负责Wi-Fi、BLE、音频流、AI通信和主控逻辑
VB6824:负责离线唤醒和本地语音命令
I2S Codec:负责麦克风采集和音频播放
小程序/App:负责配网、参数配置和内容管理
AI云端:负责情绪理解、对话生成和TTS输出

最终产品可以覆盖睡眠助眠、情绪陪伴、音乐放松、儿童睡前故事、银发陪伴、午休冥想等多个场景。相比普通蓝牙眼罩,它有AI能力;相比普通智能音箱,它更私密、更贴身、更适合睡眠场景。

相关推荐
在线打码1 小时前
Claude Code 内网离线极简部署指南
人工智能·ai·npm·node·claudecode
大力财经1 小时前
智能体时代如何衡量“DAA“?百度新全栈AI云给出答案
人工智能·百度·dubbo
浔川python社1 小时前
浔川社团联合会关于 2026 年度重点项目入选公告
人工智能·浔川代码编辑器v4.1.0
夜影风1 小时前
LangGraph实战:搭建一个带人工介入的智能客服系统
人工智能·langchain·langgraph
测试员周周1 小时前
【Appium 系列】第04节-Page Object 模式 — BasePage 基类设计
开发语言·数据库·人工智能·python·语言模型·appium·web app
学习论之费曼学习法1 小时前
AI 入门 30 天挑战 - Day 29 - 面试准备指南
人工智能·面试·职场和发展
爱学习的徐徐1 小时前
监督学习核心算法:单变量线性回归
人工智能·机器学习
JavaGuide1 小时前
万字详解 Harness Engineering:六层架构、上下文管理与一线团队实战
人工智能·ai编程
java1234_小锋1 小时前
Spring AI 2.0 开发Java Agent智能体 - 工具调用(Function Calling / Tools)
java·人工智能·spring