Realtime ASR (Add-on)
Scriptix On-Prem can run CPU realtime ASR alongside batch transcription. This is an opt-in add-on — your license must include the realtime entitlement before any of it works.
This page walks through enabling realtime on an existing Scriptix On-Prem install. If you haven't installed the base stack yet, follow Installation first and come back here.
What you need from Scriptix support
Realtime artifacts are not part of the public installer bundle. Contact us to enable the add-on; we'll send you four things:
- A v2 license (
license.json) — replaces your existinglicense.jsonand now carriesrealtime: true,max_realtime_streams, and the language list your subscription permits. See Licensing. - A Kaldi license file (
license.dat) — separate fromlicense.json, signed by Scriptix and consumed by the realtime ASR engine. - A registry pull token for the realtime engine binary
(
scriptixrt.azurecr.io/asr/server). Read-only, valid for 1 year by default. - A models SAS token for our model bucket
(
scriptixmodels.blob.core.windows.net/models). Same bucket as your existing batch models — the realtime per-language packs and the optionallarge-v3-turbowhisper variant live alongside them. Scoped to the languages your license includes. - Model version values —
REALTIME_LANGUAGE_VERSIONandREALTIME_COMMON_VERSIONmatching what your license permits.
Without all five you can't bring realtime up — they are language- and license-specific.
Hardware
The realtime engine is CPU-only. As a starting point per concurrent realtime stream:
- 2 CPU cores (modern x86_64; no AVX requirements)
- 4 GB RAM
- ~30 GB disk for model artifacts (one-time, shared across streams)
Your max_realtime_streams license value is the cap. Plan capacity
for the worst case (every stream busy at once) plus headroom for the
batch stack on the same box.
The first time the pod starts it pulls and stages multi-GB model images — boot time on a fresh box can take 10–20 minutes depending on your network. Subsequent restarts are fast (the image layers are cached locally).
Setup
1. Replace your platform license
Drop the new license.json over your existing one and restart the
api container:
cp license.json ./config/license.json
docker compose -f docker-compose.onprem.yml --env-file .env.onprem \
restart api
Visit Settings → License — you should now see "Realtime: enabled" along with your stream cap and permitted languages. If you don't, the new license didn't take; double-check the file path and retry.
2. Place the Kaldi license file
cp license.dat ./config/license.dat
This is a separate file from license.json and lives next to it.
Don't rename it; the realtime overlay expects exactly this path
(override via REALTIME_LICENSE_FILE if you must).
3. Log in to the private realtime registry
Use the username + password Scriptix support provided:
docker login scriptixrt.azurecr.io
# Username: <token name from Scriptix>
# Password: <token secret from Scriptix>
You should see Login Succeeded. The credentials are stored in
~/.docker/config.json; if you re-provision the host, repeat this
step.
4. Add realtime knobs to .env.onprem
Append (or edit) these lines, using the values Scriptix gave you:
REALTIME_LICENSE_FILE=./config/license.dat
# Single-language deployments. Multi-language requires a templated
# overlay — ask Scriptix support if your license includes more than
# one language.
REALTIME_LANGUAGE=nl-nl
REALTIME_LANGUAGES=nl-nl
REALTIME_LANGUAGE_VERSION=2026.04
REALTIME_COMMON_VERSION=2026.04
# Models SAS token for scriptixmodels.blob.core.windows.net (Scriptix
# provides this — same bucket as your batch models).
MODELS_SAS_TOKEN=...
# Optional: pull the large-v3-turbo whisper variant alongside the
# default batch model. Leave empty if you only want the default.
WHISPER_VARIANT=
# Don't change these unless support tells you to.
REALTIME_REGISTRY=scriptixrt.azurecr.io/asr
REALTIME_IMAGE_TAG=latest
REALTIME_SERVICE_ENDPOINT=ws://asr-server:8890
5. Bring realtime up
Two compose overlays ship — pick the one that matches your network:
docker-compose.realtime.bucket.yml(recommended) — pulls per-language model packs fromscriptixmodels.blob.core.windows.netusing the SAS token you set above. One init container, model packs cached on a Docker volume after the first run.docker-compose.realtime.yml— legacy path, pulls per-language model OCI images fromscriptixrt.azurecr.io. Still supported for customers who already have ACR pull tokens scoped to model repositories.
docker compose \
-f docker-compose.onprem.yml \
-f docker-compose.realtime.bucket.yml \
--env-file .env.onprem pull
docker compose \
-f docker-compose.onprem.yml \
-f docker-compose.realtime.bucket.yml \
--env-file .env.onprem up -d
The pull step grabs the asr-server binary image. The first
up -d then runs realtime-models-init to fetch and stage the model
packs — multi-GB downloads, expect 10–20 minutes on a fresh box. After
that, the cache volume keeps them; restarts are fast.
Containers you'll see:
realtime-models-init— one-shot, downloads + extracts the language pack(s) and the shared common pack from the bucket.asr-server— long-running, the realtime engine itself.
6. Verify
docker compose ps
You should see the two init services as Exited (0) and
asr-server as Up.
docker compose logs asr-server | head -20
Expect a "License is valid" line with your licensee string.
A wrong or expired license.dat produces "Invalid license signature"
or similar — that's the most common failure during first activation.
End-to-end: try claiming a realtime session against the platform API. With a valid login token:
curl -X POST -H "Authorization: Bearer <token>" \
http://localhost:8000/api/v4/realtime/initialize
A 200 response with a endpoint field means realtime is live.
A 403 license_missing_entitlement means the platform license isn't
v2 yet — go back to step 1.
Restart, upgrade, and rollback
Restart only realtime (e.g. after rotating license.dat):
docker compose -f docker-compose.onprem.yml \
-f docker-compose.realtime.yml \
--env-file .env.onprem restart asr-server
Upgrade to a new model version — bump REALTIME_LANGUAGE_VERSION
or REALTIME_COMMON_VERSION in .env.onprem, then re-run the pull
up -dsequence. The init services re-stage; the volume keeps the old version available, so disk grows over time. Prune withdocker volume pruneonce you're sure you don't need to roll back.
Disable realtime — leave the license alone, just stop the overlay:
docker compose -f docker-compose.onprem.yml \
-f docker-compose.realtime.yml \
--env-file .env.onprem stop asr-server asr-models-init asr-common-init
The platform API's realtime endpoints will start returning
503 service_unavailable instead of 200; batch is unaffected.
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
403 license_missing_entitlement from /v4/realtime/* | Platform license is still v1 (no realtime field) | Replace license.json with the v2 file Scriptix sent; restart api. |
asr-server boot loop with "Invalid license signature" | Wrong license.dat, or it's been since rotated | Ask support to re-issue. |
asr-models-init stuck on pull | Pull token doesn't include the model image for your language | Confirm the language matches what's on your license; ask support for a re-scoped token if not. |
asr-server healthy but realtime /initialize 503 | Network unreachable from api to asr-server:8890 | Check both containers are on the same compose network: docker compose -f docker-compose.onprem.yml -f docker-compose.realtime.yml --env-file .env.onprem config. |
| First boot extremely slow | Model layers (multi-GB) downloading for the first time | Expected — wait it out. Subsequent restarts use the cached layers. |
If you're stuck, send docker compose logs asr-server and
docker compose logs api (last 200 lines each) to support; a license
hash + your licensee string lets us reproduce server-side.
What this doesn't cover
- Multi-language deployments. The shipped overlay runs one language. If your license permits multiple, ask support for a templated overlay that fans out per language behind an nginx gateway.
- Kubernetes deployments. Customers running Scriptix On-Prem on K3s/K8s use a Helm overlay instead — ask support and we'll send the values file.
- Air-gapped boxes. If your box can't reach
scriptixrt.azurecr.ioat all, we ship offline tarballs of every required image plus the license artifacts. This is a custom flow today, not the default.