Souvoix · Official Website · Mac App Store · Watch Demo


I recently released my first macOS app, Souvoix. The name Souvoix comes from the French words sous and voix, meaning “under” and “voice,” respectively. I wanted the name to reflect what the app does: turning speech into readable, translatable text and generating bilingual subtitles.

It’s designed for people who want to watch foreign-language videos without subtitles. I would say that using LLMs for translation is definitely one of the most cost-effective applications of AI right now. Google’s LLMs are especially good at subtitle translation, and translating an entire video usually costs just a few cents, sometimes even less.

The app originally came from my own needs. I was learning French, and there’s so much great video content in French, like documentaries from ARTE. The problem was that my French wasn’t good enough to fully understand them. I could only watch videos that someone had already made subtitles for, which meant I couldn’t access the much wider range of videos without subtitles.

So I started using scripts to launch Whisper for transcription and then LLMs for translation, and I found that the results were surprisingly good. This wasn’t just useful for French, but also for English. English isn’t my native language either, and translated subtitles help me understand videos outside my own field, like medical lectures and other specialized content.

Being able to access videos in all kinds of languages from around the world is genuinely one of the biggest benefits AI has brought me. And the nice thing is that it’s scalable and widely applicable. It’s not just useful for learning one particular language, but for learning almost any language.

My native language is Chinese, and relatively speaking, there’s already quite a lot of translated content available in Chinese. But I imagine that for speakers of less widely spoken languages, being able to generate your own translated subtitles could be even more helpful.

Indie development is also something I’ve always wanted to try, so I thought this would be a good opportunity to explore it, especially since the results were already so good.

To be honest, if you know your way around computers, you can totally do all of this with scripts. But for many people, a GUI is simply more convenient, so I turned it into a simple app called Souvoix.

I appreciate clean and simple software design, rather than just making something that works. So I built the whole thing natively with Swift and SwiftUI. I designed the architecture myself, and I really enjoyed that process. It wasn’t just about wrapping a few scripts in a GUI.

I actually experimented with a few other approaches at first, including real-time subtitle translation. But even on my M3 MacBook Pro with 32GB of RAM, I found it difficult to achieve transcription that was both fast and accurate, let alone adding another translation step on top of that.

Whisper can transcribe multiple languages, but its built-in speech translation task mainly translates into English, rather than allowing translation into any target language.

For real-time transcription + translation, at least with the hardware and models I’ve tested, I couldn’t achieve the balance of speed and quality I wanted. For me, quality matters more, so I decided to give up on the real-time subtitle use case.

But as the technology improves, I believe local (rather than cloud-based) real-time transcription and translation will definitely be valuable. (I have to say, though, the subtitle quality of some cloud services, like Google Meet, is really terrible.)

Another thing worth talking about is translation. I would recommend using cloud-based LLMs for this, especially the Gemini Flash and Pro series. If you need more accurate translations, go with Pro. For everyday use, Flash is more than enough.

They’re very good at following instructions, quite consistent, and also cheap. Most importantly, they can maintain a one-to-one correspondence between the original and translated subtitle segments, which is actually the hardest part.

In my testing, many models, including some from OpenAI and Anthropic, would occasionally misalign subtitle segments or return a different number of segments from the original. Smaller local models tend to have this problem even more often.

I also realize that requiring users to bring their own API keys creates a barrier for some people. But I really don’t want to take on potentially huge API costs myself, so I think this is the most lightweight approach, and it also gives users the most freedom.

Anyway, this is the first app I’ve built. I’m not really sure whether it’ll be useful to other people, but at least I use it myself every day, and I’m already pretty happy and satisfied with that.

It’s now part of my language-learning workflow, and maybe in the future I’ll build more apps around other parts of that workflow.