Engine Setup
Getting free-tier API keys for the cloud engines, and the token budgets confirmed to work well for each — so a fresh install doesn't have to rediscover them by trial and error. All of this is configured from the Translation Engine page.
Google Gemini
Go to aistudio.google.com and sign in with a Google account.
Click Get API key (left sidebar) → Create API key. Copy it.
In Subtitlarr, add a new engine instance: provider Gemini, name it "Gemini Main", paste the key, and set the model to gemini-3.5-flash-lite.
Batch token budget: 4000
Stacking a second model on the same key
Gemini's free-tier daily request quota (500/day) is tracked per model, not once per account — so a second instance using the same key but a different fast model gets its own independent 500/day pool:
- Add another instance: name it "Gemini Main gemini-3.1-flash-lite", same API key as "Gemini Main", model set to
gemini-3.1-flash-lite— the confirmed real API model ID (AI Studio's dashboard shows a friendlier display name that doesn't map 1:1 to this string). - Batch token budget:
4000
This alone doubles account A's usable quota to 1000/day, with zero extra signups.
Doubling again with a second account
The same 2-models-per-key trick works again with a second Google account and its own key, for 4 Gemini instances total and 2000 requests/day combined:
- Repeat the steps above with a second Google account — again, a fresh account with nothing else tied to it, not your main one.
- Add it as "Gemini Secondary", model
gemini-3.5-flash-lite, batch token budget4000. - Optional — add "Gemini Secondary gemini-3.1-flash-lite", same key, model
gemini-3.1-flash-lite, budget4000. - Order the cascade Main → Secondary → Main (3.1) → Secondary (3.1), so BOTH accounts' stronger model is tried before either account's weaker fallback model.
This is legitimate use of separate free tiers — each account's quota is used independently and entirely for that account's own usage.
If you'd rather keep quality consistent across the whole cascade, skip both 3.1 instances and just use "Gemini Main" + "Gemini Secondary" (both gemini-3.5-flash-lite) for 1000/day — half the ceiling, but every item gets the better model.
NVIDIA NIM
Go to build.nvidia.com and sign in / create an account.
Open any model page (e.g. search for DeepSeek), click Get API Key, and copy it.
In Subtitlarr, add a new engine instance: provider NVIDIA, paste the key, and set the model to a real instructable chat model currently listed in the build.nvidia.com catalog — there is no default model set for this engine. NVIDIA also hosts dedicated translation-only models (e.g. Riva Translate) — do not use one of those, they don't support the formatting this app relies on.
Batch token budget: 700. Free tier is capped at roughly 40 requests/minute — no daily cap confirmed, unlike Gemini.
Local Ollama
No API key needed — this is your own local (or LAN) inference server.
Install Ollama and pull a model:
ollama pull translategemma:12bIn Subtitlarr, add a new engine instance: provider Ollama, base URL pointing at your Ollama server (e.g. http://localhost:11434 or http://<lan-ip>:11434), model translategemma:12b.
Batch token budget: 400. Small local models lose reliable output formatting well before they run out of raw context window — 400 is a safe starting point for modest/low-end GPUs, including with translategemma:12b. A more capable local GPU/model may support a higher budget.
Recommended cascade shape
Put your free-tier Gemini instance(s) at the top of the cascade, then a separator, then your local engine(s) below it. This stops a run from silently falling back to slow local inference for hours just because Gemini hit a temporary rate limit, while still leaving local engines available for a deliberate manual run.
This is what the Translation Engine page should look like, top to bottom, once everything above is set up (max-throughput version, 2000/day):
| Order | Instance name | Provider · Model | Batch budget |
|---|---|---|---|
| 1 | Gemini Main | Gemini · gemini-3.5-flash-lite | 4000 |
| 2 | Gemini Secondary | Gemini · gemini-3.5-flash-lite | 4000 |
| 3 | Gemini Main gemini-3.1-flash-lite (optional — see quality note above) | Gemini · gemini-3.1-flash-lite | 4000 |
| 4 | Gemini Secondary gemini-3.1-flash-lite (optional) | Gemini · gemini-3.1-flash-lite | 4000 |
| — | — cascade stops here — anything below is never tried as a fallback — | ||
| 5 | Ollama | Ollama · translategemma:12b | 400 |
Drop rows 3 and 4 for the quality-first version instead (1000/day, every item on gemini-3.5-flash-lite).
Optionally add an NVIDIA instance (a real instructable chat model from the build.nvidia.com catalog, budget 700) either above the separator as a 5th cloud fallback, or below it alongside Ollama, depending on whether you want it tried automatically or reserved for manual runs.
Recommended workflow
Getting a library fully translated efficiently is a multi-pass process:
Make sure Bazarr can actually see your existing subtitles first. A subtitle muxed into the video file (not a separate .srt on disk) is invisible to Subtitlarr until Bazarr extracts it. In Bazarr:
- Settings → Subtitles → (disable) "Treat Embedded Subtitles as Downloaded"
- Settings → Providers → add "Embedded Subtitles" (if not already there)
Neither toggle retroactively extracts anything by itself — Bazarr still needs to scan your library afterward, either via its own scheduled task (can take up to a full day) or triggered manually. Give it time before assuming a source language is missing.
Run the cascade with local engines fenced off behind a separator and let it translate everything it can. Leave failures as failed for now rather than chasing each one down individually.
Once the queue is drained, re-run just the failures. Filter the Queue page to the Failed chip and run that filtered batch. A second pass over just the failures often clears a meaningful chunk of them on its own (rate limits expiring, quota resets).
Only then, drag your local engine above the separator for whatever remains failed. With a non-Gemini engine actually in reach, a content-blocked batch gets bisected instead of failing outright (see above) — Gemini still handles everything except the specific isolated cues that trip its filter. Doing this from the start means paying local inference time on every content-blocked item instead of only the genuine leftovers.
Run the Language Check job (Jobs page) after a big batch. A "successful" translation can still silently come back in the wrong language — this audits recently-completed items against their actual detected output and resets any mismatch back to pending. It needs a check engine picked on the Jobs page first, and isn't scheduled by default unless LANGUAGE_CHECK_CRON is set — otherwise it's manual-only, so remember to run it.