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.
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 |
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 |
Supported languages: zh-CN, zh-CHS, zh-CHT, en-US, ja-JP, ko-KR, fr-FR, es-ES, pt-PT, ru-RU, vi-VN.
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;
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, 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.