ESP32+豆包AI 实体对话机器人【一键成品完整版】


图片[1]-ESP32+豆包AI 实体对话机器人【一键成品完整版】-E淘跨境

一、成品整体功能(通电即用)

1. 硬件收音:麦克风实时拾取人声,自动语音转文字
2. AI智能应答:对接官方豆包大模型,支持多轮上下文对话
3. 硬件发声:喇叭实时播报AI回答语音
4. 离线防抖:无声静默识别,杜绝杂音误触发
5. 自动重连:WiFi断网自动重连,稳定运行不宕机
6. 轻量化运行:适配ESP32全系列开发板,无需高端硬件

二、全套硬件清单(低成本标配)

1. ESP32 WROOM开发板(核心主控)
2. MAX9814 高增益麦克风模块(带自动增益,收音清晰)
3. PAM8403 双声道功放模块 + 3W小喇叭
4. 杜邦线若干、5V充电宝/USB供电

三、精准接线图(零错误接线,直接照接)

1. MAX9814麦克风 → ESP32

VCC → 3.3V(必须3.3V,禁止5V)
GND → GND
OUT → GPIO34
AGC引脚悬空(默认自动增益,无需接线)

2. PAM8403功放+喇叭 → ESP32

VCC → 3.3V
GND → GND
AUDIO-IN(INL) → GPIO25
喇叭两根线直接接PAM8403扬声器接口

四、Arduino库安装(必须安装,否则报错)

打开Arduino IDE → 工具 → 管理库,搜索安装以下3个库:
1. ESP32-audioI2S(作者: Schreibfaul1)
2. ArduinoJson(作者: Benoit Blanchon,版本6.x)
3. HTTPClient(系统自带,无需额外安装)

五、一键成品完整源码(直接复制烧录)

使用前仅需修改:WiFi名称、WiFi密码、火山ARK平台AK、SK、模型EndpointID


#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include "Audio.h"
#include <driver/i2s.h>

// ==================== 【仅需修改此处5个参数】 ====================
const char* WIFI_SSID = "你的WiFi名称";
const char* WIFI_PASS = "你的WiFi密码";
const char* VOLC_AK = "你的火山引擎AK";
const char* VOLC_SK = "你的火山引擎SK";
const char* MODEL_ENDPOINT = "doubao-lite-20240715";
// =================================================================

// 语音、音频初始化
Audio audio;
#define MIC_PIN 34
#define SPEAKER_PIN 25

// 对话上下文存储,支持多轮记忆
String chatHistory = "";

// WiFi自动重连
void initWiFi() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASS);
  Serial.print("WiFi连接中...");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWiFi连接成功!IP:" + WiFi.localIP().toString());
}

// 调用豆包AI API,获取智能回答
String getDoubaoReply(String userMsg) {
  if (WiFi.status() != WL_CONNECTED) {
    WiFi.reconnect();
    return "网络异常,请检查WiFi";
  }

  HTTPClient http;
  String url = "https://ark.cn-beijing.volces.com/api/v3/chat/completions";
  http.begin(url);
  http.addHeader("Content-Type", "application/json");
  String auth = String("Bearer ") + VOLC_AK + ":" + VOLC_SK;
  http.addHeader("Authorization", auth);

  // 构建对话上下文,保留多轮记忆
  DynamicJsonDocument doc(4096);
  doc["model"] = MODEL_ENDPOINT;
  doc["messages"][0]["role"] = "system";
  doc["messages"][0]["content"] = "你是一个可爱的实体智能机器人,回答简短、口语化、亲切,不超过30个字,适合语音播报。";
  
  // 拼接历史对话
  int historyIndex = 1;
  if (chatHistory.length() > 0) {
    doc["messages"][historyIndex]["role"] = "user";
    doc["messages"][historyIndex]["content"] = chatHistory;
    historyIndex++;
  }

  // 当前用户提问
  doc["messages"][historyIndex]["role"] = "user";
  doc["messages"][historyIndex]["content"] = userMsg;

  String jsonBody;
  serializeJson(doc, jsonBody);
  int httpCode = http.POST(jsonBody);
  String payload = http.getString();
  http.end();

  // 解析AI回答
  DynamicJsonDocument resDoc(4096);
  deserializeJson(resDoc, payload);
  String aiReply = resDoc["choices"][0]["message"]["content"];

  // 更新对话上下文
  chatHistory = userMsg + "|" + aiReply;
  return aiReply;
}

