Automate faceless short-form videos: AI voiceover, captions, music
How to automate faceless short-form videos: script, AI voiceover, B-roll, music, a 9:16 render and captions by API or one agent call, with a dated tool table.

To automate faceless short-form videos, chain seven steps and run them from a schedule or a trigger: write a 30–60 second script, turn it into an AI voiceover with text to speech, generate vertical B-roll clips or stills, pick or generate a music bed, assemble everything into one 9:16 video with the music ducked under the voice, burn in captions timed to the voiceover, and deliver the file. You can wire separate tools together with a scheduler, or send the whole brief to one agent call. Keep each video under a minute if you caption it in one pass.
On the Sume API each step is a documented call under one key, or one call to Agent Completions or a Format runs the chain from a brief. The facts below come from the Sume API reference and Sume docs, read on 2026-09-29. Anything called current behavior is read from Sume's code.
What does the automated pipeline look like?
Each paid step is a separate asynchronous job, billed on its own at API pricing rates.
| Step | Call | What you get | Billing |
|---|---|---|---|
| 1. Script | Your code, or POST /v1/agent/completions with an output_schema | Script text | Your own tooling, or an agent run whose generation spend is capped by generation_spend_cap_usd |
| 2. Voiceover | POST /v1/tts-1.0/generate | Audio plus words[] timings | $0.0475 per 1,000 characters; spaces and punctuation count |
| 3. B-roll | POST /v1/videos | 9:16 clips on media.sume.com | Reserved at provider list × 1.25 on submit |
| 4. Music | GET /v1/bgm/catalog, POST /v1/bgm/pick, or POST /v1/music-router/generate | A track URL | Catalog routes are keyless; a generated track is $0.125 per audio |
| 5. Compose | POST /v1/timeline-1.0/plan, then POST /v1/timeline-1.0/render | One MP4, 1080×1920 by default | Plan is unbilled; render $0.10 per output minute, reserve ceil(audio.duration_seconds / 60) minutes |
| 6. Captions | POST /v1/video-captions | The MP4 with burned-in captions | A fixed amount per job for videos up to 60 s; confirm it in GET /v1/catalog |
| 7. Deliver | A webhook URL on each job, or polling job status | The final video_url | None |
Which tools can run a faceless video pipeline?
It depends on how much of the chain you want one vendor to cover. Model APIs bill each generation and leave the edit and the captions to other tools or your own code; a pipeline API covers the whole chain. Vendor prices below are copied with the unit each vendor's page states.
- Pick Runway if you want its own video models and speech in one credit account and will edit and caption elsewhere. Does Runway have an API? covers its API.
- Pick fal or Replicate if you already run your own assembly code and want to call individual models directly. fal and Replicate alternatives compares the shapes.
- Pick the Sume API if you want voiceover, clips, music, the vertical edit and captions under one key and one wallet.
- Pick a Sume Format or Agent Completions if you want one call per video and accept less control over each step.
- Pick a manual editor if you want to hand-tune each video.
| Option | Price unit | Steps covered | API shape | Limits to check |
|---|---|---|---|---|
| Sume API, step by step | TTS $0.0475 per 1,000 characters; music $0.125 per audio; render $0.10 per output minute; clips at provider list × 1.25; plus a 5.5% agent fee by default | Voiceover, clips, music, 9:16 edit, captions | One key; async jobs with webhooks or polling | Captions up to 60 s per job; edit inputs must be Sume-hosted |
| Sume Agent Completions or a Format | Generation spend up to your generation_spend_cap_usd; the agent's own LLM turn is billed outside that cap; plus a 5.5% agent fee by default | The agent composes the steps from a brief | One call per video | Less control over each step |
| Runway API | Credits at $0.01 per credit; gen4.5 at 12 credits per second; two of its speech models at 1 credit per 50 characters | Video, image and audio models (speech, sound effects) | Per-generation tasks billed in credits per project | Usage tiers set max concurrency, generations per day and spend per month |
| fal | Video models billed by output unit, per second or per video, depending on the model | One model per call | Pay-per-use model APIs | Some models may use GPU-based pricing instead |
| Replicate | Most models billed by run time on the hardware used; some by input and output, such as one image-to-video example at $0.09 / second of output video | One model per call | Public models, or private models on dedicated hardware | Most private models also bill setup and idle time |
Step 1: Where does the script come from?
From your own code or any text model: the chain only needs text. To have Sume write it, send an Agent Completion with an output_schema, and the run's output comes back in your shape, for example { "script": "…" }. Keep it short enough to caption in one job: step 6 stops at 60 seconds.
Step 2: How do I make the AI voiceover?
Send the script to TTS 1.0 as transcript, up to 20,000 characters, with a voice: the avatar_id or avatar_handle of an avatar whose voice is ready, or a voice.id. Cloning a voice or designing one from a description happens in the Sume app under Voices, not over the API; AI voiceover in your own voice covers it. Text to speech API covers every field; three matter here:
timestamps: { "words": true }addswords[]with start and end seconds to the completed result. In the current code each entry is{ word, start, end }, and the result also carriesduration_seconds, the value for the render'saudio.duration_seconds.language: set it for every non-English script.output_format: the default is mp3 at 44,100 Hz. The render inherits its spine's sample rate, and a spine under 32 kHz is reported asaudio_spine_low_fidelity.
Step 3: How do I make vertical B-roll?
Generate each shot with POST /v1/videos: a prompt, aspect_ratio: "9:16" for vertical, and a duration the model lists. sume/auto create controls default to 720p and 8 s, with 3–10 s clips at 16:9 or 9:16, so a 24-second voiceover takes three 8-second clips. A pinned model's limits are on GET /v1/videos/models. Poll each job's status until it is terminal, then read the clip's media.sume.com URL from GET /v1/jobs/{id}/result, because Timeline takes only Sume-hosted URLs. A Sume-hosted still in a slot is held as a static frame.
B-roll needs no lip sync: Sume's model docs say video models do not lip-sync to generated TTS. For a speaker on camera, use an Avatar 1.0 talking video or VEED Fabric 1.0 (a talking still plus audio) instead.
Step 4: How do I pick or generate the music bed?
The keyless BGM routes (GET /v1/bgm/catalog, or POST /v1/bgm/pick to score tracks against a mood) list ready tracks; Background music API for video covers them in full. Each track carries a license: sume-original for Sume's own tracks or cc-by-4.0 for the featured ones. In the current code only Sume's own tracks pass as soundtrack.url: the CC BY 4.0 tracks sit at their official URLs off Sume, so Timeline refuses them (unsupported_media_source).
To make a new bed per video, send a prompt to POST /v1/music-router/generate, with sume/music-auto or a pinned id from GET /v1/music-router/models. There is no duration field: steer the length in the prompt, and end with "Instrumental, no vocals." so it sits under a voiceover. Generated outputs are mirrored to Sume media URLs, so the track goes straight into the render.
Step 5: How do I assemble the vertical video?
One Timeline 1.0 render does the edit, and its default output is 1080×1920, so a vertical video needs no output block. audio.url is the voiceover and audio.duration_seconds its length (1–1800). video[] holds the clips: 1–200 slots, the first starting at 0. soundtrack adds the bed at gain_db (default −16 dB, a bed level under the voice), loop repeats it until the voiceover ends, and duck_db (0–20) dips it while the voiceover speaks. The output audio is the voiceover spine with the bed mixed under it; in the current code each clip's own audio is dropped. Check the document first with the unbilled POST /v1/timeline-1.0/plan.
curl -X POST https://api.sume.com/v1/timeline-1.0/render \
-H "Authorization: Bearer $SUME_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: faceless-render-001" \
-d '{
"audio": { "url": "https://media.sume.com/artifacts/artf_demo/narration.mp3", "duration_seconds": 24 },
"video": [
{ "source_url": "https://media.sume.com/artifacts/artf_demo/broll-1.mp4", "start": 0, "duration": 8 },
{ "source_url": "https://media.sume.com/artifacts/artf_demo/broll-2.mp4", "start": 8, "duration": 8,
"transition": { "type": "fade", "duration": 0.25 } },
{ "source_url": "https://media.sume.com/artifacts/artf_demo/broll-3.mp4", "start": 16, "duration": 8 }
],
"soundtrack": {
"url": "https://media.sume.com/assets/bgm/minimal-clean-focus.mp3",
"loop": true,
"duck_db": 8,
"fade_out_seconds": 2
}
}'Step 6: How do I caption it from the voiceover timings?
Send the render's video_url to POST /v1/video-captions with words: the TTS words[], each word renamed to text. Sume then skips speech-to-text and burns exactly those words at exactly those times. With the voiceover as the spine from its first second (audio.source_in defaults to 0), the TTS times line up with the render.
- Keep a video you caption to 60 seconds: each
wordstime runs from 0 to 60, and in the current code a longer source fails the caption job, as does a source with no audio stream. For longer videos, split first. wordstakes 1–1,200 entries, eachtextup to 200 characters, and is mutually exclusive withscript_text,cues, andsegments.- Omit
styleand Latin wording burns inslam, Korean wording inblack-outline. For the colour of the emphasised word,design.colors.activeoverrides it on most styles, butdesignis not supported onpunchortiktok-green. Customize burned-in caption styles lists the rest.
curl -X POST https://api.sume.com/v1/video-captions \
-H "Authorization: Bearer $SUME_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: faceless-captions-001" \
-d '{
"video_url": "https://media.sume.com/artifacts/artf_demo/faceless.mp4",
"words": [
{ "text": "Three", "start": 0.12, "end": 0.41 },
{ "text": "ways", "start": 0.41, "end": 0.7 }
]
}'Step 7: How do I deliver it and run it on a schedule or trigger?
Every paid step is an asynchronous job. Send webhook_url on the submit (POST /v1/videos documents it as callback_url) and Sume POSTs job.completed, job.failed, or job.canceled to your public HTTPS URL, signed with HMAC SHA-256; keep polling status_url as a backup. The caption job's result is the file to post, from your own code: see Automate YouTube Shorts with AI, YouTube Shorts video specs and TikTok video specs.
Because the calls live in your code, your scheduler runs them: a server cron job, a Cloudflare Workers cron, or a trigger such as a new spreadsheet row or a no-code scenario that sends each day's topic. A Sume schedule, authored in the dashboard with a 5-field cron expression in an IANA timezone, instead runs saved instructions as an Agent in a fresh thread; its per-run generation cap is $1.00 when unset. When an event, not a clock, should start a video, the Scheduled docs point to calling a Format from your backend instead.
Can one call make the whole faceless video?
Yes. Sume's basics page describes its agent composing the individual tools (Image, Video, Avatar, TTS, timeline) into a post-ready video with B-roll, voiceover, and timeline assembly. Send the brief (topic, 9:16, length, voiceover, captions, music) to Agent Completions, or save a recipe that works as a Format and call it with each day's topic as input. Video agent API: turn a brief into a finished, edited video covers what that call returns and where it stops.
Where does Sume not fit?
The docs and current code set these limits:
- Caption past 60 seconds in one job, or caption a video with no audio stream (current code).
- Take a file from your disk. Timeline takes only this workspace's
media.sume.comURLs, so every input must already be on Sume, such as an earlier Sume job's output. - Mix the featured CC BY tracks in a render; only Sume's own tracks and Sume-hosted outputs pass as
soundtrack.url. - Synthesize more than 1,200 seconds of audio in one TTS job: that fails with
tts_duration_exceededand captures no credit. - Post to a platform for you: publishing is your own code.
Sources
- Sume API reference
- API reference
- Models
- Video generation
- Video Router
- Timeline 1.0
- Video captions
- Media inputs
- Jobs and results
- Agent Completions
- Scheduled
- Sume basics
- Sume API pricing
- Music Router
- Runway API pricing (read 2026-09-29)
- Runway API models (read 2026-09-29)
- Runway API usage tiers (read 2026-09-29)
- fal pricing (read 2026-09-29)
- Replicate pricing (read 2026-09-29)
Related posts
More in Use cases
- Generate music for a video with AI, then fit it to the cut
To generate music for a video with AI, describe the cut in a music brief, send a still from it, ask for its length, then fit the track to the video.
- Hook variations for UGC ads: swap the hook, reuse the body
Make UGC ad hook variations by changing only the opening: one Timeline render per hook over the same body clips and voice, checked free first.
- How long should an ad be? Video ad lengths by platform
There is no single right length: each platform publishes its own. YouTube bumpers are 6 s, and Facebook plays in-stream ads of 15 s or less in full.
- How to make an AI avatar influencer: one face, one voice
An AI influencer is one reusable face and voice. Make a Sume avatar once, reuse its handle for videos and voiceovers, and its still for new photos.
Written by Sume