Voxist
DOCS / MEDICAL ASR
KUBERNETES · ON-PREMISE

Medical speech recognition,
on your infrastructure.

A practical guide to deploy the Voxist medical service: prepare your cluster, install the chart and validate your first WebSocket transcription.

WebSocketLinux amd64 · CPUHelm 3EN / FR
01

Before you begin

The service combines a lightweight API proxy with a licensed medical engine. It accepts asynchronous audio streams over WebSocket and returns partial and final results. There is no REST transcription or job queue.

Your applicationWebSocket →API proxyMedical engine

Plan for two eligible nodes

The example uses two API replicas and two engine replicas, spread across at least two schedulable nodes. Reserve capacity for Kubernetes, image storage and your actual workload. These figures are a starting allocation, not a throughput guarantee.

ResourceRequests · totalLimits · total
CPU5 vCPU10 vCPU
Memory10 GiB20 GiB
Engine ephemeral storage6 GiBPlus image cache & system

You need kubectl, Helm 3, Bash, access to the target cluster and permission to create the namespace, Secrets, workloads and network policies. Confirm Kubernetes, CNI and CPU compatibility with Voxist. No GPU is required for this profile.

Access control is your responsibility: application authentication is not built in. Keep the service private until your network or gateway access controls are in place.
02

Request your deployment kit

Ask your Voxist contact for a qualified, matching deployment kit. Do not substitute images or chart versions independently.

  • Qualified Helm chart version, checksum and release notes. The chart itself is publicly downloadable.
  • API and engine image repositories with approved SHA-256 digests.
  • Harbor registry URL, a username and a password supplied by Voxist to access and download your images, with expiry and renewal instructions.
  • Supplier activation key, model/language entitlement and licence activation conditions.
  • Approved egress policy for your DNS/CNI, current licence endpoints and any proxy requirements.
  • Sizing advice, a non-patient test recording with expected results, support and upgrade procedures.
The Helm chart is public at oci://registry.voxist.com/charts/voxist-asr-medical. Release candidate 0.1.2-rc.1 can be downloaded without authentication. The API and engine images remain private and require the credentials supplied by Voxist.
03

Prepare your cluster

Use an explicit context for every command. Replace the uppercase placeholders before running the examples.

TERMINAL / BASH
export KUBE_CONTEXT="YOUR_CLUSTER_CONTEXT"
export CHART="./voxist-asr-medical-0.1.2-rc.1.tgz"
helm pull oci://registry.voxist.com/charts/voxist-asr-medical --version 0.1.2-rc.1
kubectl --context "$KUBE_CONTEXT" get nodes
# Create once; reuse the namespace if it already exists.
kubectl --context "$KUBE_CONTEXT" create namespace medical-asr

Sign in to Harbor

Voxist gives you a Harbor username and password for your read-only image access. These credentials are separate from the engine licence key. The registry is registry.voxist.com, hosted on Voxist’s OVH infrastructure. Docker will prompt for the password without putting it in the command. Docker CLI is needed for this step. Alternatively, ask Voxist for a Kubernetes-ready Docker config JSON.

TERMINAL / BASH
export REGISTRY_HOST="registry.voxist.com"
export REGISTRY_USER="YOUR_VOXIST_USERNAME"
export REGISTRY_AUTH_DIR="$(mktemp -d)"
chmod 700 "$REGISTRY_AUTH_DIR"
docker --config "$REGISTRY_AUTH_DIR" login "$REGISTRY_HOST"   --username "$REGISTRY_USER"
chmod 600 "$REGISTRY_AUTH_DIR/config.json"

Use the generated config.json as /secure/path/registry-reader.json in the Secret command below. The directory contains credentials: protect it and remove the temporary copy after creating the Secret.

Already using registry-staging.voxist.com? That address remains available. Before changing image references to registry.voxist.com, create registry credentials for the new hostname: a Secret scoped only to the staging address does not automatically cover it. Use the repositories and digests approved by Voxist.

Create the two Secrets

Save the supplier key in a protected file with no trailing newline. The registry file must be a Docker config JSON, not a raw robot-account response. Keep both files out of Git and do not put credentials in Helm values or shell arguments.

TERMINAL / BASH
kubectl --context "$KUBE_CONTEXT" -n medical-asr   create secret generic medical-engine-license   --from-file=api-key=/secure/path/supplier-license-key

kubectl --context "$KUBE_CONTEXT" -n medical-asr   create secret generic harbor-medical-pull   --type=kubernetes.io/dockerconfigjson   --from-file=.dockerconfigjson=/secure/path/registry-reader.json

Check the chart checksum against the value delivered by Voxist before installation.

