The Problem

Real-time speech translation typically means sending audio to a cloud service, which introduces latency, privacy concerns, and per-minute costs. This app solves that by running the entire pipeline locally — audio capture, speech-to-text, and translation — through a Tauri desktop shell. Your audio never leaves the machine except for the STT/translation API call itself (Soniox), and you bring your own API keys.

What This Does

my-translator is a Tauri-based desktop app (Rust backend, vanilla JS frontend) that captures system audio or microphone input, converts it to 16kHz PCM, and streams it to the Soniox API for transcription and translation. Results appear in a minimal overlay with optional TTS narration from Edge (free), Google, or ElevenLabs. The audio capture layer lives in src-tauri/src/audio/ (microphone.rs, systemaudio.rs, wasapi.rs), and the Tauri command handlers in src-tauri/src/commands/ expose those functions to the frontend in src/js/app.js.

The app supports one-way and two-way translation (for bilingual meetings), custom translation terms, and a local offline mode for Apple Silicon (scripts/localpipeline.py). It is signed and notarized for macOS and includes an auto-updater (src/js/updater.js). The UI is deliberately minimal — a floating overlay with adjustable font size, dual-panel view, and smart auto-scroll.

How To Use It

Setup: The project uses cargo for the Rust/Tauri backend and npm for the frontend. Clone the repo, run npm install in the root, then npm run tauri dev for development or npm run tauri build for a release binary. The CI workflow in .github/workflows/release.yml builds signed macOS and Windows installers.

Configuration: You need a Soniox API key for transcription/translation. Optional keys for Google TTS and ElevenLabs if you want those providers. Settings are managed in-app via src/js/settings.js and persisted through the Tauri settings commands in src-tauri/src/commands/settings.rs. There are no .env files — keys are entered in the UI.

Running it: After building, launch the app. Select your audio source (system, mic, or both), set source and target languages, and start capturing. TTS is off by default — toggle with ⌘ T.

Real-World Use

A bilingual meeting scenario: two speakers, one Vietnamese, one Japanese. Set audio source to "Both," translation type to "Two-way," and assign languages A and B. The app detects who is speaking and translates in the correct direction. TTS is automatically disabled in two-way mode to prevent feedback loops. For a presentation, switch to one-way mode, enable Edge TTS (free, no key needed), and increase the font size to 140px for readability.

Code Health & Issues

High - No test files detected — the entire codebase (14 Rust files, 10 JS files) has zero tests. Audio capture and real-time streaming are failure-prone; untested code paths will surface as production bugs. Med - Single-vendor dependency — the app is hardwired to Soniox for STT. If that API changes pricing or shuts down, the core feature breaks. The local mode (scripts/local_pipeline.py) exists but is marked experimental and Apple Silicon only. Med - No CI test step — .github/workflows/release.yml builds and releases but runs no tests or linting. The repo has no Makefile or test scripts in package.json. Low - Documentation is image-heavy — 32 of 34 doc files are PNG screenshots. Installation and TTS guides are text, but user manuals are visual only, which limits searchability and accessibility.

The Bottom Line

A solid, focused desktop app for real-time translation with a clean architecture (Rust backend, thin JS frontend) and good platform coverage. The lack of tests and single-vendor STT dependency are the main risks. Best suited for individuals or small teams who need a privacy-preserving translation tool and are comfortable managing their own API keys.