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

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

Request Body

FieldTypeRequiredDefaultDescription
file_idstringYesLong video file ID (obtain via File Upload)
languagestringYesContent language (see supported list); a value outside the list returns an unsupported-language error
output_languagestringNofollows languageOutput language for metadata (title / summary / score reason); same enum as language
sttobjectNoPre-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_topicstringNoMain topic, used as a soft hint for selection
output_sizestringNo9:16Output 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_cutbooleanNotrueJump cut (intra-topic semantic compression). Off = each clip is a continuous rough cut with no redundancy removal
durationobjectNo{}Duration control (see below). Purely semantic, no forced duration — only a safety cap and a soft hint
split_screenobjectNo{enable:false}Optional vertical split-screen (see below): only multi-person on-screen segments are composed into multi-panel splits
outputsarrayNo["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_pathstring⚠️ ConditionalThe 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_formatsarrayNo["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_metaobjectNo{}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

FieldTypeDefaultDescription
prefstringautoDuration preference hint: auto / short / medium / long; biases selection only, never forces re-cutting
max_clip_secnumber600Per-clip safety cap (seconds, 5 ~ 1800); prevents over-long clips only, does not limit clip count

split_screen object

FieldTypeDefaultDescription
enablebooleanfalseEnable vertical split-screen
prefer_modestringautoLayout preference: auto / single (centered) / multi (multi-panel)
orientationstringautoPanel 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) and sentence_tc_list (sentence-level) are both required — neither may be omitted: the algorithm groups words into sentences by sentence_tc_list, so word-level only → 0 sentences → empty selection (silently returns nothing). All timestamps are in seconds (float).

FieldTypeRequiredDescription
word_tc_listarrayYesWord-level timestamps; element {text: char, start_time: seconds, end_time: seconds}
sentence_tc_listarrayYesSentence-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

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

Response (output_result)

FieldTypeDescription
clipsarrayHighlight clips; each has publishing metadata + that clip's output files files[] (see below)
reportobjectSelection report (unit count / clip count / jump_cut / split-material manifest, etc.)
errorsobjectLocal failure reasons for optional outputs (non-empty on partial success)

clips[] element

FieldTypeDescription
title / summary / tagsstring / string / arrayTitle, summary, tags (ready to publish)
score / score_reasonnumber / stringSpread-potential score (0~10) and reason
highlight_wordsarrayHighlight words with word-level timing {text, begin_time, end_time}
genres / moods / themesarraySoundtrack genre / mood / theme keywords
segment_count / total_duration_msinteger / integerSub-segment count after jump cut, and total clip duration (ms)
textstringRetained text of the clip
filesarrayThe 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

FieldTypeDescription
unit_countintegerSentence units after word-stream re-segmentation
selected_count / clip_countintegerTopics selected / clips actually produced
jump_cutbooleanWhether jump cut was enabled
jumpcut_usedintegerNumber of clips actually compressed
degradedbooleantrue if semantic analysis was temporarily unavailable and degraded (task still completes)
split_manifestarray(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

CodeHTTPDescriptionResolution
6013400file_id / language missingAdd required params
6004404File not foundCheck file_id
6014400File type mismatch (video required)Upload a video file
6016400Invalid 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
6017400Unsupported languageUse a value from the supported list
6502401Auth failedCheck Authorization header
6201402Quota insufficientBuy a quota package or top up
6202402Balance insufficientTop 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; duration provides 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 stt must include both word-level word_tc_list and sentence-level sentence_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) + report cannot be produced; project files and renders are derivative — single failures go to errors without failing the task.
  • Project material references: in the single-track project file, non-split segments reference the source_path original; ensure that path is valid in your editing environment. To get fully openable JianYing / CapCut drafts (with meta files), also provide struct_meta.nle_draft_dir. project_formats only produces Premiere's .xml by 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.