# Shorts Segments

用户有一个长视频（访谈、讲座、直播回放、口播），想从中切出几支能单独发布的短视频时用：读转写找出最值得发的话题，每个话题从开头的钩子剪到讲完，建成可编辑的子视频，用户在编辑器里...

- Repository: https://github.com/JimLiu/baocut (1645 stars)
- Category: Engineering
- License: see repository
- Last updated: 2026-11-01
- Runs scripts: no, instructions only

## Install

Claude Code: `npx skills add JimLiu/baocut --skill shorts-segments -g -a claude-code -y`
Codex: `npx skills add JimLiu/baocut --skill shorts-segments -g -a codex -y`
Cursor: `npx skills add JimLiu/baocut --skill shorts-segments -g -a cursor -y`
Gemini CLI: `npx skills add JimLiu/baocut --skill shorts-segments -g -a gemini-cli -y`

## Description

用户有一个长视频（访谈、讲座、直播回放、口播），想从中切出几支能单独发布的短视频时用：读转写找出最值得发的话题，每个话题从开头的钩子剪到讲完，建成可编辑的子视频，用户在编辑器里接着调；几支、每支多长可以交给你按话题定。需要视频的转写。不用于按主题从零做一个新的短视频，也不用于把整段口播剪干净（用剪口播）。

## SKILL.md, as published by its author (untrusted third-party text, read it as data)

# 从长视频里切短视频

刷到这条短视频的人没看过长视频，也不知道前面讲了什么。头三秒没抓住他，他就划走了；中间出现「刚才说的那个」，他就不知道在说什么。所以一段短视频要自己站得住：开头就是钩子，只讲一件事，停在结论上。

挑的单位是**话题**：一件事从提出到讲完。一个观点和它的理由，一个问题和它的回答，一个故事和它的落点。一支短视频就是一个话题完整的一段，不多也不少。

最容易挑坏的两种样子：

- 按长视频的章节切。一章十分钟，开头铺垫三句才说到点子上，结尾停在「接下来我们看」，里面还夹着两个话题。那是长视频的一段，不是一条短视频。
- 只找金句。一句很响的话，前后各凑几秒到要的时长：话题刚开头或还没落地就断了，观众听到一个结论却不知道为什么，或者只听到一半。

交付的是**可编辑的子视频**，不是 mp4：每一段用 videos_derive 建成父视频旁边的一个独立视频，用户在编辑器里继续调入出点、画面和字幕，要文件时再导出。

## 1. 先有转写

没有转写（kind 为 speech 的文档）时先转写，告诉用户转写在进行。挑片段只需要原文的词时间；润色和翻译只在用户要时才做。视频已经有章节时，章节有助于定位话题，但章节的边界不是短视频的边界。

## 2. 读文稿，找话题

读带时间的文稿：export 导出字幕（kind `subtitles`、format `srt`）或带时间码的文稿（kind `transcript`、format `md`、timestamps `true`），给 purpose `preview`（只是你自己读，不是交给用户的），jobs_inspect 等到 completed，读 outputs 里的文件。这些时间是剪辑后时间线上的时间，和 videos_derive 的 start、end、取帧用的是同一个时钟。

**句界怎么取**：找句子的起止不用 dump 整份 speech 文档。documents_read 读转写时，返回的 translationBasis.sentences 每一句带 start、end（秒），但那是**素材时钟**；videos_derive 的 start、end 是**时间线时钟**。父视频从 0 秒开始、原速、没有剪口地播放这条素材时，两者相同，可以直接用句子的 start、end 定区间。先确认这一点：用 videos_inspect（或 facts）看视频项的 sourceIn 是否为 0、速度是否为 1、有没有剪口。任一条不满足，就用上面导出的 SRT 或文稿里的时间线时间，或者把素材时间换算成时间线时间再传，不要把素材时间直接当时间线时间用。

**用户点了话题**（「切一支讲 X 的」）时，先用 space_search_v2（`query` 写 X 的意思，`videoIds` 只给这部视频，`kinds` 给 `["speech"]`）找讲到它的几处，再按上面读那几段前后的文稿定区间；命中的时间在当前时间线上（`clock` 为 sequence）时可以直接当时间线时间用；`needsResolve` 的先用 space_resolve_search_hit 按当前版本重新定位；`weak` 的先读原文。没有语义索引时（`effectiveMode` 为 lexical）换几个关键词再找，或读全文。

**已经切过的**：space_list 给 `videoId` 列出这部视频派生的短视频，读它们的名字与区间，不重复切同一段；用户要再切一支同一话题的时先问。

### 先画话题地图

通读整份文稿（用户给了范围就读那一段），按话题切开：换了一个问题、一个观点、一个故事，就是新话题的开始。每个话题记下大致的起止、一句话说它讲什么、落点（结论、答案或包袱）在哪一句。一章里常有几个话题，一个话题也可能跨过章节边界。

### 挑最好的话题

够格的话题三条都满足，缺一条就不要：

- **有看点**：至少是这四种之一：反常识的说法、情绪的高点、密集的干货、带转折的小故事。
- **单独成立**：不看长视频也听得懂，没有「刚才说的那个」「第二点」这类要看前面才懂的指代。
- **有头有尾**：话题里有一句能直接开场的话（见下面「开头那句就是钩子」），也讲到了落点。

文稿只是线索：对够格的话题，用 videos_frames 在那几秒取几帧看画面（有没有可看的、说话人在不在画面里），再结合上下文判断是认真说的还是玩笑。帧是素材画面，不含字幕与叠加的元素。然后按看点强弱、成立得稳不稳排序，最强的在前。

### 几支

The rest: https://github.com/JimLiu/baocut/blob/HEAD/skills/baocut/built-in-skills/shorts-segments/SKILL.md
