macOS · iPhone · on-device

Interpreter

Sit at a table where everyone speaks something else, put your AirPods in, and hear it in your own language. It listens continuously, waits until a thought is complete the way an interpreter does, and speaks it in your ear while it keeps listening. Recognition, translation and the voice all run on the phone or Mac in front of you.

25 languages heard, 8 spoken ~4–5 s behind the speaker 0 bytes of speech leave the device
◍ Any language → English
DEAlso, I just wanted to say briefly…
DEthat we won’t be meeting at nine o’clock.
DEbut to start at 10:30.sondern erst um halb elf anfangen.
◖ Hearing… Der Grund ist, dass der Zug
Speaking · 4.2 s behind
Interpreter's icon: plain wavefronts arrive from the left, pass a glowing point, and leave on the right in cyan.

The screen is mostly not looked at. The English is in your ear; the phone is in a pocket or face down on the table.

So it answers three things at a glance. Whether it is on: one round button, with the microphone level as a ring around it. What it is doing: one line — listening, translating, or speaking and how far behind. What was just said: the newest translation large, with what was actually said under it, and a language chip when the language is certain.

The live screen, rebuilt from the run in the next section rather than photographed from someone's real conversation.

The problem

Phrase by phrase is how a walkie-talkie works

Translation apps wait for you to stop talking, or translate every half-sentence as it comes. The first is a conversation in turns; the second is a stream of fragments with the verb still to come, which in German or Hungarian is often the part that mattered.

A human interpreter does neither. They let the speaker run ahead, hold on until a thought is complete, then say it — a few seconds behind, all the way through. That is the behaviour this copies: listen without stopping, cut at the end of a thought, translate it with what came before as context, and speak it while the next one is already being heard.

It is built for one table in particular: Polish, Hungarian and Romanian around an English speaker, with Dutch words dropped in. English is understood already, so it is shown, kept as context and never spoken back.

How it works

Deciding when a thought is complete

mic ─▶ voice activity ─▶ segmenter ─▶ translate ─▶ voice ─▶ headphones
                          ▲      │
                          └ ASR ◀┘  re-reads what is not yet cut, every 0.5 s

Recognition runs on the Neural Engine and translation on the GPU, side by side, so hearing the next thought never waits for the last one to be spoken.

Every half second the uncommitted tail of speech is transcribed again, and words count as settled once two passes agree on them. A piece is cut at the end of a sentence that speech has carried on past, at a pause long enough for this speaker, or at a comma once it has run four seconds. At five it is cut wherever it can be, and at six wherever it stands; the next piece picks up the sentence.

A general model such as Qwen is also asked, in a single forward pass, whether the words so far can be translated yet. That is why it speaks sooner in quick conversation: it can cut at “Nie wiem, czy zdążymy na pociąg.” and hold at “Nie wiem, czy.” TranslateGemma cannot be asked, so it relies on the rules alone, and translates better.

When it falls behind

Speech does not wait for the interpreter, and people speak unevenly: they pause for effect, think aloud, build up slowly. That is meant to queue, not be cut; the pauses are context for the next piece. Pieces that pile up while it is busy go out together as one translation, and once a second of speech is queued the voice speeds up, to at most 1.3 times. Everything is translated in full.

Some listeners would rather keep up than hear all of a long story. Summarise to keep up, off unless chosen, says only the gist once the interpreter is behind: “complaining about back pain and their boss.” It needs a translator that takes instructions, Qwen or Gemma 4.

What it does

A halting German announcement, as it is heard

[ 0.00– 3.52] clause   │ Also, ich wollte eigentlich nur kurz sagen,
  #0  lag 2.7 s → Also, I just wanted to say briefly…
[ 3.90– 6.70] clause   │ dass wir morgen nicht um neun,
  #1  lag 4.6 s → that we won’t be meeting at nine o’clock.
[ 6.92– 9.80] sentence │ sondern erst um halb elf anfangen.
  #2  lag 4.2 s → but to start at 10:30.
[10.10–13.14] force    │ Der Grund ist, dass der Zug aus München
[13.52–15.92] pause    │ wegen Bauarbeiten ausfällt.
  #3  lag 5.2 s → The reason is that the train from Munich…
  #4  lag 5.0 s → …is cancelled due to construction work.
[17.98–21.74] clause   │ Wer kann, sollte vielleicht mit dem Auto kommen,
  #5  lag 4.6 s → Those who can should perhaps come by car.

lag  median 5.0 s, max 6.6 s over 8 pieces

The project's German sample through the native engine with TranslateGemma, in real time on an M1 Mac. Lag is from the end of what was said to the start of its English. force marks the five-second ceiling: the sentence ran on, so it was cut and finished in the next piece.

