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 source | Highlight 1 | Highlight 2 | Highlight 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 source | Highlight 1 | Highlight 2 | Highlight 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 source | Highlight 1 | Highlight 2 | Highlight 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
| Item | Value |
|---|---|
| Method | POST |
| Path | /task/video_long2short_pro |
| Content-Type | application/json |
| Auth | Authorization header (raw API Key) |
| Billing | by input video duration (minutes) |
Request Body
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
file_id | string | Yes | — | Long video file ID (from File Upload) |
language | string | Yes | — | Content language, see list below; out-of-list returns unsupported-language error |
output_language | string | No | follows language | Output language for title / summary metadata |
stt | object | No | — | 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_id | string | No | — | 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_topic | string | No | — | Main topic hint for selection |
output_size | string | No | 9:16 | Canvas: 9:16 / 16:9 / 1:1 or custom like 1080x1920. Any input orientation, fitted with a blurred background |
jump_cut | boolean | No | true | Jump-cut (intra-topic semantic compression) |
duration | object | No | {} | pref (auto/short/medium/long hint), max_clip_sec (per-clip cap sec, 5–1800). Semantic, no hard duration |
split_screen | object | No | {enable:false} | enable, orientation (auto / lr / tb). Only two-people segments are composed |
camera_move | object | No | {enable:true} | Camera moves (see below) |
speed | object | No | {factor:1.0} | Global speed: factor (0.5–2.0), pitch-preserving |
seam | object | No | {crossfade_ms:30} | crossfade_ms (0–500) audio crossfade to smooth hard cuts |
subtitle | object | No | {enable:true} | Subtitles (see below) |
camera_move object
| Field | Type | Default | Description |
|---|---|---|---|
enable | boolean | true | Enable camera moves |
probability | number | 0.35 | Per-segment trigger probability (0–1) |
amplitude | number | 0.08 | Push/pull amount (0–0.5) |
max_ratio | number | 0.5 | Cap on the share of segments with moves (0–1) |
blur_sigma | number | 40 | Background blur strength (0–100) |
subtitle object
| Field | Type | Default | Description |
|---|---|---|---|
enable | boolean | true | Burn in subtitles |
translate_language | string | — | Translation language (same list); yields bilingual (source + translation) |
purify_source | boolean | false | Remove source burned-in subtitles first (avoid ghosting); keep off for raw footage |
strip_punctuation | boolean | true | Punctuation 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) andvi-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 code6015synchronously at submission — no charge, no queueing.es-ES/pt-PTcan 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
| Item | Value |
|---|---|
| Method | GET |
| Path | /task/video_long2short_pro/{task_id} |
| Auth | Authorization header (raw API Key) |
Response (output_result)
| Field | Type | Description |
|---|---|---|
clips | array | Finished highlights, each with publish metadata + the rendered file (below) |
report | object | Selection 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) |
errors | object | Per-polish (camera / speed / seam / split / subtitle) failures; core clip unaffected |
clips[] element
| Field | Type | Description |
|---|---|---|
title / summary / tags | string / string / array | Title, summary, tags |
score / score_reason | number / string | Virality score (0–10) and reason |
highlight_words | array | Highlight words with word-level timing {text, begin_time, end_time} |
genres / moods / themes | array | BGM style / mood / theme keywords |
file | object | The rendered clip: {type:"video", format:"mp4", file_id, download_url, filename} |
Error Codes
| Code | HTTP | Meaning | Fix |
|---|---|---|---|
6013 | 400 | file_id / language missing | Provide required params |
6004 | 404 | File not found | Check file_id |
6014 | 400 | File type mismatch (video required) | Upload a video file |
6016 | 400 | Invalid params (camera_move/speed/seam/subtitle/output_size/duration out of range, or outputs/source_path passed) | Fix per response |
6017 | 400 | Unsupported language | Use a supported language |
6502 | 401 | Auth failed | Check Authorization header |
6201 | 402 | Quota insufficient | Buy a quota pack or top up |
6202 | 402 | Balance insufficient | Top 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;
durationis 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;
factor0.5–2.0. - Subtitles: punctuation stripped with the unified policy by default (commas/periods become spaces, marks like
?!are kept; setsubtitle.strip_punctuation:falseto keep everything), split into short lines; enablesubtitle.purify_sourcewhen 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
errorswithout blocking output. Checkreport.degradedto know whether anything degraded andreport.degraded_itemsfor what — no need to parseerrorsyourself.