TERMINAL / BASH
shasum -a 256 "$CHART"
04

Configure the service

Download the starting values, replace the two repositories and digests, then have your network policy approved. The release name must remain medical-asr: the pod placement selectors use this name.

customer-values.yaml YAML

The template keeps ingress disabled, references existing Secrets and enables strict placement on different hosts. It is a template to complete, not a ready-to-run configuration.

Allow the required outbound traffic

  • Cluster nodes → registry.voxist.com over HTTPS (443).
  • Engine pods → cluster DNS over TCP/UDP 53.
  • Engine pods → license.voxist.com over secure WebSocket (WSS), TCP port 443, for supplier licence activation and usage reporting.
Provide approved-egress.yaml before deployment. An empty workerEgress list blocks licence activation. Standard Kubernetes NetworkPolicy cannot filter by hostname: use your approved CNI, egress proxy or maintained IP policy. Do not assume an offline installation is supported.
05

Deploy with Helm

Render and inspect the configuration first, then install the approved release. The egress overlay must contain the network settings agreed for your cluster.

TERMINAL / BASH
helm lint "$CHART" -f customer-values.yaml -f approved-egress.yaml
helm template medical-asr "$CHART" --namespace medical-asr   -f customer-values.yaml -f approved-egress.yaml

helm upgrade --install medical-asr "$CHART"   --kube-context "$KUBE_CONTEXT" --namespace medical-asr   -f customer-values.yaml -f approved-egress.yaml   --wait --timeout 10m

kubectl --context "$KUBE_CONTEXT" -n medical-asr   rollout status deployment/medical-asr-worker --timeout=300s
kubectl --context "$KUBE_CONTEXT" -n medical-asr   rollout status deployment/medical-asr-api --timeout=300s
kubectl --context "$KUBE_CONTEXT" -n medical-asr get pods -o wide

Confirm 2/2 ready replicas for both components, with each pair on different nodes. A successful Helm command alone does not establish full redundancy.

06

Validate a transcription

Keep the service private. Forward the API port locally, then run the checks from a second terminal.

TERMINAL / BASH
kubectl --context "$KUBE_CONTEXT" -n medical-asr   port-forward service/medical-asr-api 19300:3000
TERMINAL / BASH
curl --fail http://127.0.0.1:19300/health/ready

Send a real audio stream

Use the non-patient recording provided by Voxist. Send raw PCM signed 16-bit little-endian, mono, 16 kHz as binary WebSocket frames. Do not send a WAV header. The sample_rate parameter does not resample audio.

TERMINAL / BASH
ws://127.0.0.1:19300/ws?lang=fr-medical&sample_rate=16000
  1. Open the socket and wait for the connection to be established.
  2. Stream audio in small binary chunks, paced to real time.
  3. After the last audio frame, send the text message Done.
  4. Wait for final results before closing. Compare the transcript with the expected reference.
Readiness validates service availability; it does not validate transcription quality. Complete the audio acceptance test before connecting real users. Ask Voxist for the client test kit matching your release.
07

Operate & update

Monitoring

Connect local health and metrics endpoints to your existing monitoring stack, including Grafana. Keep these endpoints private. No outbound anonymous telemetry collector is included in this deployment; agree any such integration separately with Voxist.

Upgrade in a quiet window

Obtain a newly qualified chart and image pair. Save the current values and revision, stop accepting new streams and allow active sessions to finish before running the installation command with the new kit.

Replicas protect availability when a node fails, but an active WebSocket on that node can be interrupted. Rolling updates can also interrupt connections on a replaced pod. This is not a zero-interruption guarantee. Clients should handle reconnects and application-level retries.

Return to a previous release

TERMINAL / BASH
helm history medical-asr --kube-context "$KUBE_CONTEXT" -n medical-asr
# Replace PREVIOUS_REVISION with the last validated revision.
helm rollback medical-asr PREVIOUS_REVISION   --kube-context "$KUBE_CONTEXT" -n medical-asr --wait --timeout 10m

A rollback requires a previous release and available images. Recheck replica placement, readiness and an audio transcription after every upgrade or rollback.

08

Troubleshooting

SymptomCheck first
ImagePullBackOffRegistry Secret, expiry, approved image digest and node HTTPS access.
PendingTwo eligible nodes, free resources, taints and placement constraints.
Licence / readiness failureSecret key name, supplier entitlement, DNS and HTTPS egress.
503Engine readiness and connectivity from the API.
Missing or incorrect textPCM format, sample rate, absence of WAV header and Done after audio.

For support, provide chart/image versions, timestamps with timezone, replica status and redacted errors. Never send licence keys, registry credentials or patient audio in routine support messages.

Contact Voxist