Long-to-Short Highlights
Turn one long piece of content (podcast / roundtable / talk show / interview / livestream replay) into multiple distinct-topic highlight clips in one shot, at a human rough-cut level:
- Semantic selection: understands the content and extracts the topics worth their own clip — how many clips and how long each is are decided entirely by the content, never forced into fixed durations;
- Jump cut (on by default): a second-pass compression inside each topic that keeps only the "spine" of substance, dropping repetition, back-and-forth confirmation, digressions, filler and stutters — squeezing rambling speech into a tight, information-dense clip;
- Word-level precise cuts: every cut lands on a word boundary and snaps to the video frame, driven by word-level timestamps.
Positioned as a rough cut: it outputs editing decisions and project files you import into an editor to fine-tune; it can also render a rough cut directly.
Mix and match outputs (outputs): project files (each clip's .xml for Premiere by default; in project_formats you can also pick JianYing / CapCut / FCPX / OTIO / Tonghe .gtrk), selection report, and rendered rough cut (mp4).
Among these, .gtrk is the Tonghe unified editing contract (gtrk v1): add gtrk to project_formats and each clip produces it as one of the project files in that clip's files[] (alongside xml / JianYing / etc.). It can be imported into the Tonghe client for further refinement, or fed back as-is to Project File Export to convert to other NLE projects, or to Timeline Render for cloud rendering — the same edit structure throughout, with no re-parsing.
Create Task
Basics
| Item | Value |
|---|---|
| Method | POST |
| Path | /task/video_long2short |
| 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 (obtain via File Upload) |
language | string | Yes | — | Content language (see supported list); a value outside the list returns an unsupported-language error |
output_language | string | No | follows language | Output language for metadata (title / summary / score reason); same enum as language |
stt | object | No | — | Pre-transcribed result (must include both word-level word_tc_list and sentence-level sentence_tc_list, see the stt object table below); skips internal ASR. Human scripts are not accepted |
main_topic | string | No | — | Main topic, used as a soft hint for selection |
output_size | string | No | 9:16 | Output canvas: 9:16 / 16:9 / 1:1, or custom like 1080x1920. Input may be landscape or portrait and is auto-fitted to the target canvas |
jump_cut | boolean | No | true | Jump cut (intra-topic semantic compression). Off = each clip is a continuous rough cut with no redundancy removal |
duration | object | No | {} | Duration control (see below). Purely semantic, no forced duration — only a safety cap and a soft hint |
split_screen | object | No | {enable:false} | Optional vertical split-screen (see below): only multi-person on-screen segments are composed into multi-panel splits |
outputs | array | No | ["project","report"] | Output selection, any combination of report / project / video. project = produce project files per clip per project_formats (only Premiere's .xml by default); report = selection report; video = render per clip. Which project formats are produced (including gtrk) is decided by project_formats, not specified in outputs |
source_path | string | ⚠️ Conditional | — | The long video's local full path in your editing environment (e.g. D:\clips\video.mp4), written verbatim into project-file material references. Required when outputs includes project (the default outputs already includes project, so usually required); length ≤ 1024 |
project_formats | array | No | ["xml"] | Effective when outputs includes project; specifies which project formats to produce (multiple allowed): xml (Premiere Pro) / fcpxml (Final Cut Pro) / otio (OpenTimelineIO) / jianying (JianYing) / capcut (CapCut) / gtrk (Tonghe .gtrk, openable directly in the client). Only xml is produced by default; list gtrk or other formats explicitly to get them |
struct_meta | object | No | {} | Same as Project File Export: contains nle_draft_dir (your local draft folder; the legacy name capcut_draft_path is still accepted as an alias). Without it, JianYing / CapCut draft meta files (*_meta) cannot be produced |
duration object
| Field | Type | Default | Description |
|---|---|---|---|
pref | string | auto | Duration preference hint: auto / short / medium / long; biases selection only, never forces re-cutting |
max_clip_sec | number | 600 | Per-clip safety cap (seconds, 5 ~ 1800); prevents over-long clips only, does not limit clip count |
split_screen object
| Field | Type | Default | Description |
|---|---|---|---|
enable | boolean | false | Enable vertical split-screen |
prefer_mode | string | auto | Layout preference: auto / single (centered) / multi (multi-panel) |
orientation | string | auto | Panel orientation: auto (randomized top-bottom/left-right across clips for variety) / lr (force left-right) / tb (force top-bottom) |
stt object
⚠️
word_tc_list(word-level) andsentence_tc_list(sentence-level) are both required — neither may be omitted: the algorithm groups words into sentences bysentence_tc_list, so word-level only → 0 sentences → empty selection (silently returns nothing). All timestamps are in seconds (float).
| Field | Type | Required | Description |
|---|---|---|---|
word_tc_list | array | Yes | Word-level timestamps; element {text: char, start_time: seconds, end_time: seconds} |
sentence_tc_list | array | Yes | Sentence-level timestamps; element {text: sentence, start_time: seconds, end_time: seconds, speaker: speaker (optional)} |
{
"stt": {
"word_tc_list": [
{"text": "投", "start_time": 12.30, "end_time": 12.46},
{"text": "资", "start_time": 12.46, "end_time": 12.62}
],
"sentence_tc_list": [
{"text": "投资人卧底进喜茶,蹲了三个月。", "start_time": 12.30, "end_time": 15.80, "speaker": "嘉宾A"},
{"text": "结果发现真正赚钱的根本不是奶茶。", "start_time": 15.80, "end_time": 18.42, "speaker": "嘉宾A"}
]
}
}
Supported languages: Chinese zh-CN, Simplified zh-CHS, Traditional zh-CHT, English en-US, Japanese ja-JP, Korean ko-KR, French fr-FR, Spanish es-ES, Portuguese pt-PT, Russian ru-RU, Vietnamese vi-VN.
Request Example
curl -X POST https://api.ai-mcn.tv:10000/task/video_long2short \
-H "Authorization: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"file_id": "81005495682916358",
"language": "zh-CN",
"output_size": "9:16",
"jump_cut": true,
"outputs": ["project", "report"],
"source_path": "D:\\clips\\video.mp4",
"project_formats": ["xml", "jianying", "gtrk"],
"struct_meta": {"nle_draft_dir": "C:\\Users\\Me\\AppData\\Local\\JianyingPro\\User Data\\Projects\\com.lveditor.draft\\20260611"},
"duration": {"pref": "auto"}
}'
Success Response
{
"code": 200,
"msg": "success",
"data": {
"task_id": "537489015178400",
"task_type": "video_long2short",
"status": "queued"
}
}
Query Task Result
Basics
| Item | Value |
|---|---|
| Method | GET |
| Path | /task/video_long2short/{task_id} |
| Auth | Authorization header (raw API Key) |
Response (output_result)
| Field | Type | Description |
|---|---|---|
clips | array | Highlight clips; each has publishing metadata + that clip's output files files[] (see below) |
report | object | Selection report (unit count / clip count / jump_cut / split-material manifest, etc.) |
errors | object | Local failure reasons for optional outputs (non-empty on partial success) |
clips[] element
| Field | Type | Description |
|---|---|---|
title / summary / tags | string / string / array | Title, summary, tags (ready to publish) |
score / score_reason | number / string | Spread-potential score (0~10) and reason |
highlight_words | array | Highlight words with word-level timing {text, begin_time, end_time} |
genres / moods / themes | array | Soundtrack genre / mood / theme keywords |
segment_count / total_duration_ms | integer / integer | Sub-segment count after jump cut, and total clip duration (ms) |
text | string | Retained text of the clip |
files | array | The clip's output files. When outputs includes project, project files are produced per project_formats (only ["xml"] by default), each with type=project and filename=clip{idx}_* (e.g. clip0_premiere.xml / clip0_project.gtrk; multi-segment concatenation after jump cut, target canvas = output_size); when it includes video, the render (type=video). Elements have type / format / file_id / download_url / filename |
report structure
| Field | Type | Description |
|---|---|---|
unit_count | integer | Sentence units after word-stream re-segmentation |
selected_count / clip_count | integer | Topics selected / clips actually produced |
jump_cut | boolean | Whether jump cut was enabled |
jumpcut_used | integer | Number of clips actually compressed |
degraded | boolean | true if semantic analysis was temporarily unavailable and degraded (task still completes) |
split_manifest | array | (when split_screen=on) split-material manifest: {file_id, expected local path, covered clip} |
Success Response Example
{
"code": 200,
"msg": "success",
"data": {
"task_id": "537489015178400",
"status": "completed",
"progress": 100,
"output_result": {
"clips": [
{
"title": "Investor went undercover at Heytea for 3 months — the real money isn't the milk tea",
"summary": "A frontline-research take on Heytea's real profit structure.",
"tags": ["Business", "Tea drinks", "Research"],
"score": 8.6,
"score_reason": "Suspenseful open + counterintuitive conclusion; high completion and share potential",
"highlight_words": [{"text": "根本不是奶茶", "begin_time": 15.8, "end_time": 18.42}],
"segment_count": 6,
"total_duration_ms": 61800,
"text": "投资人卧底进喜茶,蹲了三个月……",
"files": [
{"type": "project", "format": "xml", "file_id": "537489015178411", "download_url": "/download/c0/537489015178411.xml", "filename": "clip0_premiere.xml"},
{"type": "project", "format": "jianying_draft", "file_id": "537489015178412", "download_url": "/download/c1/537489015178412.json", "filename": "clip0_draft_content.json"},
{"type": "project", "format": "gtrk", "file_id": "537489015178413", "download_url": "/download/c2/537489015178413.gtrk", "filename": "clip0_project.gtrk"}
]
}
],
"report": {
"unit_count": 412,
"selected_count": 9,
"clip_count": 9,
"jump_cut": true,
"jumpcut_used": 7,
"degraded": false
},
"errors": {}
},
"create_time": "2026-06-11T08:00:00Z",
"update_time": "2026-06-11T08:06:42Z"
}
}
Error Codes
| Code | HTTP | Description | Resolution |
|---|---|---|---|
6013 | 400 | file_id / language missing | Add required params |
6004 | 404 | File not found | Check file_id |
6014 | 400 | File type mismatch (video required) | Upload a video file |
6016 | 400 | Invalid business params (outputs / output_size / duration out of range, project without source_path, stt missing word-level word_tc_list or sentence-level sentence_tc_list, etc.) | Fix per response detail |
6017 | 400 | Unsupported language | Use a value from the supported list |
6502 | 401 | Auth failed | Check Authorization header |
6201 | 402 | Quota insufficient | Buy a quota package or top up |
6202 | 402 | Balance insufficient | Top up in the dashboard |
Limitations
- Rough-cut positioning: outputs editing decisions / project files / rough renders, meant to be fine-tuned in an editor; jump cut is a hard-cut for density, and its brisk seams match short-video clip aesthetics.
- Semantic, not duration-locked: clip count and length are decided by content;
durationprovides only a soft hint and a per-clip safety cap, with no forced re-cutting. - Word-level precision: internal ASR provides word-level timestamps, cuts land on word boundaries and snap to frames; a provided
sttmust include both word-levelword_tc_listand sentence-levelsentence_tc_list, otherwise sentences cannot be formed and the selection is empty. - Billed by input duration: by input video minutes, independent of clip count.
- Core output guarantee: the task fails (auto-refund) only if the selection (
clips) +reportcannot be produced; project files and renders are derivative — single failures go toerrorswithout failing the task. - Project material references: in the single-track project file, non-split segments reference the
source_pathoriginal; ensure that path is valid in your editing environment. To get fully openable JianYing / CapCut drafts (with meta files), also providestruct_meta.nle_draft_dir.project_formatsonly produces Premiere's.xmlby default; list other formats (including.gtrk) explicitly. - Split-screen (
split_screen.enable=true): only multi-person on-screen segments are composed into vertical multi-panel splits and pre-rendered as split materials; outputs open up progressively as the capability matures.