Lip sync audio longer than the video: which duration to send

On Sume video-to-video lipsync, duration is the output's length: the shorter of clip and audio. Kling Lipsync is the exception and takes the clip's.

4 min readSume
All posts

When the audio is longer than the clip, send the clip's length as duration; when the audio is shorter, send the audio's. On a Sume video lipsync row, duration is the length of the output, and the output stops at the shorter of clip and audio. Kling Lipsync is the one exception: its duration is the source clip's length, whatever the audio does.

Whole seconds only, and the number sets the price, so a wrong guess changes the bill.

Worked cases

Take the rule from the Sume repo docs for the lipsync rows added 2026-10-13: the field is required, it is a whole number, and for a video row it is the output's length.

Which duration to send on a video lipsync row (rule from Sume repo docs, read 2026-10-13)
ClipAudioModelSend duration
12 s20 ssync-lipsync-312
20 s8 ssync-lipsync-38
20 s8 skling-lipsync (clip 2-10 s only)the clip's length, 8 if the clip is 8 s
30 s30 sveed-lipsync30
1 s10 sany video rowrefused: minimum is 2

Why the field is required

Sume reserves the cost before the job runs, and the price of every lipsync row is a function of seconds. A default would charge the wrong amount, so the request fails instead of guessing. The range check also runs before any provider call: a value below 2, above the row's maximum, or not a whole number is refused with the row's limits in the message.

Most rows reach 60 s, so the check rarely bites. It does on InfiniteTalk Video (2-9 s), Kling Lipsync (2-10 s) and PixVerse Lipsync (2-30 s).

A mismatch is the most common reason a lipsync job is refused or costs more than expected, and it is cheap to prevent. Do the measurement in the same script that uploads the files, and log the number you sent next to the job id, so a bill that looks off can be traced to a length rather than guessed at. Credits for a job reserve at the length you send, so a value that is too large cannot be a harmless safety margin.

A pre-flight check

Measure both files before you send. If you do not know the audio's length, read it from the file; do not estimate. This small helper returns the value to put in the field:

def lipsync_duration(clip_s: float, audio_s: float, kling: bool = False) -> int:
    seconds = clip_s if kling else min(clip_s, audio_s)
    whole = int(seconds)  # whole seconds only
    if whole < 2:
        raise ValueError("a lipsync clip must be at least 2 s")
    return whole

print(lipsync_duration(12.4, 20.0))
print(lipsync_duration(20.0, 8.9))

Trim or pad instead of cutting off

If you want every word of a long audio track lip-synced, the clip has to be as long as the audio. Extend the footage first, or split the audio into pieces that each fit one clip and run one job per piece. If you only want the opening seconds, the cut-off behavior does the trimming for you.

Which rows exist, and their limits, is in the eight video rows. The step and floor rules for two of them are in Kling and LatentSync billing.

Sources

Related posts

More in Media tools

All Media tools posts

Written by Sume