---
title: "Dub a Vietnamese audio file with a new voice"
method: POST
path: "/api/v1/dub"
tags: ["Public API v1"]
---

# Dub a Vietnamese audio file with a new voice

`POST /api/v1/dub`

Transcribes the uploaded Vietnamese audio (Whisper STT), then re-synthesizes it with the chosen preset voice. Tokens are billed by the OUTPUT audio duration (same rate as the app, × the engine multiplier), charged only on success. Max file size: 10 MB.

## Response `201`

The re-voiced audio plus the transcript it was built from.

- PublicDubResponseDto
  - `success` boolean, required
  - `transcript` string, required — Vietnamese text transcribed from the uploaded audio.
  - `voiceUsed` string, required — Voice the audio was re-synthesized with.
  - `audioUrl` string, required — Presigned S3 download URL for the dubbed WAV.
  - `audioUrlExpiresIn` number, required — Seconds until audioUrl expires.
  - `duration` number, required — Duration of the dubbed audio (seconds).
  - `tokenCost` number, required — Tokens deducted (computed from the transcript).

## Other responses

- `400` — No audio sent, unsupported audio type, or an unknown voice.
- `401` — API key missing, malformed, or revoked.
- `403` — Your plan does not include dubbing or this engine, or the grant is out of tokens / expired.
- `413` — Audio file larger than 10 MB.
- `429` — Rate limit or token quota exceeded. When the limit came from the application the response carries `Retry-After` (seconds) and the `X-RateLimit-*` headers and is counted against your API key; a 429 with none of those headers came from the edge proxy and is counted against your source address, shared with every other key calling from it. Back off on either.

---

[API](https://skmtc.dev/vieneu/apis/vieneu-api.md) · [All operations](https://skmtc.dev/vieneu/apis/vieneu-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/vieneu/vieneu-api/revisions/11c8166a6c4d/schema)
