Live translation for talks and lectures. Point your phone at the speaker, read the talk in your language, in real time.
A lightweight stand-in for a human cabin (booth) interpreter when there isn't one.
-
Install TestFlight from the App Store.
-
Open this link on your device → tap Accept → Install:
- Open the latest release on your phone and download the
.apk. - Allow your browser to "install unknown apps" when prompted.
- Open the file → Install (tap Install anyway if Play Protect warns).
-
Open the app — it sends you straight to Settings (no API key saved yet).
-
Paste one API key:
- Soniox — get one at https://console.soniox.com. Cheap (~$0.12/hr), text only. Recommended for budget.
- OpenAI — get one at https://platform.openai.com/api-keys. ~$4/hr, highest translation quality. Tip: set a low monthly cap.
- Qwen — get a DashScope key (Singapore region) at https://bailian.console.alibabacloud.com. Currently a free preview, fastest streaming. Source language must be picked explicitly.
Hướng dẫn chi tiết bằng tiếng Việt: docs/api-key-guide-vi.md So sánh chi tiết các engine: docs/engine-comparison-vi.md
-
Pick your source and target language from the dropdowns (60+ languages on Qwen, auto-detect on Soniox/OpenAI).
-
Back on the main screen, tap Start, allow the microphone, and listen.
After Stop you can Copy / Share the transcript, or Summarize the session with OpenAI (needs an OpenAI key — works even after a Soniox session). Finished sessions are saved on-device; review them under 🕘 in the header. Each saved session can be searched, Exported as a Markdown file (also kept under Saved files), and is auto-named by OpenAI when a key is set. The screen stays awake while translating, and Settings → Check for updates pulls the latest over-the-air JS bundle.
Your key stays in the device's secure keychain. Audio goes straight to the provider you chose — no backend, no tracking. Session history is stored only on your device and never leaves it. See PRIVACY.md.
| Engine | Cost | First final (≈) | Strength | Source transcript |
|---|---|---|---|---|
| Soniox | ~$0.12/hr | ~3s | Cheapest, stable | Yes (dual panel) |
| OpenAI Realtime | ~$4/hr | ~7s | Most natural translation | Yes (dual panel) |
| Qwen Live Flash | Free preview | ~4s | Fastest streaming, 60+ langs | No (translation-only) |
Soniox + OpenAI auto-detect the spoken language. Qwen Live needs an explicit source language (auto isn't reliable on real mic input). Spoken voice output is disabled (the speaker echoes back into the mic and causes a translation loop) — translations are read on screen only. Full comparison: docs/engine-comparison-vi.md.
For developers
Expo SDK 54 · React Native 0.81 · TypeScript · Expo Router v4 · NativeWind v4 ·
react-native-audio-api (mic + PCM playback) · expo-secure-store (keys) ·
expo-file-system + expo-sharing (Markdown export) · expo-keep-awake ·
expo-haptics · expo-updates (in-app OTA check).
Distribution: EAS Build → TestFlight (iOS) + APK on GitHub Release (Android).
npm install
npx expo prebuild --clean
npx expo run:ios # or: npx expo run:android
# iterate after first native build:
npx expo start --dev-clientSee docs/react-native-dev-vs-production.md for how the dev client / Metro / production builds differ, and docs/eas-update-guide.md for shipping OTA (over-the-air) JS updates without a rebuild.
npm i -g eas-cli && eas login
# iOS → TestFlight
eas build --profile production --platform ios
eas submit --platform ios --latest
# Android → APK (download artifact, attach to a GitHub Release)
eas build --profile production --platform androideas.json profiles: development (dev client), preview (internal APK / ad-hoc iOS), production (TestFlight + signed APK).
app/ Expo Router screens (index = translate, settings, history, exports)
src/
engines/ soniox-client.ts, openai-realtime-client.ts,
qwen-realtime-client.ts (qwen3-livetranslate-flash-realtime)
lib/ audio-capture, audio-output-queue, secure-keys, languages,
history-store, session-export, haptics, ota-update
components/ transcript-stream.tsx, session-detail-view, icon-button
state/ Settings + Session contexts
Same as desktop my-translator.