# Build the image
make build
# Start all services
docker compose up -d
# Check status
docker compose ps
| Service | Port | Description |
|---|---|---|
| nginx | 80, 443 | Reverse proxy with rate limiting |
| gradio | 7860 | Web UI |
| api | 8000 | REST API |
| label-studio | 8080 | Annotation tool (dev profile) |
Copy .env.example to .env and configure:
cp .env.example .env
Required:
HF_TOKEN — HuggingFace access token for model downloadsOptional:
ARMTTS_API_KEY — Enable API authenticationCUDA_VISIBLE_DEVICES — GPU selectionWANDB_API_KEY — Experiment trackingDocker Compose is configured with NVIDIA GPU support. Ensure you have:
# Verify GPU access
docker run --rm --gpus all nvidia/cuda:12.4.0-base-ubuntu22.04 nvidia-smi
Place your certificates in docker/ssl/:
docker/ssl/
├── cert.pem
└── key.pem
The nginx configuration will automatically use them.
# Set your API key
export RUNPOD_API_KEY=your-key
# Deploy
make deploy-runpod
# or
bash scripts/deployment/deploy_runpod.sh
# Configure in .env
AWS_REGION=us-east-1
AWS_INSTANCE_TYPE=g5.xlarge
AWS_KEY_NAME=armtts-key
# Deploy
bash scripts/deployment/deploy_cloud.sh aws
# Configure in .env
GCP_ZONE=us-central1-a
GCP_MACHINE_TYPE=n1-standard-8
GCP_GPU_TYPE=nvidia-tesla-t4
# Deploy
bash scripts/deployment/deploy_cloud.sh gcp
python scripts/deployment/cost_estimate.py
Estimates per-minute dubbing costs across 6 cloud providers.
# System deps (Ubuntu)
sudo apt-get install -y ffmpeg libsndfile1 rubberband-cli
# Python environment
bash scripts/setup_environment.sh
# Verify
python scripts/verify_setup.py
# Gradio UI
make web
# FastAPI
make api
# Both with nginx (requires nginx installed)
# Configure docker/nginx.conf for your setup
The API exposes metrics at /metrics:
armtts_requests_total — Total API requestsarmtts_dub_duration_seconds — Dubbing job durationarmtts_active_jobs — Currently processing jobsarmtts_gpu_memory_used_bytes — GPU memory usage# API health
curl http://localhost:8000/api/v1/health
# Gradio health
curl http://localhost:7860/
Docker Compose includes health checks with 30s intervals.