标题
基于 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能力;相比普通智能音箱,它更私密、更贴身、更适合睡眠场景。