Inspiration

We've all been on a video call where someone speaks a different language and the conversation just stops. You lose the connection, the energy, the person. Translation tools exist, but they give you a robot voice. We wanted something that felt human.

That's what Parrot is: a video call where you speak your language, and the other person hears you — translated, but still in your voice.

What it does

Parrot is a real-time video calling app that:

  1. Clones your voice before the call by having you read a single sentence
  2. Detects when you're speaking using browser-based voice activity detection
  3. Transcribes and translates your speech using Gemini 2.5 Flash Lite
  4. Sends the translated audio in your cloned voice to the other person via WebRTC
  5. Shows live subtitles on both sides
  6. Supports real-time text chat with automatic translation across 15 languages

No signup. No install. Clone your voice in 3 seconds, share a room code, and start talking.

How we built it

The frontend is built with Next.js and Tailwind CSS, hosted on Cloudflare Workers. Video and audio use WebRTC peer-to-peer, with Supabase Realtime handling signaling.

When VAD detects speech, the audio goes to a Supabase Edge Function that calls Gemini 2.5 Flash Lite for transcription + translation in one shot. The translated text goes to ElevenLabs Flash v2.5 for TTS with the cloned voice, and the audio is sent back through WebRTC DataChannel.

Subtitles are shown immediately after translation — the other person starts reading before the voice audio even finishes generating.

Challenges

Latency. The full pipeline — VAD, Gemini transcription + translation, ElevenLabs TTS, and WebRTC delivery — takes about 1.9 seconds end-to-end. That's usable, but not seamless. We squeezed out every millisecond we could: disabled Gemini's thinking mode, picked the fastest model tiers, sent subtitles ahead of audio, and parallelized translation for multi-peer rooms. But 1.9 seconds still feels like a pause in a real conversation, and getting it lower is the main thing we'd keep working on.

What we learned

Gemini 2.5 Flash Lite is already one of the lightest models available, yet it accounts for ~1.6s of our 1.9s pipeline — the translation step is the bottleneck. ElevenLabs TTS only takes ~300ms. This tells us that swapping in an even lighter or more specialized translation model could significantly cut latency, even if it means some trade-off in translation quality. For real-time conversation, speed matters more than perfect grammar.

Sometimes the best UX decision is the simplest one. We tried collecting voice passively during the call, but having the user read one sentence beforehand turned out to be faster and more reliable — 3 seconds of effort for a fully personalized experience.

Built With

Share this project:

Updates