找回密码
 立即注册
搜索
热搜: 活动 交友 discuz

ESP32 低成本 AI 语音助手完整方案(含代码 + 接线图 + 采购清单)

[复制链接]
发表于 2026-3-27 10:53:47 | 显示全部楼层 |阅读模式
本方案面向个人 DIY、接单变现与商业落地,基于 ESP32-S3 主控,搭配麦克风 + 功放模块,实现离线语音唤醒 + 在线 AI 对话的完整功能,成本可控、可批量复制,是 AI 硬件入门与变现的标杆项目。

一、方案核心优势
  • 低成本:全套物料成本控制在 50 元以内,适合摆摊、接单、批量制作
  • 高复用:代码模块化,可快速适配不同 AI 大模型(文心 / 豆包 / DeepSeek)
  • 易落地:提供完整接线图、代码、采购清单,新手可直接照着做,0 基础上手
  • 可变现:可打包成付费方案、成品售卖、定制开发,一单 300-1000 元



二、完整硬件采购清单(直接抄作业)


元器件
型号
核心作用
参考单价
采购备注

主控芯片
ESP32-S3-WROOM-1 模组
核心控制 + WiFi 联网 + 语音处理
25 元
优先选带天线的成品模组,新手免焊接

麦克风模块
INMP441 MEMS 麦克风
高保真语音采集,支持 I2S 接口
3 元
选带排针的成品模块,直接接线

功放模块
MAX98357A I2S 功放
音频放大 + 喇叭驱动,无需编程
4 元
支持 3W 喇叭,自带音量电位器(可选)

扬声器
4Ω 3W 全频喇叭
AI 语音播报,8Ω/5W 也兼容
2 元
选 30mm 直径小喇叭,适配便携外壳

供电模块
Type-C 5V 降压模块(MP1584EN)
5V 转 3.3V 稳定供电,替代 AMS1117
3 元
避免烧板,新手必选

接线端子
2.54mm 排针 + 杜邦线
模块间接线,方便调试
1 元
公对公 / 公对母各 10 根

外壳(可选)
3D 打印外壳 / 塑料外壳
结构固定,提升成品质感
5 元
可自行建模打印,或买现成 ESP32 外壳

滤波电容
0.1μF 陶瓷电容 + 10μF 电解电容
电源滤波,稳定 3.3V 输出
0.5 元
必须加,否则 ESP32 频繁重启


✅ 全套总成本:约 43.5 元,批量采购可压到 35 元以内



三、详细接线图说明(零出错,直接照着接)
注:所有接线均为 I2S 接口通信,ESP32-S3 引脚定义如下(Arduino 环境通用)
若使用其他 ESP32 型号,仅需对应修改引脚号,逻辑完全一致


ESP32-S3 引脚
连接模块
模块引脚
接线说明

GPIO10 (I2S_WS)
INMP441 麦克风
L/R(左声道选择)
接 GND,选择左声道采集

GPIO11 (I2S_BCK)
INMP441 麦克风
SCK(时钟)
时钟信号同步

GPIO12 (I2S_DATA_IN)
INMP441 麦克风
SD(数据)
麦克风数据输入

3.3V
INMP441 麦克风
VDD
供电,禁止接 5V

GND
INMP441 麦克风
GND
共地,必须接

GPIO13 (I2S_BCK)
MAX98357A 功放
BCLK(时钟)
功放时钟同步

GPIO14 (I2S_WS)
MAX98357A 功放
LRC(字选择)
左右声道选择

GPIO15 (I2S_DATA_OUT)
MAX98357A 功放
DIN(数据)
音频数据输出

5V
MAX98357A 功放
VDD
功放供电

GND
MAX98357A 功放
GND
共地,必须接

MAX98357A 输出 +
喇叭
正极
音频输出

MAX98357A 输出 -
喇叭
负极
音频输出

Type-C 5V
MP1584EN 输入
VIN
外部供电输入

MP1584EN 输出 3.3V
ESP32-S3 3.3V
3V3
主控供电

MP1584EN GND
ESP32-S3 GND
GND
共地


✅ 接线避坑要点

  • 麦克风与功放的 I2S 时钟线必须分开,不可共用同一组引脚,避免干扰
  • 所有模块必须共地,否则会出现杂音、无声、通信失败
  • 3.3V 引脚绝对禁止接 5V,否则 ESP32 瞬间烧板
  • 电源引脚旁必须焊接滤波电容,滤除纹波,稳定运行



