Skip to main content

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:

  1. A v2 license (license.json) — replaces your existing license.json and now carries realtime: true, max_realtime_streams, and the language list your subscription permits. See Licensing.
  2. A Kaldi license file (license.dat) — separate from license.json, signed by Scriptix and consumed by the realtime ASR engine.
  3. A registry pull token for the realtime engine binary (scriptixrt.azurecr.io/asr/server). Read-only, valid for 1 year by default.
  4. 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 optional large-v3-turbo whisper variant live alongside them. Scoped to the languages your license includes.
  5. Model version valuesREALTIME_LANGUAGE_VERSION and REALTIME_COMMON_VERSION matching 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 from scriptixmodels.blob.core.windows.net using 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 from scriptixrt.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 -d sequence. The init services re-stage; the volume keeps the old version available, so disk grows over time. Prune with docker volume prune once 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

SymptomLikely causeFix
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 rotatedAsk support to re-issue.
asr-models-init stuck on pullPull token doesn't include the model image for your languageConfirm the language matches what's on your license; ask support for a re-scoped token if not.
asr-server healthy but realtime /initialize 503Network unreachable from api to asr-server:8890Check 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 slowModel layers (multi-GB) downloading for the first timeExpected — 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.io at all, we ship offline tarballs of every required image plus the license artifacts. This is a custom flow today, not the default.