diff --git a/.DS_Store b/.DS_Store index b19dd8f..a2de8ff 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/README.md b/README.md index 42b2c29..d471067 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 🚀 ElatoAI: Realtime AI Speech for ESP32 +# 🚀 ElatoAI: Realtime Speech AI Agents for ESP32 Realtime AI Speech powered by OpenAI Realtime API, ESP32, Secure WebSockets, and Deno Edge Functions for >10-minute uninterrupted global conversations @@ -32,20 +32,29 @@ https://github.com/user-attachments/assets/aa60e54c-5847-4a68-80b5-5d6b1a5b9328 ## ⚡️ DIY Hardware Design -Hardware Setup +Hardware Setup - +
+
+ Mobile App Screenshot 1 +

Select from a list of personalized AI characters

+
+
+ Mobile App Screenshot 2 +

Talk to your AI with real-time responses

+
+
+ Mobile App Screenshot 3 +

Create personalized AI characters

+
+
+ + ## Getting Started @@ -119,16 +128,17 @@ ElatoAI consists of three main components: 7. **Global Edge Performance**: Low latency Deno Edge Functions ensuring seamless global conversations. 8. **ESP32 Arduino Framework**: Optimized and easy-to-use hardware integration. 9. **Conversation History**: View your conversation history. -10. **Device Management**: Register and manage your devices. +10. **Device Management and Authentication**: Register and manage your devices. 11. **User Authentication**: Secure user authentication and authorization. 12. **Conversations with WebRTC and Websockets**: Talk to your AI with WebRTC on the NextJS webapp and with websockets on the ESP32. 13. **Volume Control**: Control the volume of the ESP32 speaker from the NextJS webapp. 14. **Realtime Transcripts**: The realtime transcripts of your conversations are stored in the Supabase DB. 15. **OTA Updates**: Over the Air Updates for the ESP32 firmware. -16. **Wifi Management**: Connect to your Wifi network from the ESP32 device. +16. **Wifi Management with captive portal**: Connect to your Wifi network from the ESP32 device. 17. **Factory Reset**: Factory reset the ESP32 device from the NextJS webapp. 18. **Button and Touch Support**: Use the button OR touch sensor to control the ESP32 device. 19. **No PSRAM Required**: The ESP32 device does not require PSRAM to run the speech to speech AI. +20. **OAuth for Web client**: OAuth for your users to manage their AI characters and devices. ## 🛠 Tech Stack diff --git a/Usecases.md b/Usecases.md index de72451..ecc3ed8 100644 --- a/Usecases.md +++ b/Usecases.md @@ -1,6 +1,6 @@ # [WIP] Here are some use cases for the Elato AI device -Build Custom AI Toys +Build Custom AI Toys *Cute AI plush toys for kids, elderly, and more!* diff --git a/assets/ai-voice.png b/assets/ai-voice.png new file mode 100644 index 0000000..bf0854d Binary files /dev/null and b/assets/ai-voice.png differ diff --git a/assets/create-ai.png b/assets/create-ai.png new file mode 100644 index 0000000..edb7136 Binary files /dev/null and b/assets/create-ai.png differ diff --git a/elato-ai-device.jpeg b/assets/elato-ai-device.jpeg similarity index 100% rename from elato-ai-device.jpeg rename to assets/elato-ai-device.jpeg diff --git a/elato-ai-devkit.png b/assets/elato-ai-devkit.png similarity index 100% rename from elato-ai-devkit.png rename to assets/elato-ai-devkit.png diff --git a/assets/features.png b/assets/features.png new file mode 100644 index 0000000..4694c45 Binary files /dev/null and b/assets/features.png differ diff --git a/pcb-design.png b/assets/pcb-design.png similarity index 100% rename from pcb-design.png rename to assets/pcb-design.png diff --git a/assets/playground.png b/assets/playground.png new file mode 100644 index 0000000..4e56998 Binary files /dev/null and b/assets/playground.png differ diff --git a/usecases.png b/assets/usecases.png similarity index 100% rename from usecases.png rename to assets/usecases.png diff --git a/frontend-nextjs/.env.example b/frontend-nextjs/.env.example index b1e2c51..b17b706 100644 --- a/frontend-nextjs/.env.example +++ b/frontend-nextjs/.env.example @@ -1,6 +1,7 @@ # Update these with your Supabase details from your project settings > API # https://app.supabase.com/project/_/settings/api +DEV_MODE=True NEXT_PUBLIC_SUPABASE_URL=http://127.0.0.1:54321 NEXT_PUBLIC_SUPABASE_ANON_KEY= JWT_SECRET_KEY=super-secret-jwt-token-with-at-least-32-characters-long diff --git a/frontend-nextjs/app/components/Playground/PersonalityFilters.tsx b/frontend-nextjs/app/components/Playground/PersonalityFilters.tsx index bbf6ffd..0e3c7b3 100644 --- a/frontend-nextjs/app/components/Playground/PersonalityFilters.tsx +++ b/frontend-nextjs/app/components/Playground/PersonalityFilters.tsx @@ -14,12 +14,12 @@ interface PersonalityFiltersProps { const PersonalityFilters = ({ setSelectedFilters, selectedFilters, - languageState, currentUser, }: PersonalityFiltersProps) => { const isDoctor = currentUser.user_info?.user_type === "doctor"; return ( +
{ setSelectedFilters(value as PersonalityFilter[]); }} - className="justify-start mb-4 text-xs mt-2" + className="justify-start mb-4 ml-1 text-xs inline-flex flex-nowrap min-w-max" > +
); }; diff --git a/frontend-nextjs/app/components/Realtime/App.tsx b/frontend-nextjs/app/components/Realtime/App.tsx index 7d91a9b..519086b 100644 --- a/frontend-nextjs/app/components/Realtime/App.tsx +++ b/frontend-nextjs/app/components/Realtime/App.tsx @@ -120,7 +120,7 @@ function App({ personalityIdState, isDoctor, userId }: AppProps) { logClientEvent(data, "error.no_ephemeral_key"); setSessionStatus("DISCONNECTED"); toast({ - description: "Your API key is likely invalid. Please update it in Settings.", + description: "Your API key is likely invalid. Please add it to your env variables.", }); return null; } diff --git a/frontend-nextjs/app/components/Settings/AppSettings.tsx b/frontend-nextjs/app/components/Settings/AppSettings.tsx index 0586cc1..4e00e12 100644 --- a/frontend-nextjs/app/components/Settings/AppSettings.tsx +++ b/frontend-nextjs/app/components/Settings/AppSettings.tsx @@ -103,7 +103,7 @@ const AppSettings: React.FC = ({ Device settings
-
+ {process.env.DEV_MODE != "True" &&
+
}