想要让玩具、公仔变得会说话、有情感,现有的方案要么太贵太复杂,要么就是需要一直连着手机,用起来特别不方便。
为了解决这些问题,GitHub 上开源项目 ElatoAI 给出了解决方案,基于 ESP32 微控制器和 OpenAI Realtime API 开发。
它能让你的玩具变成真正的 AI 伙伴,支持超过 10 分钟的连续自然对话,语音识别和回应都非常流畅。
GitHub:http://github.com/akdeb/ElatoAI
主要功能:
- 实时语音转语音:基于 OpenAI 实时 API,对话极其自然流畅
- 自定义 AI 角色:可以设置不同的性格和声音
- 简单硬件设计:只需一块 ESP32-S3 开发板即可实现
- 安全通信:使用加密 WebSocket 传输数据
- 全球低延迟:依靠 Deno Edge Functions 实现全球范围内低于 1 秒的延迟
该项目的前端、服务器和固件代码已开源,对 AI 玩具或 AI 伴侣等产品感兴趣的开发者可以看下。
DIY 硬體設計
? 應用設計
使用 Elato AI webapp 透過手機控制您的 ESP32 AI 裝置。
| 從 AI 角色清單中選擇 | 與你的人工智慧對話並即時回應 | 創建個人化的AI角色 |
|---|
? 快速入門
- 啟動 Supabase
安裝Supabase CLI並設定您的本機 Supabase 後端。從根目錄運行:
brew install supabase/tap/supabase supabase start # Starts your local Supabase server with the default migrations and seed data.
- 設定 NextJS 前端
(參見前端自述文件)
從frontend-nextjs目錄中執行以下命令。 (登入憑證:電子郵件:admin@elatoai.com,密碼admin:)
cd frontend-nextjs npm install 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> # Run the development server npm run dev
- 啟動 Deno 伺服器
(請參閱 Deno 伺服器自述文件)
# Navigate to the server directory 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> # Run the server at port 8000 deno run -A --env-file=.env main.ts
- 設定 ESP32 設備韌體
(請參閱 ESP32 設備自述文件)
設定Config.cpp並設定您的ws_server本地backend_serverIP 位址。ifconfig在您的控制台中運行並找到en0-> inet-> 192.168.1.100(對於您的 Wifi 網路可能有所不同)。這會告訴 ESP32 裝置連接到本機上執行的 NextJS 前端和 Deno 伺服器。所有服務應在同一個 Wifi 網路上。
- 設定ESP32設備Wifi
建立韌體並將其上傳到您的 ESP32 裝置。 ESP32 應該打開一個ELATO-DEVICE強制門戶來連接到 Wifi。連接到它並轉到http://192.168.4.1配置設備 wifi。
-
設定好 Wifi 憑證後,關閉裝置並重新打開,它就會連接到您的 Wifi 和伺服器。
-
現在您可以與您的 AI 角色交談!
? 開始使用多個設備
- 透過將 ESP32 裝置的 MAC 位址和唯一使用者代碼新增至devicesSupabase 中的表格來註冊您的裝置。
專業提示:若要尋找 ESP32-S3 裝置的 MAC 位址,test/print_mac_address_test.cpp請使用 PlatformIO 建置和上傳並檢視串列監視器。
-
透過將您的唯一使用者程式碼新增至NextJS 前端的「設定」頁面,將您的使用者帳戶註冊到此裝置。這會將您的裝置連結到您的帳戶。
-
False在您的環境變數中設定 DEV_MODE frontend-nextjs/.env.local。
專業提示:如果您在本機進行測試,則可以保持韌體檔案和 Deno 伺服器環境變數DEV_MODE中的巨集處於啟用狀態Config.h,以使用本機 IP 位址進行測試。
- 現在,您可以透過重複上述流程將多個裝置註冊到您的帳戶。
專案架構
ElatoAI由三個主要組件組成:
- 前端客戶端(Next.js託管在 Vercel 上)- 用於創建並與您的 AI 代理對話,然後將其「發送」到您的 ESP32 設備
- 邊緣伺服器功能(Deno在 Deno/Supabase Edge 上運行)- 用於處理來自 ESP32 設備的 websocket 連線和 OpenAI API 呼叫
- ESP32 IoT 用戶端(PlatformIO/Arduino)- 從邊緣伺服器功能接收 websocket 連線並透過 Deno 邊緣伺服器將音訊傳送到 OpenAI API。
- 即時語音轉語音:由 OpenAI 的即時 API 提供支援的即時語音轉換。
- 建立自訂 AI 代理:建立具有不同個性和聲音的自訂代理程式。
- 可自訂的聲音:從各種聲音和個性中進行選擇。
- 安全的 WebSockets:可靠、加密的 WebSocket 通訊。
- 伺服器 VAD 轉向偵測:智慧對話流處理,實現順暢的互動。
- Opus 音訊壓縮:以最小頻寬實現高品質音訊串流。
- 全球邊緣效能:低延遲 Deno Edge 功能確保無縫的全球對話。
- ESP32 Arduino 框架:最佳化且易於使用的硬體整合。
- 對話記錄:查看您的對話記錄。
- 設備管理和身份驗證:註冊和管理您的設備。
- 使用者身份驗證:安全的使用者身份驗證和授權。
- 與 WebRTC 和 Websockets 的對話:使用 NextJS webapp 上的 WebRTC 和 ESP32 上的 websockets 與您的 AI 對話。
- 音量控制:從 NextJS webapp 控制 ESP32 揚聲器的音量。
- 即時記錄:您的對話的即時記錄儲存在 Supabase DB 中。
- OTA 更新:ESP32 韌體的無線更新。
- 透過強制入口網站進行 Wifi 管理:從 ESP32 裝置連線到您的 Wifi 網路。
- 恢復原廠設定:從 NextJS webapp 將 ESP32 裝置恢復原廠設定。
- 按鈕和觸控支援:使用按鈕或觸控感應器來控制 ESP32 裝置。
- 無需 PSRAM:ESP32 裝置不需要 PSRAM 來運作語音轉語音 AI。
- Web 用戶端的 OAuth:OAuth 可供您的使用者管理他們的 AI 角色和裝置。
? 技術棧
| 成分 | 使用的技術 |
|---|---|
| 前端 | Next.js、Vercel |
| 後端 | Supabase資料庫 |
| 邊函數 | Deno/Supabase 上的 Deno 邊緣函數 |
| 物聯網客戶端 | PlatformIO、Arduino 框架、ESP32-S3 |
| 音訊編解碼器 | 作品 |
| 溝通 | 安全性 WebSocket |
| 圖書館 | ArduinoJson、WebSockets、AsyncWebServer、ESP32_Button、Arduino 音訊工具、ArduinoLibOpus |
? 核心用例
我們有一個Usecases.md文件,概述了Elato AI 設備或任何其他自訂會話 AI 設備的核心用例。
?️ 進階流程
專案結構
⚙️ 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 秒
- ?音訊品質:Opus 編解碼器,24kbps(高清晰度)
- ⏳不間斷對話:長達 10 分鐘的連續對話
- ?全球可用性:透過 Deno 進行邊緣運算最佳化
? 安全
- 用於加密資料傳輸的安全性 WebSocket (WSS)
- 選用:使用 256 位元 AES 進行 API 金鑰加密
- Supabase DB 用於安全身份驗證
- 所有表的 Supabase RLS
? 限制
- 連接到邊緣伺服器時冷啟動時間為 3-4 秒
- 不間斷對話時間限制為 10 分鐘
- 超過掛鐘時間時,邊緣伺服器停止
- ESP32 上沒有語音中斷偵測
? 貢獻
- 在 ESP32 上尋找語音中斷偵測
- 新增 Arduino IDE 支援
- 在 Deno Edge 上新增工具呼叫支持
我們歡迎貢獻
- 分叉此儲存庫。
- 建立您的功能分支(git checkout -b feature/EpicFeature)。
- 提交您的更改(git commit -m 'Add EpicFeature')。
- 推送至分支(git push origin feature/EpicFeature)。
- 開啟 PR

