Skip to content
Catalog

cn8/audio-description

Make any video accessible in two stages built around a single principle: synthesized narration is

Learn more about Audio Description
Videoasync (job)Instant previewvideoaudioaccessibility
  1. 1Video
  2. 2Script
  3. 3Render

Make a video accessible

The AI writes the full dub + audio-description script as editable text first — nothing is voiced until you approve it.

Dialogue is dubbed into this language and on-screen action is described in it, written into the silences between speech.

0.3/s of video for the script · rendering later 0.5/s + text-to-speech at 4/spoken second. Totals appear once the duration is known.

Overview

Make any video accessible in two stages built around a single principle: synthesized narration is expensive and hard to un-hear, so you should be able to read and edit every line before paying to voice it. Stage 1 (script) is an async job that takes only a video URL — transcription and scene captioning run internally — and returns a time-coded script: the dialogue translated into the target language (dub lines) plus descriptions of on-screen action written into the silences between speech (ad lines), budgeted to fit their gaps per the Netflix AD Style Guide and WCAG. You review the lines, edit or disable any of them, then submit Stage 2 (render) which voices each enabled line (dub and description in distinct voices), time-fits the audio to its slot, ducks the original soundtrack and overlays every line at its exact timestamp, returning a presigned URL to the finished video. Both stages run as async jobs (poll /v2/jobs/{id} or attach a webhook) and are billed per second of video; speech synthesis is billed separately as core-tts usage on your own account.

Key capabilities

Script, then render

Stage 1 returns the full narration script as editable text. Nothing is synthesized — and no synthesis cost is incurred — until you approve the lines and call render.

Descriptions written to fit the gap

Each ad line is budgeted against the silence it fills (3.0 words/sec for English, 2.3 for Turkish). Lines that need more room are flagged extended_ad_suggested so the player can pause.

Word-accurate speech timing

Speech boundaries come from word-level timestamps, not raw segment spans — leading and trailing silence is reclaimed for description instead of being mistaken for dialogue.

Your voices, your account

Render voices dub and description lines in distinct voices (configurable gender per type) through core-tts on your own API key, then mixes them over the ducked original track. The render fee itself only covers mixing and orchestration.

When to use it

Accessibility compliance

Produce WCAG-conformant described versions of training, product and marketing videos without a manual narration workflow.

Localized accessible cuts

One pass yields both a translated dub and descriptions in the target language — an accessible localized version of the original.

Documentary and education catalogs

Batch-generate scripts for a library, have editors review the text, and render only the approved ones.

Broadcast-style AD tracks

Use the script's timing data (start_ms, target_duration_ms, extended_ad_suggested) to drive your own player-side AD implementation instead of rendering a burned-in mix.

Input & output

input

Script: a video URL (upload via upload-media or any public link) + target_language. Render: the same video URL plus the reviewed segments array from Stage 1, with optional per-line enabled flags and voice options.

JSON bodyvideo URL (mp4/webm/mov via upload-media media_type=video)

output

Script: segments in playback order — dub and ad lines with start_ms, end_ms, text, target_duration_ms, coverage stats. Render: presigned MP4 URL + render stats (lines rendered/failed, output duration).

JSON (script)S3 MP4 (presigned GET URL)

Specs

Latency
Script: roughly real-time × 0.5–1 for short videos (transcription + scene captioning + LLM writing run upstream). Render: ~10–60s per minute of video (parallel-free TTS per line + one ffmpeg mix). Both async — poll /v2/jobs/{id} or use a webhook.
Async
true
Rate Limit
100 req/s per API key — applied to job submission.
Max Input
2 GB per source video.

Schema

Request body

video_urlrequiredstring

Public URL of the source video. Transcription and scene captioning run upstream, so this is the only input needed.

target_languagerequiredstring

Language the dub and description lines are written in.

enum: en, tr

languagestring

Source language. Detected automatically when omitted.

optionsobject

speaker (bool) adds advisory speaker labels to dubbed lines; standards_profile selects the description style guide (default netflix).

expected_durationnumber

Video length in seconds. Only affects how many credits are held while the job runs — billing always uses the real duration. Without it a 60-second default is held, which can reject a long video on a thin balance.

Pricing

Both stages billed per second of video. The script stage is text-only and cheap; render covers mixing and orchestration, while each synthesized line is billed as regular core-tts usage on your account.

ServiceUnitPrice
Audio Description Scriptsecond$0.003/sec
Audio Description Rendersecond$0.005/sec + core-tts

Async jobs are billed only when they complete successfully.

A one-minute video: script ≈ 18 credits, render ≈ 30 credits + core-tts for the synthesized lines (4 credits per spoken second — typically 60–120 credits).

FAQ

Related models