Files

99 lines
4.7 KiB
Markdown
Raw Permalink Normal View History

# 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.