# Audio post-production worker

Source: https://docs.quake.ai/resources/iac-templates/audio-worker
Markdown: https://docs.quake.ai/resources/iac-templates/audio-worker.md

---

# Audio post-production worker

This pattern composes Compute, Network, and Object Storage.



Quake AI does not provide managed audio processing or webhooks. This template provisions a customer-owned VM that polls Object Storage with a shell loop and runs FFmpeg on CPU. No GPU is used.



## What this template deploys

- Private network and router for egress-only worker access
- Two Object Storage buckets (input and output)
- One Compute worker instance with cloud-init that installs FFmpeg, the AWS CLI, and a polling worker service
- Optional whisper.cpp transcription when `enable_transcription` is true
- **0 floating IPs** by default (worker reaches buckets over outbound HTTPS)

Upload raw audio to the input bucket. The worker writes loudness-normalized MP3 files to the output bucket and optionally POSTs to `webhook_url`.

## Prerequisites

- OpenTofu or Terraform >= 1.6.0
- OpenStack application credentials (`source openrc.sh`)
- EC2-compatible Object Storage credentials (`openstack ec2 credentials create`). See [S3 storage ACL template](/resources/iac-templates/s3-storage-acl) for the bootstrap shape.

## Parameters

| Parameter | Description | Default |
| --- | --- | --- |
| `key_name` | SSH keypair name (must already exist in your project) | required |
| `s3_access_key` / `s3_secret_key` | EC2-compat Object Storage credentials passed to the worker | required |
| `input_bucket_name` | Bucket for raw uploads | required |
| `output_bucket_name` | Bucket for mastered output | required |
| `worker_flavor` | CPU flavor for FFmpeg | `c2a.large` |
| `webhook_url` | HTTPS callback after each job (empty disables) | `""` |
| `enable_transcription` | Upload SRT sidecars via whisper | `false` |
| `poll_interval_seconds` | Seconds between bucket polls | `60` |
| `target_lufs` | Integrated loudness target | `-14` |
| `image_name` | Boot image name | `Ubuntu-24.04` |
| `external_network` | Shared external network for router gateway | `PublicStatic` |
| `private_cidr` | Private subnet CIDR for the worker | `192.168.70.0/24` |
| `instance_name` | Worker instance display name | `audio-worker` |
| `s3_endpoint` | Quake AI S3-compatible endpoint URL | `https://object.us-east-1.rumble.cloud` |
| `s3_region` | S3 region identifier for the AWS provider | `us-east-1` |

## Cost and sizing

Size `worker_flavor` for concurrent FFmpeg jobs you expect. The template uses CPU-only processing (no GPU). Object Storage charges follow your plan allowance for stored and transferred bytes.

## When to use this pattern

Batch-normalize podcast or voiceover files uploaded to Object Storage without standing up a separate media SaaS. For general cloud-init background, see [cloud-init and first-boot configuration](/docs/compute/concepts/cloud-init).

## Estimated cost

<PricingCompanion
  components={[
    { kind: "template", slug: "audio-worker", required: true },
  ]}
/>

## Template source

<TemplateSource slug="audio-worker" />

<TemplateResourceMap template="audio-worker" format="opentofu" />

## See also

- [Deploy the audio worker template](/resources/deployments/deploy-audio-worker-template)
- [S3 storage ACL template](/resources/iac-templates/s3-storage-acl)
- [Object Storage overview](/docs/object)
