Poetry reading video from your own recording, captions and music

Turn a 60-second poem recording into a captioned vertical video: six image or clip slots, a ducked music bed, script-aligned captions. About $0.43 plus visuals.

5 min readSume
All posts

A poet can turn a 60-second reading into a captioned vertical video on Sume for $0.425 plus the visuals: the recording is the Timeline audio spine, six 10-second slots carry images or clips, a music bed sits 12 dB under the voice, and the captions are aligned to your poem text. With three AI clips and three stills as visuals, the total is about $2.30 before the image jobs.

Your own voice is kept as recorded; Sume does not re-synthesize it. That matters for a reading, where the pauses are part of the poem.

What does a poetry reading video cost?

Timeline renders cost $0.10 per output minute rounded up, a caption job $0.20 for a video up to 60 seconds, and a music generation $0.125 (Sume docs, read 2026-10-12). Visuals are your choice: stills are image jobs, priced by model and quality in GET /v1/catalog, and clips on wan-3.0 at 480p are $0.0625 per second (catalog, read 2026-10-12).

60-second reading, six 10-second slots. Sume rates, read 2026-10-12.
ItemArithmeticCost
Timeline renderceil(60 s / 60) = 1 minute x $0.10$0.10
Music bed1 audio$0.125
Script-aligned captions1 job$0.20
3 clips, wan-3.0 480p, 10 s each3 x 10 x $0.0625$1.875
3 stillsimage jobs, see GET /v1/catalogvaries
Total without stills0.10 + 0.125 + 0.20 + 1.875$2.30

How do I assemble the reading?

Import the recording first (POST /v1/media-imports), because Timeline only reads media.sume.com URLs. Then render with the reading as audio.url and soundtrack for the bed. Setting soundtrack.duck_db makes the bed dip under the voice, and it needs a real spine, which your recording is. Stills are static holds (motion is ignored with a warning), so use clips where you want movement. Transitions are limited to 1 second.

import asyncio, os, httpx

async def main():
    body = {
        "audio": {"url": "https://media.sume.com/artifacts/YOUR_READING.mp3",
                  "duration_seconds": 60},
        "video": [{"source_url": f"https://media.sume.com/artifacts/YOUR_SLOT_{i}.mp4",
                   "start": i * 10, "duration": 10,
                   **({"transition": {"type": "dissolve", "duration": 0.5}} if i else {})}
                  for i in range(6)],
        "soundtrack": {"url": "https://media.sume.com/artifacts/YOUR_BED.mp3",
                       "gain_db": -18, "duck_db": 12, "fade_out_seconds": 3},
    }
    headers = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}",
               "Idempotency-Key": "poem-reading-001"}
    async with httpx.AsyncClient(timeout=60) as c:
        r = await c.post("https://api.sume.com/v1/timeline-1.0/render", json=body, headers=headers)
        print(r.status_code, r.json())

asyncio.run(main())

How do I caption it so the poem is spelled right?

Send the Timeline MP4 to POST /v1/video-captions with script_text set to the poem. Sume keeps speech-to-text word timings and aligns your text to them, so line breaks, names and invented words come out as written. If the alignment fails you get script_alignment_mismatch or script_alignment_failed, and the suggested next step is to simplify the script text or omit it. The default style is slam for Latin text; punch and tiktok-green are the other Latin options, and design.colors can change the tint on the spoken word for a quieter look.

When is this the wrong approach?

Poems are rhythm first, and a busy video can fight the voice.

  • If the reading is over 60 seconds, the caption job is no longer covered by the $0.20 fixed estimate; check the live price first.
  • If you only need a page with a transcript, skip the video and use POST /v1/video-inspect with transcribe, which is cheaper.
  • Do not generate clips of a real person to stand in for the poet.
  • Music from the router is generated; if the poem is about a specific song, you need rights to that song, not a lookalike.

Sources

Related posts

More in Use cases

All Use cases posts

Written by Sume