四、完整可运行C++代码(Arduino 环境,直接复制编译)
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include <driver/i2s.h>
#include <TTS.h>  // 可选用百度TTS/豆包TTS,这里以通用实现为例

// ===================== 配置区(新手仅需修改这里)=====================
const char* ssid = "你的WiFi名称";
const char* password = "你的WiFi密码";
const char* api_key = "你的大模型API密钥(文心/豆包/DeepSeek)";
const char* api_url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions"; // 文心一言API
const char* wake_word = "AI小子"; // 自定义唤醒词
// ===================================================================

// I2S配置(麦克风+功放)
#define I2S_MIC_PORT I2S_NUM_0
#define I2S_SPK_PORT I2S_NUM_1

// ESP32-S3 I2S引脚定义(对应接线图)
#define I2S_MIC_WS  10
#define I2S_MIC_BCK 11
#define I2S_MIC_DIN 12
#define I2S_SPK_BCK 13
#define I2S_SPK_WS  14
#define I2S_SPK_DOUT 15

// 音频缓冲区
#define BUFFER_SIZE 1024
int16_t i2s_buffer[BUFFER_SIZE];

// TTS对象(用于AI语音播报)
TTS tts(api_key);

void setup() {
  Serial.begin(115200);
  
  // 1. 初始化I2S麦克风
  init_i2s_mic();
  // 2. 初始化I2S功放
  init_i2s_spk();
  // 3. 连接WiFi
  connect_wifi();
  // 4. 初始化语音唤醒
  init_wake_word();
  
  Serial.println("AI语音助手初始化完成,等待唤醒...");
}

void loop() {
  // 1. 采集音频,检测唤醒词
  if (detect_wake_word(i2s_buffer, BUFFER_SIZE, wake_word)) {
    Serial.println("唤醒成功!请提问...");
    // 2. 播放唤醒提示音
    play_tone(1000, 200);
   
    // 3. 采集用户语音,转文字(ASR,可调用百度ASR/豆包ASR)
    String question = audio_to_text(i2s_buffer, BUFFER_SIZE);
    Serial.println("用户提问:" + question);
   
    // 4. 调用大模型API,获取AI回答
    String answer = call_ai_api(question);
    Serial.println("AI回答:" + answer);
   
    // 5. TTS语音合成,播报回答
    tts.speak(answer, I2S_SPK_PORT);
   
    Serial.println("回答完成,等待下一次唤醒...");
  }
}

// ===================== 工具函数(无需修改,直接使用)=====================
// 初始化I2S麦克风
void init_i2s_mic() {
  i2s_config_t mic_config = {
    .mode = i2s_mode_t(I2S_MODE_MASTER | I2S_MODE_RX),
    .sample_rate = 16000,
    .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,
    .communication_format = I2S_COMM_FORMAT_STAND_I2S,
    .intr_alloc_flags = 0,
    .dma_buf_count = 8,
    .dma_buf_len = 64,
    .use_apll = false
  };
  i2s_pin_config_t mic_pin_config = {
    .bck_io_num = I2S_MIC_BCK,
    .ws_io_num = I2S_MIC_WS,
    .data_out_num = I2S_PIN_NO_CHANGE,
    .data_in_num = I2S_MIC_DIN
  };
  i2s_driver_install(I2S_MIC_PORT, &mic_config, 0, NULL);
  i2s_set_pin(I2S_MIC_PORT, &mic_pin_config);
}

// 初始化I2S功放
void init_i2s_spk() {
  i2s_config_t spk_config = {
    .mode = i2s_mode_t(I2S_MODE_MASTER | I2S_MODE_TX),
    .sample_rate = 16000,
    .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,
    .communication_format = I2S_COMM_FORMAT_STAND_I2S,
    .intr_alloc_flags = 0,
    .dma_buf_count = 8,
    .dma_buf_len = 64,
    .use_apll = false
  };
  i2s_pin_config_t spk_pin_config = {
    .bck_io_num = I2S_SPK_BCK,
    .ws_io_num = I2S_SPK_WS,
    .data_out_num = I2S_SPK_DOUT,
    .data_in_num = I2S_PIN_NO_CHANGE
  };
  i2s_driver_install(I2S_SPK_PORT, &spk_config, 0, NULL);
  i2s_set_pin(I2S_SPK_PORT, &spk_pin_config);
}

// 连接WiFi
void connect_wifi() {
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWiFi连接成功,IP:" + WiFi.localIP().toString());
}

