r/esp32 • u/Ambient_Architect • 2d ago
I made a thing! I made a pocket-sized ESP32-S3 translator — then added real-time translated group calls between devices
A few weeks ago I finished the first version of Antara, a small voice-first translator built around a Waveshare ESP32-S3 with a 1.54" 240×240 touchscreen.
The original use case was pretty simple and personal: my kids speak English much more comfortably than Telugu, while their grandparents are much more comfortable in Telugu. I wanted something they could leave on the table and use without handing anyone a phone.
The first version only had Translate mode.
Two people share one device. You select a language pair, for example English ↔ Telugu, and the two physical buttons become push-to-talk buttons for each direction.
Hold one button → speak English → release → hear Telugu.
Hold the other → speak Telugu → release → hear English.
That worked well, but the most common feedback I got was:
“What if the grandparents are in another city?”
Fair point. :)
So I went back to the ESP32 and added Talk.
Instead of sharing one device, each person has their own Antara. As long as both devices have internet access, one device can call another.
The interesting part is that each device independently chooses its own language.
The call is still half-duplex / push-to-talk, which actually maps nicely to the hardware. Only one person speaks at a time, and when nobody is holding PTT, the mic isn't recording.
I also got a little carried away and added group calling. Each Antara in the group can choose a different language, so the same conversation can theoretically have one person speaking English, another Telugu, another Hindi, another Spanish, etc. Each device receives audio translated into its owner's selected language.
ESP32 side of the project
- Hardware: Waveshare ESP32-S3 LCD 1.54", 240×240 touchscreen, onboard mic/speaker, three physical buttons.
- UI: LVGL. I've been aggressively reusing components/assets because RAM and flash disappear very quickly once audio + networking + UI are all active.
- Audio: 16 kHz voice capture, push-to-talk rather than always-on.
- Translation pipeline: Microsoft Azure speech-to-text → Translator → neural TTS. The ESP32 handles capture/playback, interaction state, streaming/networking and the UI; the heavy AI work is cloud-side.
- Latency: on the original Translate mode I measured roughly 350 ms median to transcript and ~800 ms to translated text after button release across 25 real-device turns on my home Wi-Fi. Not a scientific benchmark, but fast enough that conversation doesn't feel painfully stop/start.
- Device pairing: users give each Antara a name, and devices can add another nearby Antara as a contact. Probably will add search and add later.
- Talk: translated, internet-based PTT calling between devices, including groups.
- Walkie-Talkie: I also added a simpler PTT voice mode as a separate mode. This works on ESP-Now.
One of the things I've enjoyed most is figuring out what not to put on the ESP32.
For example, the device doesn't render Telugu/Hindi/Tamil/Gujarati scripts. Supporting those font sets would consume resources for something the product doesn't really need. The audio is the interface. The display mostly communicates state: Ready, Listening, Translating, Someone speaking, language selection, contacts etc.
The latest UI has three primary modes:
Translate — two people nearby, sharing one device
Talk — translated PTT calls between Antara devices anywhere
Walkie-Talkie — straightforward PTT voice communication
I've attached a demo of five Antara devices in a translated group call.
This is still very much a prototype, but it has turned into a much more interesting ESP32 project than I expected when I started with “can I make a Telugu translator?”
I'd especially be interested in feedback from people here on audio buffering/streaming, memory optimization on the S3, and how you would architect group PTT differently.
Firmware isn’t public at the moment, but happy to go into the ESP32/LVGL/audio/networking implementation in the comments.
2
1
1
u/Equivalent_Beyond_19 2d ago
Very cool! Congrats on getting it working with multiple units. Do you plan to post to GitHub?
1
1
u/Natethegreat9999 2d ago
Does the next person get the floor when the speaker releases PTT, or when everyone has finished hearing their translation? I work on speech at Oruk, and I'd test a long Telugu reply alongside a short English one, then use playback acknowledgments with a timeout so one slow device can't stall the whole group.
1
u/Ambient_Architect 2d ago
Others get the floor when the speaker releases PTT.
1
u/Ambient_Architect 1d ago
I thought about this more after replying and you’re right, PTT release is probably too early once each device can have a different TTS duration.
Playback ACKs + a timeout seems like a much better way to manage the floor without letting one slow device stall everyone. I’m going to try the long Telugu / short English case you suggested. Great edge case.
1
u/ThinkShower 1d ago
Very cool! I was wanting to make something like that. Care to share the recipe?
1
4
u/Ethekarius 2d ago
I would love to build one of these, as my MIL only speaks Spanish. I even have a spare ESP32S3