One video, many languages
A finished video can take on a new audio track. The shots, images and clips stay exactly as they are, and the new narration plays over them. One explainer made in English becomes the same explainer in Spanish for Mexico, in Arabic for the Gulf, in Japanese for Tokyo, without making the video again.
The same call corrects a narration too. Fix a word in the script, narrate it again, and give the video the new track.
Every track a video has had stays with it. Switch back to any of them at any time, for example to serve the English and the Spanish versions from one video.
Audio track changes are free. The new narration is charged when it is made, at the usual narration price, and the video’s shots are all reused.
Make the video in another language
- Narrate the script in the new language with the Narration API, in a voice of that language (
GET /v1/voices?language=es), or upload a recording of it as avoiceoverasset with the Assets API. - Once the narration is
completed, give it to the video withPATCH /v1/videos/{id}, then make it withPOST /v1/videos/{id}/generate:
curl -X PATCH "https://api.scenema.ai/v1/videos/proj_7c2e91a04b6d3f8" \ -H "Authorization: Bearer $SCENEMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{"audioId": "proj_9a1c4e7b2d6f053"}'
curl -X POST "https://api.scenema.ai/v1/videos/proj_7c2e91a04b6d3f8/generate" \ -H "Authorization: Bearer $SCENEMA_API_KEY"The PATCH records the new track in pending; generate answers with the video processing. It moves through the stages audio (the new track is matched to the shots) and export (the video is exported again), then reads completed with a new video.url and captions in the new language. When the video has a webhook, video.completed arrives again for the new track.
The video keeps its length. The new narration is matched to the shots it already has, so a narration that runs a little longer or shorter than the original is played a little faster or slower to fit. Narrations of about the same length as the original sound the most natural: keep the translation close to the original script. A narration that would have to play more than 15% faster or slower would not sound natural, so it is refused: the change fails, the video keeps its previous track, and error gives both lengths. Record a shorter or longer reading and try again.
A video’s original script never changes. A new track is the same narration in another language or voice: the script you send with it is kept as that language’s text, and the original stays as it was.
The video must have completed first. A video cut to music keeps its music: for other audio, make a new video.
A video made in two aspect ratios gets the new track in its current ratio. Send aspectRatio in the same request to have the other ratio with the new track too; see Change a video.
The tracks of a video
GET /v1/videos/{id}/audio-tracks lists every track the video has had, oldest first:
{ "items": [ { "id": "mf_1d2c8b7a6e5f403", "audioId": "proj_4559d9dd5dc8d53", "language": "en", "durationMs": 9800, "current": false, "createdAt": "2026-10-29T18:00:12.000Z" }, { "id": "mf_3b7d0a9c2e41f86", "audioId": "proj_9a1c4e7b2d6f053", "language": "es", "durationMs": 11250, "current": true, "createdAt": "2026-10-29T18:20:41.000Z" } ]}| Field | Meaning |
|---|---|
id |
The track’s id, to switch back to it. |
audioId |
The narration or asset the track was made from. |
language |
The track’s language. |
durationMs |
The length of the narration as recorded. The video keeps its own length. |
current |
true for the track the video plays. |
The video itself carries its current track in audioTrack.
Switch back to a track
curl -X PATCH "https://api.scenema.ai/v1/videos/proj_7c2e91a04b6d3f8" \ -H "Authorization: Bearer $SCENEMA_API_KEY" \ -H "Content-Type: application/json" \ -d '{"audioTrackId": "mf_1d2c8b7a6e5f403"}'
curl -X POST "https://api.scenema.ai/v1/videos/proj_7c2e91a04b6d3f8/generate" \ -H "Authorization: Bearer $SCENEMA_API_KEY"On generate, the video is exported again with that track, through the same audio and export stages, and video.completed arrives when it is ready. Each switch makes a new MP4, so download the file of each language to keep them all at once.
When a change cannot be made
| Status | Code | When |
|---|---|---|
| 409 | VIDEO_NOT_READY |
The video is still being made. Change its track once it has completed. |
| 409 | VIDEO_FAILED |
The video failed. Retry it, or make a new video. |
| 409 | VIDEO_BUSY |
The video is already changing. Try again once it has completed. |
| 409 | MUSIC_LOCKED |
The video is cut to its music, or the audio is a soundtrack asset. Make a new video for other audio. |
| 404 | AUDIO_TRACK_NOT_FOUND |
No track with that id on this video. |
A change that fails on the way (the new narration cannot be read, for example) leaves the video as it was: it plays its previous track, error on the video says why, and the webhook sends video.failed.