Blog (in inglese)Questo articolo è disponibile solo in inglese.
The first build: live subtitles with translation
Today the first version of our app started working. You pick an application that is playing sound, or a microphone. The app recognizes the English speech and shows it in a small window, with a Russian translation under each line. Everything happens on the Mac.
What it does
The app lives in the menu bar. The menu lists the applications you can listen to and the microphones. Applications that are silent right now stay in the list too: a video call has not started yet, a browser tab is paused, but you need to pick them in advance. The ones that are playing sound go first.
The subtitles appear in a window that stays above all other windows. You drag it by the background and resize it by the corner. It remembers its place and size. In the window you can show English only, Russian only, or both, with the English line on top. Fonts, colors and background transparency are set in a separate settings window.
When you press Stop, the whole session is saved. The “Recent transcriptions” window lists the last 50 sessions, and you can copy any of them as text. A session where nobody said anything is not saved.
Two decisions
How to catch the sound of one app. The usual way is the screen-capture framework. We did not take it: it asks for the screen-recording permission and keeps a recording indicator in the menu bar for as long as it works. Instead we use the system’s way of tapping one process’s audio. It has its own permission and no screen indicator. Browsers and chat apps play sound from several helper processes, so we group them by the application they belong to and listen to all of them at once.
Do not wait for the end of a phrase. People speak a sentence for four to eight seconds, and a screen that is empty all that time feels broken. So we show the text as it grows. Apple’s recognizer, run in its fast mode, gives new text about once a second; without that mode it came about every 3.8 seconds. The last words still flicker and get corrected, but this is better than waiting.
Translation arrives later than recognition, and that caused the one tricky bug class. Text comes in bursts, and the first update of a burst is often a scrap like “So”. We wait 150 milliseconds and translate the latest update. Every update has a number, and a translation of older text is thrown away, so a late answer never overwrites a newer line.
What is in the box
The same day we added an app icon and an installer: a disk image with a short guide inside, and a ready recipe for installing through Homebrew. For now the app needs macOS 26, because it uses Apple’s newer speech recognition. It asks for three permissions: audio of other apps, microphone, and speech recognition.
This version understands English only and translates only into Russian. The next step is the text under your mouse pointer.