You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Reachable at `http://<DOMAIN>:8080` — nginx publishes host port `8080`, plain HTTP only, no TLS termination. Put a TLS-terminating load balancer in front for a real deployment.
54
+
55
+
`restart: unless-stopped` is set on the **app** container only; the nginx sidecar has no restart policy (`docker-compose.yml`), so it won't come back on its own after a crash or host reboot.
56
+
57
+
nginx also rate-limits `/v1/synthesize` (2 req/s, burst 4) and caps connections per IP — a `503` from behind nginx under load is a plain nginx error page, not the app's Problem Details JSON.
`boundaries` is `null`when the provider does not support word timing. Check `voice.boundary` before requesting — if `false`, the response will always return `null`.
209
+
`boundaries` is always `null`today — no provider populates timing marks yet. Every voice reports `boundary: false`; check it before setting `boundary: true` to skip a wasted round trip.
204
210
205
211
Word boundary fields mirror the [Web Speech API `boundary` event](https://developer.mozilla.org/en-US/docs/Web/API/SpeechSynthesisUtterance/boundary_event): `charIndex` and `charLength` index into the original `text`; `elapsedTime` is seconds from audio start.
206
212
@@ -214,20 +220,24 @@ Word boundary fields mirror the [Web Speech API `boundary` event](https://develo
214
220
215
221
**Errors:**
216
222
217
-
All errors return a consistent shape:
223
+
All errors are [RFC 9457 Problem Details](https://www.rfc-editor.org/rfc/rfc9457) (`Content-Type: application/problem+json`):
| 502 |`provider_error`| Provider or ffmpeg failed |
236
+
| 503 |`service_not_ready`|`/readyz` only — models not loaded, ffmpeg missing, or a provider unhealthy |
237
+
238
+
Behind production nginx, a `503`/`429` can also come from nginx's own rate/connection limits — those are plain nginx error pages, not `application/problem+json`.
239
+
240
+
Full field-by-field reference, including every request/response field and what's not implemented yet: [`docs/API.md`](docs/API.md).
231
241
232
242
---
233
243
@@ -241,13 +251,16 @@ Run `make configure` to generate `.env`, or run `bash scripts/configure.sh` dire
241
251
|`HF_TOKEN`|_(empty)_| HuggingFace token. Optional — prevents rate-limiting on first-run model downloads |
242
252
|`WORKERS`|`1`| Uvicorn worker processes. Each loads a full copy of every active language model |
243
253
|`MAX_CONCURRENT_SYNTHESES`|`2`| Max parallel CPU inference jobs per worker |
244
-
|`API_KEY_ENABLED`|`false`|Require `X-API-Key` header on all routes|
245
-
|`API_KEY`|_(empty)_|Key value when `API_KEY_ENABLED=true`|
254
+
|`API_KEY_ENABLED`|`false`|Reserved — validated at startup but **not yet enforced**on any route|
0 commit comments