How to make a photo talk with AI: voice, then lip sync
Make a photo talk in two steps: turn your text into speech, then lip sync the photo to that audio. On Sume: TTS 1.0, then VEED Fabric 1.0.

To make a photo talk, turn the words into speech first, then run a lip sync model that moves the face in the photo to match that audio. On Sume that is two API jobs: TTS 1.0 speaks your text in a ready voice, and VEED Fabric 1.0 turns the photo plus that speech into a talking clip of up to 300 seconds.
Facts come from Sume's Models overview and the TTS and Fabric request schemas in the Sume API reference, read on 2026-09-27. Anything described as current behavior is read from Sume's code, and prices from the code behind API pricing. If your audio is already on Sume, the lip sync API guide covers that half alone.
Can AI make a photo talk from text alone?
Yes. On Sume it takes two jobs, not one: Sume's models guide builds every on-camera speaking shot from a still plus TTS on Fabric, and it says video models do not lip-sync to generated TTS or to a later voice-over. An image-to-video clip with narration laid underneath will not move the lips to the words; the lip sync job does that.
Where does the voice come from?
TTS 1.0 speaks in a voice your workspace already has, from one of two places:
- A ready avatar's voice. Send the avatar's
avatar_idoravatar_handle; it works once that avatar'svoice.statusisreadyinGET /v1/avatar-1.0/avatars. Creating an avatar costs $0.95 per avatar. - A voice from the Sume app. Today, in Assets → Voices, you upload or record audio to clone a voice, or describe a person and Sume generates one. Copy ID gives its id,
voi_plus 32 hex characters, which you send asvoice.id. The voice itself is made in the app; the API takes its id. AI voiceover in your own voice covers cloning.
How do I turn the text into speech?
Send the words as transcript, up to 20,000 characters, to POST /v1/tts-1.0/generate, and set language for any text that is not English; omitted, it defaults to English, with Korean or Japanese inferred from a Hangul- or kana-only transcript as a fallback.
Ask for word timestamps too: in the current code, the result then reports the audio's duration_seconds next to its audio_url, a file on the Sume media host, and the lip sync step needs both. The default output is MP3 at 44,100 Hz and 128 kbps.
curl -X POST https://api.sume.com/v1/tts-1.0/generate \
-H "Authorization: Bearer $SUME_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: talking-photo-tts-001" \
-d '{
"transcript": "Hello and welcome to the spring open house. Doors open at ten.",
"avatar_handle": "product_host",
"language": "en",
"timestamps": { "words": true }
}'How do I lip sync the photo to the speech?
Send POST /v1/veed/fabric-1.0 with the photo as image_url (a public HTTPS still), the TTS file as audio_url, and the audio's measured length as duration_seconds, which also reserves the cost at submit. To use an avatar's face instead of a photo, send its avatar_handle in place of image_url.
Add an Idempotency-Key so a retry returns the original job instead of starting a second one, then poll the job and read the talking clip from the Sume-hosted artifacts in the result. The lip sync API guide covers the other fields, such as resolution.
curl -X POST https://api.sume.com/v1/veed/fabric-1.0 \
-H "Authorization: Bearer $SUME_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: talking-photo-001" \
-d '{
"image_url": "https://example.com/portrait.jpg",
"audio_url": "https://media.sume.com/artifacts/example/open-house.mp3",
"duration_seconds": 4.6,
"resolution": "720p"
}'How long can the clip be, and what does it cost?
Each step bills on its own, plus a 5.5% agent fee by default. Fabric counts audio seconds rounded up, so a 30-second talking clip at 720p comes to $5.625 before the fee. TTS counts every character, spaces and punctuation included.
| Step | Limit | Price |
|---|---|---|
| Speech: TTS 1.0 | Up to 20,000 characters. Audio longer than 1,200 seconds fails with tts_duration_exceeded. | $0.0475 per 1,000 characters |
| Talking clip: VEED Fabric 1.0 | 1–300 seconds of audio, in a file of at most 10 MB. | $0.1875 per audio second (720p); the 480p rate is on API pricing |
What stops a photo from talking?
These requests are refused:
- Audio hosted anywhere else. In the current code, an
audio_urloff the Sume media host is refused with400 unsupported_audio_source. A TTS result qualifies; a recording on your own server does not, and signed upload URLs are not part of the public API. - A file over 10 MB. The current code refuses it with
400 audio_too_large, and the suggested next action is to shorten the segment or use MP3. - Speech longer than 300 seconds. Split it and lip sync each part as its own clip.
- Both a photo and an avatar, or neither. Fabric takes exactly one visual source.
Sources
Related posts
More in Sume Avatar 1.0
- Real estate agent AI video: one avatar for every listing
Real estate agents can make AI videos without filming: create an avatar from a photo once, then script each video with a listing photo as the scene.
- Script for an AI avatar: how many words fit in 60 seconds
An AI avatar script is the words the avatar speaks. Sume's estimator today counts 2.8 words per second, so 60 seconds holds roughly 165 words.
- Talking head video background music: a bed under the voice
Keep background music well under the voice. A Sume avatar video preview can carry a soundtrack at volume 0.05 to 0.4; Timeline adds fades and ducking.
- Talking head video format: aspect ratio, size, and file
A talking head video's format follows where it plays: vertical, 16:9, square, or 4:5. Sume avatar videos come in five ratios as MP4 at 720p.
Written by Sume