By the end of this page you will have uploaded a video, had it dubbed into Spanish with voices cloned from its own speakers, and downloaded an MP4 that carries both the Spanish dub and the original audio.

Get access

VOD Express comes with every SyncWords Live account: if your organization uses Live, it can use VOD Express too, with the same API key pair (a public key and a secret). Without one, ask your SyncWords contact, or support@syncwords.com, for an account.

You need

  • The key pair, and about 15 minutes: processing a file takes 4 to 10 minutes even for a short clip, most of it spent preparing the processing for the file.
  • A short video with speech. Use ours, a 35-second English dialogue (1 MB): sample-en.mp4; or any MP4 of a minute or two.
  • One of:
    • curl and jq
    • Python 3.9+ with requests (pip install requests)
    • Node.js 20+
Each step’s snippet builds on the ones before it: run the curl snippets in one shell, and put the Python or Node.js snippets one after another in one file (quickstart.py, or quickstart.mjs for its top-level await). The base URL is read from SW_VOD_API when set, and is that of Environments otherwise.
1

Get a token

Exchange the key pair for a bearer token, and set up a small helper for the calls that follow:
A token lasts 30 minutes. When a call answers 401, get a new one the same way. More on tokens.
2

Check your access

enabled: false means VOD Express is not available to the account, for instance because its access was revoked or its trial ended: every other call then answers 403, and its message says why. Ask support.
3

Create a project

A project holds the processing instructions. This one reads the files put into its input folder (S3FolderSource), transcribes English, translates into Spanish with Gemini, dubs with Deepdub cloning each speaker’s voice (voice: auto), and writes an MP4 per input into its output folder (S3FolderOutput), with the input’s own audio as the first track and the Spanish dub as the second:
${name} and ${ext} in nameTemplate are the API’s placeholders, filled per input file, so the Node.js snippet keeps them in single quotes rather than a template literal.The project starts right away ("status": "running") and waits for files. If the config has a mistake, the answer is a 422 listing every problem by its place in the config. See Errors.
4

Upload a video

Ask the API for an upload URL, then PUT the file to it. The bytes go straight to storage, and the file is in the project as soon as the PUT completes:
Storage answers 200 with an empty body. The URL works for a file of up to 5 GB; a larger file, or an upload you want to resume after an interruption, goes in parts.
Moving many files, or files from a pipeline? Use the AWS CLI with the role the API vends for your account: aws s3 sync ./season-1 s3://…/input/season-1/. See Upload with the AWS CLI.
5

Wait for it

A file goes from pending to processing to done (or failed). This is the 4 to 10 minutes of waiting, and most of it reads pending: processing is only the last step. To wait in a loop:
A token lasts 30 minutes, so a long wait may need a new one: the loop in Monitoring renews it on 401.
6

Download the dub

The link is a presigned S3 URL, valid for an hour. Open episode.es.mp4 in any player: it opens on the original audio, and the player’s audio menu switches to the Spanish dub.

What happened

  • The project launched a processing service when you created it. It picked up episode.mp4 from the project’s input folder, transcribed it, translated each sentence, cloned each speaker’s voice for the Spanish lines, and mixed the new voices over the original background (the voices of the original are removed, because originalAudioSplitting is on by default).
  • The service stops itself 30 minutes after it has nothing left to do, and starts again on its own within a minute of your next upload (startOnNewFiles, on by default). See Auto-stop.
  • Every further file you upload is processed with the same configuration.

Next steps

More languages, more outputs

Several dubs in one video, per-language files, subtitles beside them.

Pick voices

A safe first voice for each provider, and how to try one before a season.

Automate it

A complete Python or Node.js client: token renewal, a folder of files, every output.

Upload a whole season

The AWS CLI, subfolders, and collecting every output.