我开源了一个基于 ESP32 和 OpenAI Realtime API 的 AI 玩具公司
akdeb/ElatoAI
基于 Arduino ESP32 和 Secure Websockets,并使用 Deno 边缘函数,通过 OpenAI Realtime API 实现实时 AI 语音,可在全球范围内进行超过 10 分钟的不间断对话,适用于 AI 玩具、AI 伙伴、AI 设备等。 elatoai.com/labs
许可证
MIT license 144 stars 7 forks Branches Tags Activity
akdeb/ElatoAI
文件目录
名称 | 名称 | 最后提交信息 | 最后提交日期 ---|---|---|--- .vscode | .vscode | | firmware-arduino | firmware-arduino | | frontend-nextjs | frontend-nextjs | | server-deno | server-deno | | supabase | supabase | | .DS_Store | .DS_Store | | LICENSE | LICENSE | | README.md | README.md | | pcb-design.png | pcb-design.png | |
🚀 ElatoAI:用于 ESP32 的实时 AI 语音
基于 OpenAI Realtime API、ESP32、Secure WebSockets 和 Deno Edge Functions 的实时 AI 语音,可实现超过 10 分钟的不间断全球对话。
演示视频
Elato.open-source.conversational.AI.device.mp4
⚡️ 硬件设计
入门指南
- 安装 Supabase CLI 并设置本地 Supabase 后端。 在根目录下运行:
brew install supabase/tap/supabase
supabase start # 使用默认迁移和种子数据启动本地 Supabase 服务器。
- 设置你的 NextJS 前端。 (参见 Frontend README) 从
frontend-nextjs
目录中,运行以下命令。 (登录凭据: Email: admin@elatoai.com, Password: admin)
cd frontend-nextjs
npm install
# 设置你的环境变量
cp .env.example .env.local
# NEXT_PUBLIC_SUPABASE_ANON_KEY=<your_supabase_anon_key>
# OPENAI_API_KEY=<your_openai_api_key>
# 运行开发服务器
npm run dev
- 将你的 ESP32-S3 设备的 MAC 地址添加到 NextJS 前端的 Settings page 中。 这会将你的设备链接到你的帐户。 要查找 ESP32-S3 设备的 MAC 地址,请使用 PlatformIO 构建并上传
test/print_mac_address_test.cpp
。 - 在
server-deno/.env
和frontend-nextjs/.env.local
文件中添加你的 OpenAI API 密钥。
OPENAI_API_KEY=<your_openai_api_key>
- 启动 Deno 服务器。 (参见 Deno server README)
# 导航到服务器目录
cd server-deno
# 设置你的环境变量
cp .env.example .env
# NEXT_PUBLIC_SUPABASE_ANON_KEY=<your_supabase_anon_key>
# OPENAI_API_KEY=<your_openai_api_key>
# 在端口 8000 上运行服务器
deno run -A --env-file=.env main.ts
- 设置你的 ESP32 Arduino 客户端。 (参见 ESP32 README) 在 PlatformIO 上,首先
Build
项目,然后将项目Upload
到你的 ESP32。 - ESP32 应该打开一个 AP
ELATO-DEVICE
以连接到 Wifi。 连接到它并转到http://192.168.4.1
以配置设备 wifi。 - 配置好 Wifi 后,关闭设备然后再打开,它应该连接到你的 Wifi 和 Deno 边缘服务器。
- 现在你可以和你的 AI 角色对话了!
项目架构
ElatoAI 由三个主要组件组成:
- 前端客户端 (托管在 Vercel 上的
Next.js
) - 用于创建和与你的 AI 代理对话,并将其“发送”到你的 ESP32 设备 - 边缘服务器函数 (
Deno
在 Deno/Supabase Edge 上运行) - 用于处理来自 ESP32 设备的 websocket 连接和 OpenAI API 调用 - ESP32 IoT 客户端 (
PlatformIO/Arduino
) - 通过 Deno 边缘服务器接收来自边缘服务器函数的 websocket 连接,并将音频发送到 OpenAI API。
🌟 特性
- 实时语音到语音:由 OpenAI 的 Realtime APIs 提供支持的即时语音转换。
- 创建自定义 AI 代理:创建具有不同个性和声音的自定义代理。
- 可定制的声音:从各种声音和个性中进行选择。
- Secure WebSockets:可靠的加密 WebSocket 通信。
- 服务器 VAD 转向检测:智能对话流程处理,实现流畅的交互。
- Opus 音频压缩:以最小的带宽实现高质量的音频流。
- 全球边缘性能:低延迟 Deno Edge Functions,确保无缝的全球对话。
- ESP32 Arduino Framework:优化且易于使用的硬件集成。
- 对话历史记录:查看你的对话历史记录。
- 设备管理:注册和管理你的设备。
- 用户身份验证:安全的用户身份验证和授权。
- 通过 WebRTC 和 Websockets 进行对话:使用 NextJS webapp 上的 WebRTC 和 ESP32 上的 websockets 与你的 AI 对话。
- 音量控制:从 NextJS webapp 控制 ESP32 扬声器的音量。
- 实时转录:你的对话的实时转录存储在 Supabase DB 中。
🛠 技术栈
组件 | 使用的技术 ---|--- 前端 | Next.js, Vercel 后端 | Supabase DB 边缘函数 | Deno Edge Functions on Deno/Supabase IoT 客户端 | PlatformIO, Arduino Framework, ESP32-S3 音频编解码器 | Opus 通信 | Secure WebSockets 库 | ArduinoJson, WebSockets, AsyncWebServer, ESP32_Button, Arduino Audio Tools, ArduinoLibOpus
🗺️ 高级流程
flowchart TD
User[用户语音] --> ESP32
ESP32[ESP32 设备] -->|WebSocket| Edge[Deno Edge Function]
Edge -->|OpenAI API| OpenAI[OpenAI Realtime API]
OpenAI --> Edge
Edge -->|WebSocket| ESP32
ESP32 --> User[AI 生成的语音]
项目结构
graph TD
repo[ElatoAI]
repo --> frontend[Frontend Vercel NextJS]
repo --> deno[Deno Edge Function]
repo --> esp32[ESP32 Arduino Client]
deno --> supabase[Supabase DB]
frontend --> supabase
esp32 --> websockets[Secure WebSockets]
esp32 --> opus[Opus Codec]
esp32 --> audio_tools[arduino-audio-tools]
esp32 --> libopus[arduino-libopus]
esp32 --> ESPAsyncWebServer[ESPAsyncWebServer]
⚙️ 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
📊 重要统计数据
- ⚡️ 延迟:全球范围内的往返时间 <1 秒
- 🎧 音频质量:24kbps 的 Opus 编解码器(高清晰度)
- ⏳ 不间断对话:长达 10 分钟的连续对话
- 🌎 全球可用性:通过 Deno 的边缘计算进行优化
🛡 安全性
- 用于加密数据传输的 Secure WebSockets (WSS)
- 可选:使用 256 位 AES 进行 API 密钥加密
- 用于安全身份验证的 Supabase DB
- Supabase RLS 用于所有表
🚫 限制
- 连接到边缘服务器时,3-4 秒的冷启动时间
- 最多 10 分钟的不间断对话
- 超过挂钟时间时,边缘服务器停止
- ESP32 上没有语音中断检测
🤝 贡献
- 在 ESP32 上寻找语音中断检测
- 添加 Arduino IDE 支持
- 在 Deno Edge 上添加工具调用支持
欢迎贡献
- Fork 这个存储库。
- 创建你的功能分支 (
git checkout -b feature/EpicFeature
)。 - 提交你的更改 (
git commit -m 'Add EpicFeature'
)。 - 推送到分支 (
git push origin feature/EpicFeature
)。 - 打开一个 PR
许可证
本项目根据 MIT 许可证获得许可 - 有关详细信息,请参阅 LICENSE 文件。
如果您发现这个项目有趣或有用,请给一个 GitHub ⭐️。 这有很大帮助!
关于
基于 Arduino ESP32 和 Secure Websockets,并使用 Deno 边缘函数,通过 OpenAI Realtime API 实现实时 AI 语音,可在全球范围内进行超过 10 分钟的不间断对话,适用于 AI 玩具、AI 伙伴、AI 设备等。 elatoai.com/labs
主题
arduino ai hardware esp32 realtime openai deno realtime-api speech-to-speech supabase