“halb elf” is 10:30, not half past eleven. A 4B model reads European clock times the English way and got 3 of 10 right, so German and Dutch half hours and quarters are rewritten to digits before the model sees them. On held-out times in seven languages: 14 of 14.

[ 2.30– 5.90] clause   │ No, scusate. Il treno parte alle 7 e un quarto,
  #1  → No, sorry. The train leaves at 7:15.
[ 8.26–12.26] flush    │ Quindi ci vediamo in stazione verso le 7-5.
  #3  unclear, not spoken
      The clock time was unclear in speech recognition. Please repeat it.

When recognition writes sette meno cinque as 7-5, there is no telling whether that was 6:55 or something else. It is shown with a request to repeat it, and not spoken.

Real conversation

Tuned on seventy minutes of a real kitchen table

Samples read clearly are the easy case. The segmenter was tuned on a 70-minute recording of English, Polish and Hungarian, with Dutch words in it, from an iPhone's bottom microphone. What that changed:

The voice

One voice, eight languages, 64 MB

The interpreter speaks with snepssen: one small Piper voice that speaks English, Polish, Hungarian, German, Dutch, French, Spanish and Italian as the same character, whispery, tired and steady, rendering a sentence in milliseconds on the device.

It began as an English voice. Its other languages were taught from speech generated with the same vocal profile, read from scripts written for each language's hard sounds, cut, checked line by line and trained together. Sounds the phonemizer gets wrong, Polish hard dz, Hungarian silent h, or shares across languages that say them differently, German, Dutch and Italian r, are corrected before the voice sees them, by voice-polyglot's Polyphon; the apps carry a port of it held to the original symbol for symbol. Each language plays at its own pace, picked by ear, since the new languages were read faster than the English.

It is still training. Native listeners understood its Polish and Hungarian; German and Dutch sound native enough to be rushed. A better-trained voice is a rebuild away.

Snepssen interpreting snepssen

The voice also makes the test speech. Each language is spoken by snepssen, heard by the app's speech recognition and interpreted into another, which tests the whole chain and how legible the voice is at once:

Snepssen speaksInterpreted intoWords recognition heard right
FrenchItalian94%
EnglishPolish92%
DutchSpanish90%
SpanishDutch90%
GermanHungarian86%
ItalianFrench86%
HungarianGerman85%
PolishEnglish82%

TranslateGemma, in real time on an M1 Mac, a halting announcement or a fluent one per language. The misses that mattered were clock times: fél tizenegykor heard wrong became the wrong time in German. That is the next thing to make safe.

Models

Choose the translator; it downloads once

Models are picked in the app on first launch, and can be added, switched or deleted in Settings. One translator is in memory at a time; on an 8 GB iPhone 17 a 4B model fits beside recognition with the increased-memory entitlement. Measured on the same 26 lines in ten languages and a 17-case test of complete thoughts:

TranslatorMeaning errors in 26 linesJudges a complete thoughtMemory
TranslateGemma 4B recommended0, the most natural Englishno — cuts on pauses and punctuation2.6 GB
Qwen3 4B317 of 172.8 GB
Gemma 4 E4B113 of 174.7 GB — a Mac, or a 12 GB iPhone
Gemma 4 E2B512 of 173.0 GB
EuroLLM 1.7B 4 GB iPhonesabout 4 in 21; the gistnot asked — 9 of 171.4 GB — fits an iPhone 13
RecognitionLanguagesTen seconds of speech, M1 Mac
Parakeet Ultra default25 European0.19 s, on the Neural Engine
Whisper large-v3 Turbo100, Norwegian among them2.42 s

Into English, TranslateGemma's is the most natural; into Polish and Hungarian the comparison is still to be made.

On the iPhone and the Mac

One engine, two apps

Headphone microphone

iPhone · iOS 26+

AirPods sit closer to the people talking than a phone in a pocket. Recorded in full quality where they support it, and asked to hear the whole room rather than mainly you.

Captions only

iPhone · Mac

For a phone on the table when nobody has headphones: translations on screen, nothing spoken over the room.

A dark screen

iPhone

Interpreting is foreground-only, so the screen stays awake while live. The moon turns it black but for the last line and a Stop button.

Any language, or only these

iPhone · Mac

Everything that isn't your language is translated. Naming the languages at the table instead makes a misheard Russian for a Polish speaker stay quiet.

Into your language

iPhone · Mac

Pick the language you hear: any of the voice's eight. What is already in it is shown and kept as context, not spoken. Untrained languages, with an accent, are behind a setting.

Getting it

Built from source, for now

There is no App Store build. The apps need an Apple silicon Mac with macOS 14, or an iPhone with 8 GB of memory, and Xcode to build them. espeak-ng's data comes from voice-forge, cloned beside this repository, and the voice from voice-polyglot. Everything to build them is here: the app's source and build scripts, and in voice-polyglot the whole pipeline the voice was made with, from the scripts it read to training and export. The voice itself is fetched by the build from voice-polyglot's releases, the newest one each time: still in training, marked with an asterisk and the epoch it was exported at.