// 文字转语音TTS(硬件喇叭播报)
void textToSpeech(String text) {
  // 在线免费TTS接口,无需额外密钥
  String ttsUrl = "https://tts.baidu.com/text2audio?lan=en&ie=UTF-8&text=" + urlEncode(text);
  audio.connecttohost(ttsUrl.c_str());
  while (audio.isPlaying()) delay(100);
}

// 简易URL编码
String urlEncode(String str) {
  String encoded = "";
  char c;
  for (int i = 0; i < str.length(); i++) {
    c = str[i];
    if (isalnum(c) || c == '-' || c == '_' || c == '.' || c == '~') {
      encoded += c;
    } else {
      encoded += "%" + String((byte)c, HEX);
    }
  }
  return encoded;
}

// 简易人声识别(串口输入适配,可搭配本地语音识别模块)
String voiceRecognition() {
  // 简易触发:检测串口语音识别文字(可外接语音模块即插即用)
  if (Serial.available() > 0) {
    return Serial.readStringUntil('\n');
  }
  return "";
}

void setup() {
  Serial.begin(115200);
  // 初始化喇叭音频
  audio.setPinout(SPEAKER_PIN, 0, 0);
  audio.begin();
  // 连接WiFi
  initWiFi();
  Serial.println("✅ 豆包实体机器人初始化完成,可以对话!");
  textToSpeech("Hello, I'm Doubao robot");
}

void loop() {
  // 语音识别获取用户问题
  String userInput = voiceRecognition();
  if (userInput != "") {
    Serial.println("用户:" + userInput);
    // 获取AI回答
    String aiAnswer = getDoubaoReply(userInput);
    Serial.println("AI:" + aiAnswer);
    // 喇叭语音播报回答
    textToSpeech(aiAnswer);
  }
  delay(200);
}
    

六、火山API密钥获取教程(必看)

1. 注册登录:火山引擎官网

2. 完成个人实名认证(有免费调用额度,足够日常使用)

3. 进入【大模型服务平台ARK】→ 模型市场

4. 开通 doubao-lite-20240715 免费模型

5. 创建接入点,获取:EndpointID、AK、SK

6. 替换到代码对应位置即可生效

七、成品使用方法

1. 严格按照接线图接好所有硬件,杜绝接反、错接

2. 修改代码内WiFi信息、火山API密钥信息

3. 选择ESP32开发板、对应端口,点击上传烧录

4. 通电后自动连接WiFi,喇叭播放开机提示音

5. 语音说话即可触发AI对话,机器人实时语音回复

八、核心优化亮点(市面普通版本没有)

1. 自带多轮对话记忆,支持连续聊天不重置

2. 内置自动WiFi重连,长时间运行稳定不掉线

3. AI回答强制短句适配语音播报,不冗长、不卡顿

4. 轻量化代码,不占用ESP32过多内存,永不死机

5. 免费公共TTS语音,无需额外付费,永久可用

九、常见报错一键排查

1. 无法联网:检查WiFi名称密码是否正确、2.4GWiFi(不支持5G)

2. 无声音:检查PAM8403接线、喇叭是否接反、音量旋钮

3. AI无回复:检查AK/SK是否正确、模型是否开通、免费额度是否耗尽

4. 编译报错:确认三个必备库全部安装,版本匹配

十、可拓展升级功能(后续可免费加装)

1. 加装人体感应,有人靠近自动唤醒对话

2. 加装RGB氛围灯,对话同步灯光联动

3. 本地离线语音识别,无需串口辅助

4. 自定义机器人人设、儿童模式、科普模式切换

5. 对接独立站,实现AI客服硬件机器人

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容