# Church Translate Live sermon translation into 100+ languages. One Mac app per campus. No servers, no deployment, no subscription. Congregants point a phone camera at a QR code, tap their language once, and read along — or let their phone read it aloud in their ear. No app, no account. Built because [Kaleo](https://withkaleo.com/) is $24–149/month and [OneAccord](https://www.oneaccord.ai/) starts at $150/month for five hours, and both are wrappers around cloud speech and translation APIs that an M-series Mac runs locally for nothing. --- ## How it works Everything is inside the one app. Install it on the Mac at a campus, point it at the pastor's microphone, and it serves the congregation page itself. ``` ┌──────────────── one Mac, one campus ─────────────────┐ │ │ │ Dante ─┐ │ │ Waves ─┼─► audio in ──► voice detection │ │ M32 ───┘ │ │ │ ▼ │ │ Whisper (Mac GPU) │ │ │ │ │ NLLB-200 (separate process) │ │ │ │ │ built-in web server ──────────────┼──► phones on │ │ the WiFi └───────────────────────────────────────────────────────┘ ``` **No audio ever leaves the Mac,** and nothing leaves the building unless you choose to publish it. Only finished sentences cross the network, so a full auditorium costs almost nothing to serve. Two details that are not preference but necessity: translation runs in its own plain-Node child process, because Chromium's allocator refuses the model's gigabyte-sized weight blocks and kills the process; and speech recognition runs on the GPU while translation runs on the CPU, because neither fits in the other's runtime. ## What it costs | | | | --- | --- | | Speech recognition | Whisper large-v3-turbo, on the Mac's GPU — **$0** | | Translation, 100+ languages | NLLB-200, on the Mac's CPU — **$0** | | Spoken audio | The listener's own phone — **$0**, at any scale | | Serving the page | The app itself — **$0** | | Dante input | Dante Virtual Soundcard, **~$50 once per campus** — or free via Waves or console USB | ## Performance Measured on an M2 Max, from the end of a spoken sentence to captions on a phone. Partial text appears well before that, so it feels quicker than the numbers. | | | | --- | --- | | Live preview | updates every **500–800 ms** while the sentence is still being spoken | | Finished sentence | **~1.6 s** behind the speaker | | Speech recognition | 4.9× real time (accurate model) | | Translation | ~390 ms per language, flat over 240 consecutive runs | | Memory | plateaus at 10–11 GB; no drift across a long service | Two speech models run at once: a fast one drives the live preview, an accurate one produces the line the congregation keeps. They run on separate tracks, so the preview costs the finished caption almost nothing. ## Getting started - **[docs/SETUP.md](docs/SETUP.md)** — installing at a campus - **[docs/AUDIO.md](docs/AUDIO.md)** — Dante, Waves SoundGrid, console USB - **[docs/COMPANION.md](docs/COMPANION.md)** — the Stream Deck button - **[docs/SUNDAY.md](docs/SUNDAY.md)** — print this and tape it to the desk - **[docs/PUBLIC-ACCESS.md](docs/PUBLIC-ACCESS.md)** — optional, for people off-site ```bash cd app && npm install && npm start # run from source cd app && npm run dist # build the .app ``` ## Things worth knowing - **Only languages people are actually listening to get translated.** Nobody on Icelandic means no CPU spent on Icelandic. Pin a language on the operator page to have it ready before the first person arrives. - **Corrections beat retraining.** Operator page → Corrections → `have a cook => Habakkuk`. Whole-word, case-insensitive, instant. - **A late arrival sees the last 40 lines**, so walking in halfway still makes sense. - **Transcripts** are written per service, original and every translation, under `~/Library/Application Support/Church Translate/data/transcripts/`. - **Each campus is independent.** Nothing is shared, nothing syncs, and one campus being down has no effect on another.