Whisper ASR Webservice — a self-hosted speech-to-text API powered by OpenAI's Whisper. Transcribe or translate audio to text over a simple HTTP endpoint, entirely on your own hardware. Deployed as a host-networked Nomad service with a persistent model-cache volume.
Needs nomad-pack on PATH. The script only adds the nomploy registry and runs this pack.
Source ↗ Project ↗ ★ 3.3k ⚑ Report an issue
Save as values.hcl, edit, then run:
# The name of the Nomad job.
job_name = "whisper-asr"
# The Nomad namespace to deploy into.
namespace = "default"
# The datacenters to deploy to.
datacenters = ["*"]
# The Whisper ASR Webservice image. Pin a tag in production.
image = "onerahmet/openai-whisper-asr-webservice:latest"
# Host port for the ASR HTTP API. The container listens on 9000.
port = 9000
# Whisper model size (ASR_MODEL): tiny, base, small, medium, large-v3. Bigger = more accurate but slower and heavier.
asr_model = "base"
# Inference engine (ASR_ENGINE): openai_whisper, faster_whisper, or whisperx.
asr_engine = "faster_whisper"
# Named volume for the downloaded model cache (/root/.cache). Avoids re-downloading on restart.
cache_volume = "whisper_cache"
# Placement constraints. Pin to the node holding the volume. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true".
constraints = []
# Resources for the Whisper task. Speech-to-text is CPU/RAM heavy; larger models need much more.
resources = {
cpu = 2000
memory = 2048
}
| Name | Type | Default | Description |
|---|---|---|---|
| job_name | string | "whisper-asr" | The name of the Nomad job. |
| namespace | string | "default" | The Nomad namespace to deploy into. |
| datacenters | list | ["*"] | The datacenters to deploy to. |
| image | string | "onerahmet/openai-whisper-asr-webservice:latest" | The Whisper ASR Webservice image. Pin a tag in production. |
| port | number | 9000 | Host port for the ASR HTTP API. The container listens on 9000. |
| asr_model | string | "base" | Whisper model size (ASR_MODEL): tiny, base, small, medium, large-v3. Bigger = more accurate but slower and heavier. |
| asr_engine | string | "faster_whisper" | Inference engine (ASR_ENGINE): openai_whisper, faster_whisper, or whisperx. |
| cache_volume | string | "whisper_cache" | Named volume for the downloaded model cache (/root/.cache). Avoids re-downloading on restart. |
| constraints | list | [] | Placement constraints. Pin to the node holding the volume. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true". |
| resources | object | {
cpu = 2000
memory = 2048
} | Resources for the Whisper task. Speech-to-text is CPU/RAM heavy; larger models need much more. |
No variables match.
This pack stores data in one Docker named volume:
whisper_cache
restic
# Run on the node hosting this pack. Point restic at your repo first: # export RESTIC_REPOSITORY="s3:https://<account>.r2.cloudflarestorage.com/<bucket>" # export RESTIC_PASSWORD="<repo-password>" # export AWS_ACCESS_KEY_ID=<key> AWS_SECRET_ACCESS_KEY=<secret> restic backup \ /var/lib/docker/volumes/whisper_cache/_data
rclone (sync to S3/R2)
rclone sync /var/lib/docker/volumes/whisper_cache/_data backup:<bucket>/whisper_cache
Paths assume the default Docker volume location (/var/lib/docker/volumes). Restore by stopping the job, restoring files into the same volume, and re-running the pack.
Whisper ASR Webservice — a self-hosted speech-to-text API powered by OpenAI's Whisper. Transcribe or translate audio to text over a simple HTTP endpoint, running entirely on your own hardware (great for subtitles, voice notes, and pipelines that shouldn't leave your network).
Single host-networked Nomad service with a persistent model-cache volume.
nomad-pack registry add nomploy https://github.com/Nomploy/nomad-packs
nomad-pack run whisper-asr --registry=nomploy
| Variable | Default | Description |
|---|---|---|
port |
9000 |
HTTP API port. The container listens on 9000. |
asr_model |
base |
Whisper model (ASR_MODEL): tiny/base/small/medium/large-v3. Bigger = more accurate, slower, heavier. |
asr_engine |
faster_whisper |
Engine (ASR_ENGINE): openai_whisper, faster_whisper, whisperx. |
cache_volume |
whisper_cache |
/root/.cache — downloaded model cache. |
image |
onerahmet/openai-whisper-asr-webservice:latest |
Container image. Pin a tag in production. |
resources |
{ cpu = 2000, memory = 2048 } |
Task resources. Larger models need much more. |
Transcribe with curl -F "audio_file=@sample.mp3" "http://<node-ip>:9000/asr?output=txt"; interactive docs
at /docs. First boot downloads the model (needs internet). For real-time speed on big models use a
GPU image/runtime. The API is unauthenticated — keep it internal or front it with a proxy. Pin the job to
the node holding the volume with constraints.