Long-to-Short Highlights (Pro / Auto-Finished)

Turn one long piece of content (podcast / roundtable / talk show / interview / livestream replay) into multiple ready-to-publish highlight clips in one shot — no editor required. It shares the "semantic selection + jump-cut + word-level cut points" core with the rough cut and adds finishing-grade polish:

  • Blurred-background canvas fit: landscape or portrait input; on aspect conversion the frame is padded with a blurred background (premium look, no black bars);
  • Restrained camera moves: slow push-in / pull-out on selected segments (sub-pixel smooth, random yet reproducible, frequency-capped) — lively but never distracting;
  • Global speed-up: optionally speed up the whole clip while preserving pitch (no chipmunk voice);
  • Smart subtitles: auto-generated and burned in (punctuation stripped, split into screen-width short lines), optional bilingual translation; can remove source burned-in subtitles first;
  • Optional split-screen: two-people-on-screen segments composed into a vertical multi-panel (speaker on top / facing each other, white border).

Positioned as the Pro / volume path: it outputs only rendered mp4 clips (one per highlight), no timeline / project files — use the rough cut if you need to keep editing in an NLE.

Examples

Three real long videos shown as input / output pairs: the long source in the first column, the highlights from the same run to its right. The two rows per group are separate runs with 9:16 and 16:9; since how many clips and how long each is are decided entirely by the content, the split may differ slightly between runs.

Example 1 — Livestream Replay (Portrait Source)

Source: 720×1280 portrait, 3 h 25 min in full. 9:16 is the source's native aspect; 16:9 is padded left and right with a blurred background — no black bars.

Input sourceHighlight 1Highlight 2Highlight 3

3 h 25 min in full

9:16 · 41 s

9:16 · 2 m 29 s

9:16 · 1 m 31 s
(same source)
16:9 · 41 s

16:9 · 2 m 29 s

16:9 · 1 m 31 s

Example 2 — Two-Person Interview (Landscape Source)

Source: 1280×720 landscape, 26 min in full. 16:9 is the source's native aspect; 9:16 is padded top and bottom with a blurred background, and two-people-on-screen segments are automatically composed into a split screen (white border).

Input sourceHighlight 1Highlight 2Highlight 3

26 min in full

9:16 · 45 s

9:16 · 36 s

9:16 · 10 s
(same source)
16:9 · 45 s

16:9 · 31 s

16:9 · 21 s

Example 3 — Two-Person Conversation (Landscape Source, shot in 4K)

Source: 1920×1080 landscape, 15 min 36 s in full. 16:9 is the source's native aspect; 9:16 is padded top and bottom with a blurred background. This group also lets you compare the split_screen toggle directly: the split screen in the 9:16 row comes with landscape-to-portrait adaptation and needs no flag, while in the 16:9 row Highlights 1 and 2 ran with split_screen enabled and Highlight 3 without it.

Input sourceHighlight 1Highlight 2Highlight 3

15 min 36 s in full

9:16 · 3 m 13 s

9:16 · 1 m 52 s

9:16 · 1 m 21 s
(same source)
16:9 · 4 m 31 s (split screen)

16:9 · 1 m 52 s (split screen)

16:9 · 1 m 4 s (no split screen)

The examples above are 720p WebM previews; the actual deliverables are full-resolution mp4 files.

Create Task

Basics

ItemValue
MethodPOST
Path/task/video_long2short_pro
Content-Typeapplication/json
AuthAuthorization header (raw API Key)
Billingby input video duration (minutes)

Request Body

FieldTypeRequiredDefaultDescription
file_idstringYes—Long video file ID (from File Upload)
languagestringYes—Content language, see list below; out-of-list returns unsupported-language error
output_languagestringNofollows languageOutput language for title / summary metadata
sttobjectNo—Pre-transcription; see the “stt object” in Long Video to Shorts (must include both word-level word_tc_list and sentence-level sentence_tc_list; missing either yields no sentences → empty selection); skips internal recognition. Manual scripts not accepted; mutually exclusive with subtitle_file_id
subtitle_file_idstringNo—ID of an uploaded monolingual subtitle file (.srt / .ass) used as the transcription source, skipping internal ASR; mutually exclusive with stt. Cut precision becomes subtitle-line boundaries (still frame-snapped), and the burned subtitles reuse the subtitle lines as sentence text; multi-layer / bilingual .ass is rejected at execution time (task fails with refund)
main_topicstringNo—Main topic hint for selection
output_sizestringNo9:16Canvas: 9:16 / 16:9 / 1:1 or custom like 1080x1920. Any input orientation, fitted with a blurred background
jump_cutbooleanNotrueJump-cut (intra-topic semantic compression)
durationobjectNo{}pref (auto/short/medium/long hint), max_clip_sec (per-clip cap sec, 5–1800). Semantic, no hard duration
split_screenobjectNo{enable:false}enable, orientation (auto / lr / tb). Only two-people segments are composed
camera_moveobjectNo{enable:true}Camera moves (see below)
speedobjectNo{factor:1.0}Global speed: factor (0.5–2.0), pitch-preserving
seamobjectNo{crossfade_ms:30}crossfade_ms (0–500) audio crossfade to smooth hard cuts
subtitleobjectNo{enable:true}Subtitles (see below)

