From 2915125f6c469cf7f086ce2fa3b6302b619a805f Mon Sep 17 00:00:00 2001 From: akdeb Date: Wed, 22 Oct 2025 11:53:57 +0100 Subject: [PATCH] adding hume --- README.md | 4 +- .../CreateCharacter/BuildDashboard.tsx | 8 +- .../app/components/Nav/LeftNavbarButtons.tsx | 5 +- frontend-nextjs/app/layout.tsx | 10 +- frontend-nextjs/app/page.tsx | 60 +--- frontend-nextjs/lib/data.ts | 1 + frontend-nextjs/public/logos/elato.png | Bin 0 -> 67899 bytes frontend-nextjs/public/logos/ks.png | Bin 0 -> 14581 bytes frontend-nextjs/tailwind.config.ts | 1 + frontend-nextjs/types/types.d.ts | 2 +- server-deno/.env.example | 3 +- server-deno/models/hume.ts | 324 ++++++++++++++++++ server-deno/types.d.ts | 52 ++- server-deno/utils.ts | 101 ++++++ .../20250611011151_add_provider.sql | 2 +- 15 files changed, 516 insertions(+), 57 deletions(-) create mode 100644 frontend-nextjs/public/logos/elato.png create mode 100644 frontend-nextjs/public/logos/ks.png create mode 100644 server-deno/models/hume.ts diff --git a/README.md b/README.md index d003a7c..0366321 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ Elato is heading to Kickstarter! After a year of prototyping and shipping early

