2025年5月1日

ElatoAI - 基于Arduino ESP32的实时语音AI智能体

Elato Logo

本指南展示如何利用OpenAI Realtime API、ESP32、安全WebSockets和Deno边缘函数构建一个AI语音智能体设备,实现超过10分钟不间断的全球对话。

本README的活跃版本可在ElatoAI获取。

⚡️ DIY硬件设计

参考实现采用了一个ESP32-S3微控制器,仅需极少量额外组件:

Hardware Setup

必需组件:

  • ESP32-S3 开发板
  • I2S麦克风(例如:INMP441)
  • I2S 放大器和扬声器(例如 MAX98357A)
  • 点击按钮开始/停止对话
  • RGB LED灯用于视觉反馈
  • 可选:触摸传感器用于替代控制

硬件选项: 完整组装的PCB和设备可在ElatoAI商店购买。

📱 应用设计

通过您自己的网页应用从手机控制您的ESP32 AI设备。

App Screenshots
从一系列AI角色中选择与您的AI实时对话交流创建个性化的AI角色

✨ 快速入门教程

Watch Demo on YouTube
  1. 克隆仓库

前往 ElatoAI GitHub 仓库 并克隆该仓库。

git clone https://github.com/akdeb/ElatoAI.git
cd ElatoAI
  1. 设置您的环境变量 (OPENAI_API_KEY, SUPABASE_ANON_KEY)

frontend-nextjs目录中,创建一个.env.local文件并设置您的环境变量。

cd frontend-nextjs
cp .env.example .env.local
 
# In .env.local, set your environment variables 
# NEXT_PUBLIC_SUPABASE_ANON_KEY=<your-supabase-anon-key>
# OPENAI_API_KEY=<your-openai-api-key>

server-deno 目录中,创建一个 .env 文件并设置您的环境变量。

cd server-deno
cp .env.example .env
 
# In .env, set your environment variables 
# SUPABASE_KEY=<your-supabase-anon-key>
# OPENAI_API_KEY=<your-openai-api-key>
  1. 启动Supabase

安装 Supabase CLI 并设置您的本地 Supabase 后端。从根目录运行:

brew install supabase/tap/supabase
supabase start # Starts your local Supabase server with the default migrations and seed data.
  1. 设置你的NextJS前端

(参见前端README文档)