camera_move object

FieldTypeDefaultDescription
enablebooleantrueEnable camera moves
probabilitynumber0.35Per-segment trigger probability (0–1)
amplitudenumber0.08Push/pull amount (0–0.5)
max_rationumber0.5Cap on the share of segments with moves (0–1)
blur_sigmanumber40Background blur strength (0–100)

subtitle object

FieldTypeDefaultDescription
enablebooleantrueBurn in subtitles
translate_languagestring—Translation language (same list); yields bilingual (source + translation)
purify_sourcebooleanfalseRemove source burned-in subtitles first (avoid ghosting); keep off for raw footage
strip_punctuationbooleantruePunctuation policy for burned subtitles. true (default) strips with the unified policy: Chinese/English commas and periods become spaces, in-word decimals / thousands separators are exempt, and other marks like ? ! are kept; false keeps all punctuation

Source language for recognition (language): Chinese zh-CN, Simplified zh-CHS, Traditional zh-CHT, English en-US, Japanese ja-JP, Korean ko-KR, French fr-FR — 7 in total.

es-ES (Spanish), pt-PT (Portuguese), ru-RU (Russian) and vi-VN (Vietnamese) cannot be used as the source language for this capability: its output depends on word-level timestamps, and these four codes yield no word-level timing on this capability's recognition engine (the first two have no engine at all). Passing one returns error code 6015 synchronously at submission — no charge, no queueing. es-ES / pt-PT can still be used as a subtitle translation target (see AI Subtitle and Subtitle Translation).

Metadata output language (output_language): still accepts the full set of the 11 codes above; it is not limited by recognition engine capability. This capability's tl (subtitle translation target) likewise accepts the full set of the 11 codes and is unaffected by the narrowing above.

Request Example

curl -X POST https://api.ai-mcn.tv:10000/task/video_long2short_pro \
  -H "Authorization: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "file_id": "81005495682916358",
    "language": "zh-CN",
    "output_size": "9:16",
    "camera_move": {"enable": true, "amplitude": 0.08},
    "speed": {"factor": 1.15},
    "subtitle": {"enable": true, "purify_source": true},
    "split_screen": {"enable": true}
  }'

Success Response

{
  "code": 200,
  "msg": "success",
  "data": {
    "task_id": "537489015178401",
    "task_type": "video_long2short_pro",
    "status": "queued"
  }
}

Query Task Result

Basics

ItemValue
MethodGET
Path/task/video_long2short_pro/{task_id}
AuthAuthorization header (raw API Key)

Response (output_result)

FieldTypeDescription
clipsarrayFinished highlights, each with publish metadata + the rendered file (below)
reportobjectSelection report (unit/clip counts, jump_cut, etc.) plus degradation status: degraded (bool — selection degraded or any polish step degraded; equivalent to errors being non-empty) and degraded_items (e.g. {"clip1": ["split_screen"]}, which clip degraded on which steps; {} when nothing degraded)
errorsobjectPer-polish (camera / speed / seam / split / subtitle) failures; core clip unaffected

clips[] element

FieldTypeDescription
title / summary / tagsstring / string / arrayTitle, summary, tags
score / score_reasonnumber / stringVirality score (0–10) and reason
highlight_wordsarrayHighlight words with word-level timing {text, begin_time, end_time}
genres / moods / themesarrayBGM style / mood / theme keywords
fileobjectThe rendered clip: {type:"video", format:"mp4", file_id, download_url, filename}

Error Codes

CodeHTTPMeaningFix
6013400file_id / language missingProvide required params
6004404File not foundCheck file_id
6014400File type mismatch (video required)Upload a video file
6016400Invalid params (camera_move/speed/seam/subtitle/output_size/duration out of range, or outputs/source_path passed)Fix per response
6017400Unsupported languageUse a supported language
6502401Auth failedCheck Authorization header
6201402Quota insufficientBuy a quota pack or top up
6202402Balance insufficientTop up in dashboard

Limits

  • Pro positioning: outputs only finished mp4; does not accept outputs / source_path (use the rough cut for project files).
  • Semantic, not duration-locked: clip count and length follow the content; duration is hint + per-clip cap only.
  • Restrained moves: push/pull triggered by probability with a frequency cap, limited amplitude, reproducible.
  • Pitch-preserving speed: global speed-up without pitch shift; factor 0.5–2.0.
  • Subtitles: punctuation stripped with the unified policy by default (commas/periods become spaces, marks like ? ! are kept; set subtitle.strip_punctuation:false to keep everything), split into short lines; enable subtitle.purify_source when the source has burned-in subtitles.
  • Billed by input duration: charged by input video minutes, regardless of clip count.
  • Core guarantee: the task fails only if selection / jump-cut fails (auto refund); camera / speed / seam / split / subtitle are degradable polish — single failures are recorded in errors without blocking output. Check report.degraded to know whether anything degraded and report.degraded_items for what — no need to parse errors yourself.