# beside each other
git clone https://github.com/snepssen/voice-forge
git clone https://github.com/snepssen/translate-core
cd translate-core

apple/build.sh             # the Mac app: apple/Interpreter.app
apple/iOS/build-ios.sh     # the iPhone app, onto a connected iPhone
uv run translate-core live # the Python rig the apps were measured against

The iPhone build signs with your own development team, set in apple/iOS/project.yml. The first launch downloads speech recognition and the translator you choose — about 3 GB, best on Wi-Fi.

Where it is going

Roadmap

The goal does not change: be included in a conversation you would otherwise sit out, in your own language, with nothing leaving your device.

Finish training the voice

now

Three to four days of training, a check-in every 25 epochs, until the voice is indistinguishable by ear; the apps pick up each better export.

Safe numbers

next

A clock time or number recognition was unsure of is asked about, not spoken: the wrong time said with confidence is the worst mistake it makes.

Real rooms

next

Many voices, crosstalk, a noisy kitchen: the 70-minute recording rerun after every large change, and new ones in other languages.

A translator per language

next

TranslateGemma, Qwen and Gemma 4 compared into Polish and Hungarian, not only English, and the best chosen for each.

Timing word by word

later

Voice Forge's per-word duration control in the polyglot voice, for the odd phrase that still rushes inside a sentence.

One engine, shared

later

Voice Forge, voice-polyglot and this app each fetching the latest of the others, instead of keeping copies.

Android

later

The voice and phonemizer already run there; recognition and translation have Android runtimes. As phones gain memory, the room for a better translator grows with them.

The App Store

when permitted

Publishing depends on the permission of everyone whose work is inside: espeak-ng and Piper are GPL, and the voice was trained on speech generated with Suno. This app is the working demonstration that request will rest on. Until then it is what it is today: open source, built from source.

Honesty

What it is not

It is not a certified interpreter, and should not be relied on where a mistranslation costs more than a repeated question: a doctor, a contract, a police station. A 4B model gets most things right and some things confidently wrong, and short or garbled phrases are where it goes wrong most.

Recognition can invent words from faint speech or noise, and it covers 25 European languages; Norwegian and the rest need Whisper, which is about ten times slower. It speaks eight languages well; others only through a setting, with an accent. Into languages other than English the translators are less tested, and Qwen's Polish is rough. On the iPhone it works only while the app is open.

It is still being tested in the field. The numbers above are from recordings and one kitchen table, not from many people in many rooms.

The wider workshop

Eleven pieces, one local-first practice.

Move between guided-meditation authoring, measured speech, live interpreting, lyric video, delivery validation, keeping a Downloads folder empty, and the small field tools that support all of them, on one voice and one speech engine they share.

01 / JOURNEYSmacOS · Windows · Linux

Gateway Forge

Assemble guided sessions and keep published maps beside what was actually found.

Explore Gateway Forge →
02 / SPEECHmacOS · Windows · Linux

Voice Forge

A transparent Piper workbench for timing, pronunciation, and honest audio export.

Explore Voice Forge →
03 / VIDEOmacOS · Windows · Linux

Protoke

Karaoke and narration video with a vector visor face that mouths every word.

Explore Protoke →
04 / DELIVERYmacOS · Windows · Linux

Media Preflight

Check a finished file against where it is going, and correct it without touching the original.

Explore Media Preflight →
05 / INTAKEmacOS · Windows · Linux

siphon

Fetch from a link or convert what you already have, without re-encoding what it does not have to.

Explore siphon →
06 / FILINGmacOS · Windows · Linux

auto-sort

Empty the Downloads funnel into structure the folder taught it, and undo any of it.

Explore auto-sort →
07 / INTERPRETINGmacOS · iPhone

Interpreter

Hear the table in English a few seconds behind, cut at the end of each thought, on your own phone.

Explore Interpreter →
08 / FIELD TOOLSPython · shell

tools-core

Small utilities for audio inspection, corpus work, authoring, and repeatable checks.

Open the toolbox →
09 / VOICEPiper · eight languages

voice-polyglot

Teaching one small voice to speak eight languages, and releasing it for every app that speaks.

Open the repository →
10 / ENGINESwift · macOS · iOS

voice-core

The speech engine the apps share: espeak-ng, the phonemizer and Piper inference, from one source.

Open the repository →
11 / PAGESPython · HTML

site-core

The builder and project network every page here shares, kept in one place.

Open the repository →

Get in touch

If something looks wrong, say so

There is no analytics here and no crash reporter, so a failure has no way of reaching me on its own.