TranslateOff
Face-to-face conversation translator running a 4B translation model fully on-device. Split screen with a mic per speaker, English ↔ Chinese, no network after setup.
Private RepositoryLive Demo
TranslateOffScreens coming soon
About the Project
Translation apps want signal, and you need them exactly where signal is worst. TranslateOff removes the network from the loop entirely: the translation model runs on the phone, so after a one-time download the app never talks to anything again.
The interaction is built for two people and one device. The screen splits in half with the far side rotated 180° to face the other person, each half in its own language, each with its own mic button. Every spoken turn appears on both halves in both languages.
Core Features:
- Fully offline translation after a one-time model download — no account, no server, no conversation logs
- Two-sided split screen, far half rotated, with a volume-reactive mic button per speaker
- Every turn shown in both languages on both halves, tap any line to hear it read again
- Streaming output so text appears as the model produces it rather than after it finishes
- Optional spoken playback with explicit voice resolution, and an honest warning when the device is missing the voice data
Technical Architecture:
- Expo SDK 57 / React Native 0.86 / React 19 / TypeScript, new architecture, dev-client only (the app is native code end to end)
- A 4B quantized translation model executed on-device through llama.rn: a resident context with GPU offload and CPU fallback, a serialized completion queue, and a hand-built prompt template with explicit stop handling
- Speech-to-text through the platform recognizers with a per-tap locale, interim results, and volume events driving the mic animation
- Custom Kotlin module wrapping the OS download manager for the multi-gigabyte model transfer, so it survives the app being killed — with a persisted download handle, polling progress, and re-attach on relaunch
- Dual storage roots with byte-level verification before a downloaded model is trusted
- Streaming callback that reports the whole translation so far rather than deltas, so displayed text only ever grows and never rewrites itself mid-sentence
Engineering Highlights:
- Chose on-device inference over every cloud API by definition — privacy is the product, not a feature of it
- Evaluated and rejected a bundled speech model: several hundred megabytes more, hand-rolled voice detection, and worse accuracy than the free platform recognizers
- Separate build identities for development and preview installs so both can coexist on one device, each with its own model copy
- Kept the whole runtime dependency-free at the network layer: the only transfer that ever happens is the initial model download
Tech Stack
ExpoReact NativeTypeScriptllama.rnOn-device LLMKotlinSpeech RecognitionMaterial 3