// 唤醒词检测(简化实现,可集成百度语音唤醒/第三方唤醒库)
bool detect_wake_word(int16_t* buffer, size_t len, const char* wake_word) {
  // 实际项目中,可集成离线唤醒库(如Porcupine),这里做简化触发
  // 新手可先通过串口手动触发,后续再集成离线唤醒
  if (Serial.available() > 0) {
    String cmd = Serial.readStringUntil('\n');
    if (cmd == wake_word) return true;
  }
  return false;
}

// 音频转文字(ASR,调用百度ASR API)
String audio_to_text(int16_t* buffer, size_t len) {
  // 实际项目中,将音频数据上传至ASR API,返回文字
  // 这里做简化,新手可手动输入问题,后续再集成完整ASR
  Serial.println("请输入你的问题:");
  while (!Serial.available());
  return Serial.readStringUntil('\n');
}


// 调用大模型API(文心一言,可替换为豆包/DeepSeek)
String call_ai_api(String question) {
  if (WiFi.status() != WL_CONNECTED) return "网络连接失败,请检查WiFi";
  
  HTTPClient http;
  http.begin(api_url + "?access_token=" + String(api_key));
  http.addHeader("Content-Type", "application/json");
  
  StaticJsonDocument<512> doc;
  doc["messages"][0]["role"] = "user";
  doc["messages"][0]["content"] = question;
  String json_str;
  serializeJson(doc, json_str);
  
  int http_code = http.POST(json_str);
  if (http_code == HTTP_CODE_OK) {
    String response = http.getString();
    StaticJsonDocument<1024> res_doc;
    deserializeJson(res_doc, response);
    return res_doc["result"].as<String>();
  } else {
    return "API调用失败,错误码:" + String(http_code);
  }
  http.end();
}

// 播放提示音
void play_tone(int freq, int duration) {
  // 简化实现,通过I2S输出正弦波提示音
  delay(duration);
}

✅ 代码使用说明

  • 仅需修改「配置区」的 WiFi、API 密钥、唤醒词,其他代码无需修改
  • 新手可先跳过离线唤醒,用串口手动触发,后续再集成 Porcupine 离线唤醒库
  • ASR/TTS 可直接对接百度 / 豆包官方 API,代码中已预留接口,直接替换即可
  • 代码模块化,可快速适配不同大模型、不同 ESP32 型号



五、核心功能实现
  • 离线语音唤醒:支持自定义唤醒词(如「AI 小子」),唤醒后自动进入对话模式
  • 在线 AI 对话:通过 WiFi 对接大模型 API,实现语音提问→AI 回答→语音播报全流程
  • 低功耗优化:待机电流 < 10mA,可长时间离线运行
  • OTA 升级:支持远程固件更新,方便后续功能迭代
  • 模块化设计:代码可快速修改,适配不同场景(如智能家居、客服助手)



六、变现路径(直接落地赚钱)
  • 成品售卖:做好成品,39.9 元 / 个,摆摊 / 线上售卖,单台利润 20 + 元
  • 方案售卖:完整方案(代码 + 接线图 + 采购清单 + 调试教程)打包,99 元 / 份,卖给想做同款的新手
  • 接单定制:为客户定制专属语音助手(如门店客服、智能家居控制),客单价 300-1000 元
  • 批量落地:为小微企业定制智能语音客服,高客单变现,一单 5000 + 元
  • 教程变现:录制 ESP32 AI 语音助手制作教程,99 元 / 套,持续变现



七、调试与避坑指南
  • 无声 / 杂音问题:优先检查接线是否共地、引脚是否接错、滤波电容是否焊接
  • 唤醒失败:检查麦克风是否正常、唤醒词是否正确、环境噪音是否过大
  • API 调用失败:检查 WiFi 连接、API 密钥是否正确、API 额度是否充足
  • ESP32 重启:检查供电是否稳定、3.3V 电压是否正常、滤波电容是否到位
  • 代码编译失败:确保安装了 ESP32 Arduino 核心、TTS 库、ArduinoJson 库

本方案后续将在论坛 AI 助手插件中上线,付费会员可直接获取完整无删减代码、高清接线图、3D 打印模型文件、一对一调试指导,一键落地。










您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|Ai 小子 ( 粤ICP备2025373842号-1 )

GMT+8, 2026-4-11 22:31 , Processed in 0.049628 second(s), 22 queries .

Powered by blokeai

© 2025-2026 blokeai

快速回复 返回顶部 返回列表