-[🏠 Homepage](https://elatoai.com/) | [🚀 Kickstarter](https://www.kickstarter.com/projects/elatoai/elato-make-toys-talk-with-ai-voices) +[🚀 Kickstarter](https://www.kickstarter.com/projects/elatoai/elato-make-toys-talk-with-ai-voices) |[🏠 Homepage](https://elatoai.com/)

@@ -45,6 +45,8 @@ Realtime AI Speech powered by **OpenAI Realtime API**, **Eleven Labs AI Agents** +
+
[![Discord](https://img.shields.io/badge/Discord-105_members-5865F2?style=flat&logo=discord&logoColor=white)](https://discord.gg/KJWxDPBRUj) diff --git a/frontend-nextjs/app/components/CreateCharacter/BuildDashboard.tsx b/frontend-nextjs/app/components/CreateCharacter/BuildDashboard.tsx index 55a3481..554e724 100644 --- a/frontend-nextjs/app/components/CreateCharacter/BuildDashboard.tsx +++ b/frontend-nextjs/app/components/CreateCharacter/BuildDashboard.tsx @@ -326,11 +326,11 @@ const SettingsDashboard: React.FC = ({ {/* ElevenLabs Alternative */}
-
+
- +

- Create an ElevenLabs character with custom voice agents + Create a voice clone with Eleven Labs Conversational AI Agents or Hume EVI4

diff --git a/frontend-nextjs/app/components/Nav/LeftNavbarButtons.tsx b/frontend-nextjs/app/components/Nav/LeftNavbarButtons.tsx index 30e3972..bd96185 100644 --- a/frontend-nextjs/app/components/Nav/LeftNavbarButtons.tsx +++ b/frontend-nextjs/app/components/Nav/LeftNavbarButtons.tsx @@ -10,6 +10,7 @@ import { DropdownMenuLabel, } from "@/components/ui/dropdown-menu"; import { usePathname } from "next/navigation"; +import Image from "next/image"; const ICON_SIZE = 22; @@ -44,10 +45,10 @@ export default function LeftNavbarButtons({ user }: LeftNavbarButtonsProps) { Main Website -

+

Elato

- 👾 + Elato Logo
diff --git a/frontend-nextjs/app/layout.tsx b/frontend-nextjs/app/layout.tsx index 79c8aab..d556cfc 100644 --- a/frontend-nextjs/app/layout.tsx +++ b/frontend-nextjs/app/layout.tsx @@ -10,6 +10,7 @@ import { Inter_Tight, Borel, Silkscreen, + Luckiest_Guy, } from "next/font/google"; import "./globals.css"; import { createClient } from "@/utils/supabase/server"; @@ -91,7 +92,14 @@ const silkscreen = Silkscreen({ weight: ["400"], }); -const fonts = `${inter.variable} ${inter_tight.variable} ${baloo2.variable} ${comicNeue.variable} ${quicksand.variable} ${fredoka.variable} ${lora.variable} ${karla.variable} ${borel.variable} ${silkscreen.variable}`; +const luckiestGuy = Luckiest_Guy({ + subsets: ["latin"], + display: "swap", + variable: "--font-luckiest-guy", + weight: ["400"], +}); + +const fonts = `${inter.variable} ${inter_tight.variable} ${baloo2.variable} ${comicNeue.variable} ${quicksand.variable} ${fredoka.variable} ${lora.variable} ${karla.variable} ${borel.variable} ${silkscreen.variable} ${luckiestGuy.variable}`; const defaultUrl = process.env.VERCEL_URL ? `https://${process.env.VERCEL_URL}` diff --git a/frontend-nextjs/app/page.tsx b/frontend-nextjs/app/page.tsx index f5347ac..e0f0ff6 100644 --- a/frontend-nextjs/app/page.tsx +++ b/frontend-nextjs/app/page.tsx @@ -1,5 +1,5 @@ import Link from "next/link" -import { ChevronRight, Zap, Star, Home } from "lucide-react" +import { ChevronRight, Zap, Star, Home, ArrowUpRight } from "lucide-react" import { Button } from "@/components/ui/button" import { DEVICE_COST, SUBSCRIPTION_COST } from "@/lib/data"; import { createClient } from "@/utils/supabase/server" @@ -10,7 +10,7 @@ import ProductsSection from "./components/LandingPage/ProductsSection"; import Image from "next/image"; import { fetchGithubStars } from "./actions"; import YoutubeDemo from "./components/LandingPage/YoutubeDemo"; -import { PricingSection } from "./components/LandingPage/PricingSection"; +import { kickstarterLink } from "@/lib/data"; export default async function LandingPage() { const supabase = createClient(); @@ -26,6 +26,18 @@ export default async function LandingPage() {
+

+ Elato Logo +Elato +

+

@@ -80,18 +92,7 @@ export default async function LandingPage() { {stars}

- - {/*
- - - - - - -
*/} - +
@@ -171,37 +172,6 @@ export default async function LandingPage() { {/* Create Character Showcase */} - - {/* Pricing */} -
-
-
-
-

Our Pricing

- -
-
-
-
- {/* FAQ */} - {/*
- -
*/} - - - {/* CTA */} - {/*
-
-

Ready to Bring Your Toys to Life?

-

- Order your Elato device today and watch the magic happen! -

- -

First month subscription FREE, then just ${SUBSCRIPTION_COST}/month (or use your own OpenAI API key)

-
-
*/}
) diff --git a/frontend-nextjs/lib/data.ts b/frontend-nextjs/lib/data.ts index e49055d..6e9f31e 100644 --- a/frontend-nextjs/lib/data.ts +++ b/frontend-nextjs/lib/data.ts @@ -10,6 +10,7 @@ export const tiktokLink = "https://www.tiktok.com/@elatoai"; export const githubPublicLink = "https://github.com/akdeb/ElatoAI"; export const businessDemoLink = "https://calendly.com/akadeb/elato-ai-demo"; export const feedbackFormLink = "https://forms.gle/2QmukEG2FXNwBdee7"; +export const kickstarterLink = "https://www.kickstarter.com/projects/elatoai/elato-make-toys-talk-with-ai-voices"; export const r2Url = "https://pub-cd736d767add4fecafea55c239c28497.r2.dev"; export const r2UrlAudio = "https://pub-5fab8e2596c544cd8dc3e20812be2168.r2.dev"; diff --git a/frontend-nextjs/public/logos/elato.png b/frontend-nextjs/public/logos/elato.png new file mode 100644 index 0000000000000000000000000000000000000000..6c241580a6c5d73d961f52cbeefa0ba32ef94977 GIT binary patch literal 67899 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%0A2k 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 aw_*PcU$#@-C+t8Vyn&pwGOSw4IOu;3k3v`g literal 0 HcmV?d00001 diff --git a/frontend-nextjs/tailwind.config.ts b/frontend-nextjs/tailwind.config.ts index fb42b0e..598525f 100644 --- a/frontend-nextjs/tailwind.config.ts +++ b/frontend-nextjs/tailwind.config.ts @@ -116,6 +116,7 @@ const config = { karla: ["var(--font-karla)"], borel: ["var(--font-borel)"], silkscreen: ["var(--font-silkscreen)"], + luckiestGuy: ["var(--font-luckiest-guy)"], }, animation: { "accordion-down": "accordion-down 0.2s ease-out", diff --git a/frontend-nextjs/types/types.d.ts b/frontend-nextjs/types/types.d.ts index a516514..0eb79c6 100644 --- a/frontend-nextjs/types/types.d.ts +++ b/frontend-nextjs/types/types.d.ts @@ -116,7 +116,7 @@ declare global { emoji?: string; }; - type ModelProvider = "openai" | "gemini" | "elevenlabs"; + type ModelProvider = "openai" | "gemini" | "elevenlabs" | "hume"; type GeminiVoice = | "Zephyr" diff --git a/server-deno/.env.example b/server-deno/.env.example index 2bf18b5..ca5b6d0 100644 --- a/server-deno/.env.example +++ b/server-deno/.env.example @@ -6,10 +6,11 @@ JWT_SECRET_KEY=super-secret-jwt-token-with-at-least-32-characters-long # Encryption Key (useful for encrypting secrets in the database) ENCRYPTION_KEY= -# OpenAI API Key +# Model provider API Keys OPENAI_API_KEY= GEMINI_API_KEY= ELEVENLABS_API_KEY= +HUME_API_KEY= # local development HOST=0.0.0.0 diff --git a/server-deno/models/hume.ts b/server-deno/models/hume.ts new file mode 100644 index 0000000..8c65d69 --- /dev/null +++ b/server-deno/models/hume.ts @@ -0,0 +1,324 @@ +import { Buffer } from 'node:buffer'; +import type { RawData } from 'npm:@types/ws'; +import { WebSocket } from 'npm:ws'; +import { addConversation, getDeviceInfo } from '../supabase.ts'; +import { encoder, FRAME_SIZE, isDev, humeApiKey, downsamplePcm, extractPcmFromWav, boostLimitPCM16LEInPlace } from '../utils.ts'; + +export const connectToHume = ({ + ws, + payload, + connectionPcmFile, + firstMessage, + systemPrompt, + closeHandler, +}: { + ws: WebSocket; + payload: IPayload; + connectionPcmFile: Deno.FsFile | null; + firstMessage: string; + systemPrompt: string; + closeHandler: () => Promise; +}) => { + const { user, supabase } = payload; + const { personality } = user; + + console.log(`Connecting to Hume with key "${humeApiKey?.slice(0, 3)}..."`); + + // Build Hume WebSocket URL + const queryParams = new URLSearchParams({ + api_key: humeApiKey!, + config_id: personality!.voice?.config.config_id, + }); + + const humeWsUrl = `wss://api.hume.ai/v0/evi/chat?${queryParams.toString()}`; + + console.log(`Connecting to Hume WebSocket at: ${humeWsUrl.replace(humeApiKey!, 'API_KEY_HIDDEN')}`); + const humeWs = new WebSocket(humeWsUrl); + + let isConnected = false; + const messageQueue: RawData[] = []; + let createdSent = false; + + // Handle Hume WebSocket connection + humeWs.on('open', () => { + console.log('✅ Connected to Hume WebSocket API successfully'); + isConnected = true; + + // Configure Hume session settings for input audio format + // This tells Hume what format we're sending TO them, not what we want back + humeWs.send(JSON.stringify({ + type: 'session_settings', + audio: { + encoding: "linear16", + channels: 1, + sample_rate: 16000, + }, + system_prompt: systemPrompt, + })); + + // Send simple first message if provided + humeWs.send(JSON.stringify({ + type: 'user_input', + text: firstMessage, + })); + + // Process queued messages + while (messageQueue.length > 0) { + const queuedMessage = messageQueue.shift(); + if (queuedMessage) { + messageHandler(queuedMessage, true); // Assume binary for queued audio + } + } + }); + + // Handle messages from Hume + humeWs.on('message', async (data: Buffer) => { + try { + const message: HumeMessage = JSON.parse(data.toString()); + console.log(`Received from Hume: ${message.type}`); + + switch (message.type) { + case 'assistant_end': + + // Send RESPONSE.COMPLETE when assistant message is done + ws.send(JSON.stringify({ + type: 'server', + msg: 'RESPONSE.COMPLETE', + })); + + // Reset for next turn + createdSent = false; + + break; + + case 'assistant_message': + const assistantMsg = message as HumeAssistantMessage; + + // Store conversation in database + await addConversation( + supabase, + 'assistant', + assistantMsg.message.content, + user, + ); + + break; + + case 'audio_output': + const audioMsg = message as HumeAudioOutput; + + // Send RESPONSE.CREATED before first audio chunk + if (!createdSent) { + try { + const device = await getDeviceInfo(supabase, user.user_id); + + if (device) { + ws.send(JSON.stringify({ + type: 'server', + msg: 'RESPONSE.CREATED', + volume_control: device.volume ?? 70, + })); + } else { + ws.send(JSON.stringify({ + type: 'server', + msg: 'RESPONSE.CREATED', + })); + } + } catch (error) { + console.error('Error fetching device info:', error); + ws.send(JSON.stringify({ + type: 'server', + msg: 'RESPONSE.CREATED', + })); + } + createdSent = true; + } + + try { + // Decode base64 audio data from Hume (this is a WAV file, not raw PCM!) + const wavBuffer = Buffer.from(audioMsg.data, 'base64'); + + // Extract PCM data from WAV file + const pcmData = extractPcmFromWav(wavBuffer); + + if (!pcmData) { + console.error('Failed to extract PCM data from WAV'); + return; + } + + // Downsample from 48kHz to 24kHz to match our system + const downsampledPcm = downsamplePcm(pcmData, 48000, 24000); + boostLimitPCM16LEInPlace(downsampledPcm, /*gainDb=*/6.0, /*ceiling=*/0.89); + + + // Process the downsampled PCM data in frames + let audioBuffer = downsampledPcm; + + // Process complete frames using the standard FRAME_SIZE + while (audioBuffer.length >= FRAME_SIZE) { + const frame = audioBuffer.subarray(0, FRAME_SIZE); + audioBuffer = audioBuffer.subarray(FRAME_SIZE); + + try { + const packet = encoder.encode(frame); + ws.send(packet); + } catch (err) { + console.error('Hume Opus encode failed:', err); + } + } + + // Store remaining bytes for next chunk (if any) + if (audioBuffer.length > 0) { + console.log(`Hume audio remainder: ${audioBuffer.length} bytes`); + } + } catch (audioError) { + console.error('Error processing Hume audio output:', audioError); + } + break; + + case 'chat_metadata': + console.log('Chat metadata received:', message); + break; + + case 'user_message': + console.log('User message acknowledged:', message); + await addConversation( + supabase, + 'user', + message.message.content, + user, + ); + break; + + case 'user_input': + // This is an echo of our own input, we can log it but don't need to store it again + console.log('User input acknowledged by Hume'); + break; + + case 'error': + const errorMsg = message as HumeError; + console.error(`Hume error: ${errorMsg.code} - ${errorMsg.message}`); + + ws.send(JSON.stringify({ + type: 'server', + msg: 'RESPONSE.ERROR', + error: errorMsg.message, + })); + break; + + case 'session_created': + console.log('Hume session created'); + ws.send(JSON.stringify({ + type: 'server', + msg: 'SESSION.CREATED', + })); + break; + + case 'session_ended': + console.log('Hume session ended'); + ws.send(JSON.stringify({ + type: 'server', + msg: 'SESSION.END', + })); + break; + + default: + console.log(`Unhandled Hume message type: ${message.type}`); + } + } catch (error) { + console.error('Error processing Hume message:', error); + } + }); + + humeWs.on('close', (code: number, reason: Buffer) => { + console.log(`Hume WebSocket closed: ${code} - ${reason.toString()}`); + ws.send(JSON.stringify({ + type: 'server', + msg: 'SESSION.END', + })); + isConnected = false; + ws.close(); + }); + + humeWs.on('error', (error: Error) => { + console.error('Hume WebSocket error:', error); + console.error('Error details:', { + message: error.message, + stack: error.stack, + name: error.name + }); + ws.send(JSON.stringify({ + type: 'server', + msg: 'RESPONSE.ERROR', + error: 'Connection to Hume failed', + })); + }); + + // Handle messages from ESP32 client + const messageHandler = async (data: RawData, isBinary: boolean) => { + try { + if (isBinary) { + // Handle audio data from ESP32 + const base64Audio = data.toString('base64'); + + const audioMessage: HumeAudioInput = { + type: 'audio_input', + data: base64Audio, + }; + + if (isConnected) { + humeWs.send(JSON.stringify(audioMessage)); + } + + // Write to debug file if enabled + if (isDev && connectionPcmFile) { + await connectionPcmFile.write(data as Buffer); + } + } + } catch (error) { + console.error('Error handling message:', error); + } + }; + + // Set up ESP32 WebSocket handlers + ws.on('message', (data: RawData, isBinary: boolean) => { + if (!isConnected) { + messageQueue.push(data); + } else { + messageHandler(data, isBinary); + } + }); + + ws.on('error', (error: Error) => { + console.error('ESP32 WebSocket error:', error); + humeWs.close(); + }); + + ws.on('close', async (code: number, reason: string) => { + console.log(`ESP32 WebSocket closed: ${code} - ${reason}`); + humeWs.close(); + await closeHandler(); + + if (isDev && connectionPcmFile) { + connectionPcmFile.close(); + console.log('Closed debug audio file'); + } + }); + + // Wait for Hume connection to be established + return new Promise((resolve, reject) => { + const timeout = setTimeout(() => { + reject(new Error('Hume connection timeout')); + }, 10000); + + humeWs.on('open', () => { + clearTimeout(timeout); + resolve(); + }); + + humeWs.on('error', (error) => { + clearTimeout(timeout); + reject(error); + }); + }); +}; diff --git a/server-deno/types.d.ts b/server-deno/types.d.ts index 874e2f8..8c3f0c4 100644 --- a/server-deno/types.d.ts +++ b/server-deno/types.d.ts @@ -26,7 +26,7 @@ declare global { user_code: string; } - type ModelProvider = "openai" | "gemini" | "elevenlabs"; + type ModelProvider = "openai" | "gemini" | "elevenlabs" | "hume"; type GeminiVoice = | "Zephyr" @@ -142,4 +142,54 @@ declare global { device_id: string; device?: IDevice; } + + // Hume EVI WebSocket message types + interface HumeMessage { + type: string; + [key: string]: any; + } + + interface HumeAudioInput { + type: 'audio_input'; + data: string; // base64 encoded audio + } + + interface HumeUserInput { + type: 'user_input'; + text: string; + } + + interface HumeAssistantInput { + type: 'assistant_input'; + text: string; + } + + interface HumeSessionSettings { + type: 'session_settings'; + [key: string]: any; + } + + interface HumeAssistantMessage { + type: 'assistant_message'; + message: { + role: 'assistant'; + content: string; + }; + models: { + prosody?: { + scores: Record; + }; + }; + } + + interface HumeAudioOutput { + type: 'audio_output'; + data: string; // base64 encoded audio + } + + interface HumeError { + type: 'error'; + code: string; + message: string; + } } diff --git a/server-deno/utils.ts b/server-deno/utils.ts index be46e07..0aa62bc 100644 --- a/server-deno/utils.ts +++ b/server-deno/utils.ts @@ -27,6 +27,7 @@ encoder.bitrate = 12000; export const openaiApiKey = Deno.env.get("OPENAI_API_KEY"); export const geminiApiKey = Deno.env.get("GEMINI_API_KEY"); export const elevenLabsApiKey = Deno.env.get("ELEVENLABS_API_KEY"); +export const humeApiKey = Deno.env.get('HUME_API_KEY'); export { encoder, FRAME_SIZE }; @@ -82,3 +83,103 @@ export function decryptSecret( decrypted += decipher.final("utf8"); return decrypted; } + + +export function boostLimitPCM16LEInPlace( + pcmBytes: Uint8Array, // Buffer is fine (subclass of Uint8Array) + gainDb = 6.0, + ceiling = 0.89, // ≈ −1 dBFS +): void { + const dv = new DataView(pcmBytes.buffer, pcmBytes.byteOffset, pcmBytes.byteLength); + const g = Math.pow(10, gainDb / 20); + + // Pass 1: measure post-gain peak + let peak = 0; + for (let i = 0; i < dv.byteLength; i += 2) { + const s = dv.getInt16(i, true) / 32768; // 16-bit LE → [-1,1] + const y = s * g; + const a = Math.abs(y); + if (a > peak) peak = a; + } + const scale = peak > ceiling && peak > 0 ? (ceiling / peak) : 1; + + // Pass 2: apply gain + scale + gentle soft-clip + for (let i = 0; i < dv.byteLength; i += 2) { + let y = (dv.getInt16(i, true) / 32768) * g * scale; + // cubic soft-clip (tanh-ish) for nicer peaks + const y2 = y * y; + y = 0.5 * y * (3 - y2); + if (y > 0.999) y = 0.999; + if (y < -0.999) y = -0.999; + dv.setInt16(i, (y * 32767) | 0, true); + } +} + + +// Function to downsample PCM audio from 48kHz to 24kHz +export function downsamplePcm(pcmBuffer: Buffer, fromRate: number, toRate: number): Buffer { + if (fromRate === toRate) { + return pcmBuffer; + } + + const ratio = fromRate / toRate; + const inputSamples = pcmBuffer.length / 2; // 16-bit = 2 bytes per sample + const outputSamples = Math.floor(inputSamples / ratio); + const outputBuffer = Buffer.alloc(outputSamples * 2); + + for (let i = 0; i < outputSamples; i++) { + const sourceIndex = Math.floor(i * ratio) * 2; + const sample = pcmBuffer.readInt16LE(sourceIndex); + outputBuffer.writeInt16LE(sample, i * 2); + } + + return outputBuffer; +} + + +// Function to extract PCM data from WAV file +export function extractPcmFromWav(wavBuffer: Buffer): Buffer | null { + try { + // Check minimum WAV header size + if (wavBuffer.length < 44) { + console.error('WAV file too small'); + return null; + } + + // Verify RIFF header + const riffHeader = wavBuffer.subarray(0, 4).toString('ascii'); + if (riffHeader !== 'RIFF') { + console.error('Not a RIFF file'); + return null; + } + + // Verify WAVE format + const waveHeader = wavBuffer.subarray(8, 12).toString('ascii'); + if (waveHeader !== 'WAVE') { + console.error('Not a WAVE file'); + return null; + } + + // Find the data chunk + let offset = 12; + while (offset < wavBuffer.length - 8) { + const chunkId = wavBuffer.subarray(offset, offset + 4).toString('ascii'); + const chunkSize = wavBuffer.readUInt32LE(offset + 4); + + if (chunkId === 'data') { + // Found data chunk, extract PCM data + const pcmData = wavBuffer.subarray(offset + 8, offset + 8 + chunkSize); + return pcmData; + } + + // Move to next chunk + offset += 8 + chunkSize; + } + + console.error('No data chunk found in WAV file'); + return null; + } catch (error) { + console.error('Error extracting PCM from WAV:', error); + return null; + } +} \ No newline at end of file diff --git a/supabase/migrations/20250611011151_add_provider.sql b/supabase/migrations/20250611011151_add_provider.sql index 041cde8..a568cf9 100644 --- a/supabase/migrations/20250611011151_add_provider.sql +++ b/supabase/migrations/20250611011151_add_provider.sql @@ -1,6 +1,6 @@ -- Add provider column to personalities table ALTER TABLE personalities -ADD COLUMN provider TEXT CHECK (provider IN ('openai', 'gemini', 'elevenlabs')) DEFAULT 'openai'; +ADD COLUMN provider TEXT CHECK (provider IN ('openai', 'gemini', 'elevenlabs', 'hume')) DEFAULT 'openai'; -- Update existing records to have a default provider UPDATE personalities