frontend-nextjs目录下,运行以下命令。(登录凭证: 邮箱:admin@elatoai.com,密码:admin

cd frontend-nextjs
npm install
 
# Run the development server
npm run dev
  1. 启动 Deno 服务器

(查看 Deno 服务器 README)

# Navigate to the server directory
cd server-deno
 
# Run the server at port 8000
deno run -A --env-file=.env main.ts
  1. 设置ESP32设备固件

(参见ESP32设备README)

Config.cpp文件中将ws_serverbackend_server设置为您的本地IP地址。在控制台中运行ifconfig命令,找到en0 -> inet -> 192.168.1.100(您的Wifi网络可能显示不同地址)。这将指示ESP32设备连接到运行在您本地机器上的NextJS前端和Deno服务器。所有服务都应位于同一个Wifi网络中。

  1. 设置ESP32设备的WiFi

构建并上传固件到您的ESP32设备。ESP32将开启一个ELATO-DEVICE认证门户用于连接WiFi。连接后访问http://192.168.4.1配置设备无线网络。

  1. 配置好WiFi凭据后,将设备关闭再重新开启,它应该就能连接到您的WiFi和服务器。

  2. 现在你可以与你的AI角色对话了!

🚀 准备好起飞了吗?

  1. 通过将您的ESP32设备的MAC地址和唯一的用户代码添加到Supabase中的devices表来注册您的设备。

专业提示: 要查找您的ESP32-S3设备的MAC地址,请使用PlatformIO构建并上传test/print_mac_address_test.cpp,然后查看串行监视器。

  1. 在您的前端客户端设置页面上,添加唯一的用户代码,以便将该设备与您在Supabase中的账户关联起来。

  2. 如果在本地测试,可以保持启用firmware-arduino/Config.h中的DEV_MODE宏,并设置Deno服务器环境变量以使用本地IP地址进行测试。

  3. 现在您可以通过重复上述流程,将多个设备注册到您的账户。

项目架构

ElatoAI由三个主要组件组成:

  1. 前端客户端 (Next.js 托管在Vercel上) - 用于创建并与您的AI智能体对话,然后将其"发送"到您的ESP32设备
  2. 边缘服务器功能 (Deno 运行在 Deno/Supabase Edge 上) - 用于处理来自 ESP32 设备的 WebSocket 连接和 OpenAI API 调用
  3. ESP32物联网客户端 (PlatformIO/Arduino) - 用于接收来自边缘服务器功能的websocket连接,并通过Deno边缘服务器将音频发送至OpenAI API。

🌟 主要功能

  1. 实时语音转语音: 由OpenAI实时API驱动的即时语音转换。
  2. 创建自定义AI智能体: 创建具有不同个性和声音的自定义智能体。
  3. 可自定义语音: 从多种声音和个性中进行选择。
  4. 安全WebSocket: 可靠、加密的WebSocket通信。
  5. 服务器语音活动检测话轮检测: 智能对话流程处理,确保交互流畅。
  6. Opus音频压缩: 以最小带宽实现高质量音频流传输。
  7. 全球边缘性能: 低延迟的Deno边缘函数确保全球对话无缝进行。
  8. ESP32 Arduino框架: 优化且易于使用的硬件集成。
  9. 对话历史: 查看您的对话历史记录。
  10. 设备管理与认证: 注册并管理您的设备。
  11. 用户认证: 安全的用户认证和授权。
  12. 通过WebRTC和Websockets进行对话: 在NextJS网页应用中通过WebRTC与您的AI交谈,在ESP32上通过websockets进行交互。
  13. 音量控制: 通过NextJS网页应用控制ESP32扬声器的音量。
  14. 实时转录文本: 您对话的实时转录文本存储在Supabase数据库中。
  15. OTA更新: 用于ESP32固件的无线更新功能。
  16. 带认证门户的WiFi管理: 从ESP32设备连接到您的WiFi网络。
  17. 恢复出厂设置: 通过NextJS网页应用将ESP32设备恢复出厂设置。
  18. 按钮和触摸支持: 使用按钮或触摸传感器控制ESP32设备。
  19. 无需PSRAM: ESP32设备运行语音转语音AI无需PSRAM。
  20. Web客户端的OAuth认证: 为您的用户提供管理其AI角色和设备的OAuth认证服务。

🛠 技术栈

组件使用的技术
前端Next.js, Vercel
后端Supabase DB
边缘函数Deno / Supabase 边缘运行时上的边缘函数
物联网客户端PlatformIO, Arduino框架, ESP32-S3
音频编解码器Opus
通信安全WebSockets
ArduinoJson, WebSockets, AsyncWebServer, ESP32_Button, Arduino Audio Tools, ArduinoLibOpus

📈 核心使用场景

我们有一个Usecases.md文件,概述了Elato AI设备或其他任何自定义对话式AI设备的核心使用场景。

🗺️ 高层流程概览

App Screenshots

项目结构

App Screenshots

⚙️ PlatformIO 配置

[env:esp32-s3-devkitc-1]
platform = espressif32 @ 6.10.0
board = esp32-s3-devkitc-1
framework = arduino
monitor_speed = 115200
 
lib_deps =
    bblanchon/ArduinoJson@^7.1.0
    links2004/WebSockets@^2.4.1
    ESP32Async/ESPAsyncWebServer@^3.7.6
    https://github.com/esp-arduino-libs/ESP32_Button.git#v0.0.1
    https://github.com/pschatzmann/arduino-audio-tools.git#v1.0.1
    https://github.com/pschatzmann/arduino-libopus.git#a1.1.0

📊 重要统计

  • ⚡️ 延迟: 全球往返时间小于2秒
  • 🎧 音频质量: Opus编码格式,比特率12kbps(高清晰度)
  • 不间断对话: 最长10分钟的持续对话
  • 🌎 全球可用性: 通过Deno的边缘计算进行优化

🛡 安全

  • 安全WebSocket (WSS) 用于加密数据传输
  • 可选:使用256位AES加密API密钥
  • Supabase DB 用于安全认证
  • 所有表的Supabase行级安全(RLS)

🚫 限制

  • 连接到边缘服务器时3-4秒的冷启动时间
  • 单次连续对话时长限制为10分钟
  • 当超过挂钟时间时,边缘服务器停止
  • ESP32上没有语音中断检测功能

许可证

本项目采用MIT许可证授权 - 详情请参阅LICENSE文件。


本示例是OpenAI Cookbook的一部分。如需查看完整项目和最新更新,请访问ElatoAI,如果您觉得有用,请给它一个⭐️!