快手基础大模型与应用部实习|电商挂店短视频智能剪辑与生成算法
在快手社区科学线-基础大模型与应用部实习期间,我负责了电商带货场景下挂店短视频的智能剪辑与生成算法。核心工作分为两大部分:一是从零搭建「鸡汤类挂店短视频」智能剪辑 pipeline 并推动上线;二是通过视频编辑大模型实现素材质量的提升与扩充。两段工作都直接服务于真实的电商内容生产链路。
图 0: 挂店短视频智能剪辑与生成 pipeline
1. 实习概览
| 项目 | 内容 |
|---|---|
| 公司 / 部门 | 快手 · 社区科学线-基础大模型与应用部 |
| 岗位 | 电商带货挂店短视频智能剪辑与生成算法 |
| 时间 | 2026 年 5 月 6 日 — 2026 年 6 月 |
| 核心职责 | 挂店短视频智能剪辑 pipeline 搭建与上线、视频素材质量提升与扩充 |
在电商带货场景中,「挂店短视频」是指商家在商品页挂载的、用于向用户展示商品卖点的短视频。这类视频需求量大、更新频率高,依赖人工剪辑成本极高,因此需要一套自动化、可规模化的智能剪辑与生成链路。实习期间,我围绕这条链路完成了两个方向的工作。
2. 项目一:鸡汤类挂店短视频智能剪辑 pipeline
2.1 背景与目标
平台已有的自动化 pipeline 主要覆盖「展示类」素材(直接展示商品外观的片段)。而「鸡汤类」短视频是一种高转化的内容形态:它以鸡汤文案配音为主线,配合商品画面混剪,情绪渲染强、完播率高,是商家非常看重的一类素材。我的目标是在展示类素材筛选链路的基础上,新增一条完整的鸡汤类短视频自动生成 pipeline,并推动上线。
2.2 pipeline 整体架构
整条 pipeline 由一个 shell 脚本驱动,切成「洗素材」和「做成片」两段:
【素材筛选段】
原始视频库
↓ 高宽比过滤
↓ 说话场景过滤
↓ 镜头检测与切分
↓ 时长 / 静止 / 字幕过滤
↓ VLM 理解打标
↓ 按理解过滤
↓ aHash 内容去重
▼
产出素材池:干净、多样、无重复
【成片生成段】
LLM 鸡汤脚本生成
↓ 修复循环校验
↓ TTS 配音
↓ BGM 卡点选曲
↓ 封面选择
↓ 人体检测
▼
混剪成片(卡点 + 字幕 + BGM + 封面)设计上有一条贯穿全程的三层 JSON 数据流(作者 → 商品 → 视频条目),每一步只在条目上追加字段向下传,不重写数据——这让整条链天然支持断点续跑,任何一步重跑时已完成的产物直接跳过。
2.3 素材筛选段:把原始视频库洗成可用素材池(step1 ~ step8.5)
step1 高宽比例过滤
ffprobe 批量读宽高和时长,只留竖屏(宽高比 0.45~0.65)且 <100 秒的视频——挂店位是竖屏,横屏直接淘汰。成本极低的粗筛,先把无效数据挡在昂贵的模型推理之外。
step2 说话场景过滤
鸡汤旁白由 TTS 统一配音,所以有人口播的素材不能用(两条音轨会打架)。Qwen3-8B 读商品标题和 ASR 文本,判定是「真人讲解」还是「无真人讲解」(ASR 只是歌词、关键词播报),只留后者。
step3 / step4 镜头检测与切分
TransNetV2 逐视频检测镜头边界,再按边界用 ffmpeg 切成独立分镜。规则只有一条核心:超过 5 秒的长镜头按 3.5 秒均分——挂店视频节奏快,单镜头不宜拖长。
step5 时长过滤
只留 ≥2 秒的片段,太短的碎片承载不了一句完整旁白。
step6 静止与字幕过滤
双检测淘汰两类废片段:静止画面(光流法判定,商品定格图观感差)和带硬字幕的片段(OCR 只扫下半屏,靠几何规则区分:字幕是横贯画面的长条,商品包装文字是居中的小方块;硬字幕会和 TTS 字幕重叠)。
step7 VLM 视频理解打标
这一步的处理对象不是整条视频,而是前面筛出来的每一个分镜片段:把片段视频连同该商品的标题一起喂给 Qwen3-VL-8B,让它按预设维度打结构化标签。结果是每个分镜存一个独立 json,文件名与片段一一对应(Scene_001.mp4 → Scene_001.json)。
一条典型的输出结果:
{
"思考过程": "画面中一名女性模特在白墙前转身展示一件米白色针织开衫……",
"素材相关度": "1",
"商品类目": "0",
"商品颜色": "米白色",
"商品季节": "0",
"场景类型": "0",
"场景描述": "室内纯色背景,专业摄影棚",
"模特展示描述": "模特正面站立,双手自然下垂,展示开衫整体版型",
"展示类型": "0",
"出镜人数": "1",
"人物性别": "0",
"人物出镜类型": "2",
"人物姿态": "1"
}12 个标签的完整定义(取值均为字符串):
| 标签 | 取值 | 含义 |
|---|---|---|
| 素材相关度 | -1 / 1 | 素材与商品是否一致(商品根本没出现也算 -1) |
| 商品类目 | 0 / 1 / 2 / 3 | 上衣 / 裤子 / 鞋子 / 其他 |
| 商品颜色 | 文本 | 如「米白色」「藏青色」 |
| 商品季节 | 0 / 1 / 2 | 春秋(薄长袖)/ 冬(羽绒服、大衣)/ 夏(短袖短裤) |
| 场景类型 | 0 / 1 | 室内 / 室外 |
| 场景描述 | 文本 | 简洁描述画面场景 |
| 模特展示描述 | 文本 | 模特在做什么、是细节展示还是上身效果 |
| 展示类型 | 0 | 模特专业上身展示:专门摆拍,动作都为展示服务,能看清上身效果 |
| 1 | 人物生活化展示:日常场景里使用商品(吃东西、做饭、闲聊等) | |
| 2 | 商品细节展示:镜头对准细节,突出功能性(保暖、做工) | |
| 3 | 直播场景展示:有人正对镜头讲解(能看到嘴在动) | |
| 4 | 纯商品展示:无人物出镜,多角度 / 特写展示商品本身 | |
| 5 | 其他:事件过渡、痛点展示、氛围烘托等 | |
| 出镜人数 | 0 / 1 / 2 | 无真人 / 单人 / 多人 |
| 人物性别 | -1 / 0 / 1 | 无人或多人 / 女 / 男 |
| 人物出镜类型 | -1 / 0 / 1 / 2 | 无人或多人 / 下半身 / 上半身 / 全身 |
| 人物姿态 | -1 / 0 / 1 | 无人或多人 / 坐姿 / 站姿 |
这一步是整条筛选链的**「信息富化」核心**——它把一段看不懂的像素翻译成 12 个可被规则消费的字段:step8 靠「展示类型」把素材分成专业池 / 生活池,step9 写脚本时则全靠这些标签来「认识」每条素材长什么样(颜色、季节、姿态、场景),才能排出观感连贯的镜头顺序。
step8 按理解结果过滤
拿到 step7 的标签后,这一步边过滤、边重组:逐分镜判定,把通过的分镜片段(连同它的 12 个标签、时长、路径)聚合回「商品 → 可用片段列表」的结构,供后面选素材。
过滤规则一览(每个分镜片段逐条判定,判据全部来自 step7 的标签):
| 判定维度 | 标签取值 | 结果 |
|---|---|---|
| 素材相关度(所有类目) | 1 商品对得上 | ✅ 继续下一条件 |
-1 商品没出现 / 货不对板 | ❌ 丢弃 | |
| 展示类型(上衣 / 裤子等) | 0 模特专业上身展示 | ✅ 进专业池 |
1 人物生活化展示 | ✅ 进生活池 | |
2 商品细节 / 3 直播讲解 / 4 纯商品 / 5 其他 | ❌ 丢弃 | |
| 展示类型(鞋子,规则放宽) | 0 专业上身 / 4 纯商品 | ✅ 进专业池 |
1 人物生活化展示 | ✅ 进生活池 | |
2 / 3 / 5 | ❌ 丢弃 | |
| 出镜人数(上衣 / 裤子等) | 1 单人 | ✅ 保留 |
0 无人 / 2 多人 | ❌ 丢弃 | |
| 人物出镜类型(上衣 / 裤子等) | 1 上半身 / 2 全身 | ✅ 保留 |
-1 无人或多人 / 0 只有下半身 | ❌ 丢弃 |
一个容易被忽略的点:上衣/裤子类的纯商品平铺展示(
4)其实是丢弃的——它没有人物,过不了「出镜人数 = 1」这一关;只有鞋子允许平铺展示,所以单独放行。
再二选一:每个作者在专业池和生活池之间二选一——专业池商品数 ≥3 或不少于生活池就用专业池,否则退到生活池。目的只有一个:让一支 15 秒成片风格统一,不会前几秒是棚拍模特、后几秒变成街边自拍。没被选中的那个池子整体丢弃。
最后作者级淘汰:选中池子的商品数不足 2 个,该作者直接不写进输出——凑不出一支多商品混剪。
输出结构也随之变了:从「原始视频 → 分镜」压平成 {作者: {商品: [{标签, 时长, 路径, 原始信息}...]}},每条都带着可直接消费的完整信息。
最后的 step8.5 aHash 内容去重是素材池的收官一步,也是整条 pipeline 的关键设计,单独放到 2.4 展开。
2.4 去重专项:三层去重体系(难点一)
问题:初版成品在人工评审里暴露出严重的「片段观感重复」——同一个镜头被切成多段、或同一段画面被翻拍二剪后再次入库,路径不同、MD5 不同,但画面是一样的。LLM 不知道「这两段看着像」,剪到一起就是同一段画面放两遍,观众迅速划走。
单一手段治不干净,我落地了一套三层递进的去重体系:
| 层 | 拦截时机 | 做法 |
|---|---|---|
| ① 素材库层 | LLM 选镜头之前 | aHash 内容去重,物理删除重复素材 |
| ② 生成层 | LLM 写脚本时 | prompt 注入「镜头唯一性」硬约束 |
| ③ 成片层 | 脚本产出后 | 校验 + LLM 补选的修复循环兜底 |
核心思想一句话:让 LLM 从一开始就看不到重复素材——第一层先把库洗干净,第二、三层压住漏网概率。
第一层:aHash 感知哈希内容去重(step8.5)
识别「路径不同、但画面在时间上重叠」的素材对,四步:
- 帧指纹:把每一帧压成 8×8 的灰度「重度马赛克」(64 格),每格与 64 格的平均亮度比大小——亮记 1、暗记 0,得到 64 位指纹。它描述的是画面「哪里亮、哪里暗」的布局,所以同一段画面重新编码后指纹不变,而不同画面几乎不会撞车;720p 和 1080p 也被这一步归一化成同样大小。黑帧、纯色帧直接剔除,否则两段转场黑场会「黑对黑」完美匹配;
- 帧匹配:两个指纹逐位对比,不同位数 ≤6 即算同一帧——这点容差用来吸收重编码噪声;
- 算重叠:两个指纹序列「对暗号」,找最长连续对齐的一段。「连续」是灵魂:它对应「同一段画面在两个视频里按同样顺序一帧接一帧地播」,零散几帧撞车凑不出长连续段,天然排除误判;
- 判重:连续重叠 ≥2 秒,或 ≥ 较短片段的一半(兜住「长素材包含短素材」的情况),即判为重复。
工程上再配三条原则:只在同作者同商品内部比对(不同商品同背景棚拍是正常的,不误杀);先来后到丢后者;宁放过不错杀(文件读不出来就保留)。每次丢弃都写入报告供人工抽查。
第二层:生成端镜头唯一性硬约束(step9)
库洗净后,还要防 LLM 自己把同一个镜头选两次。与其事后剔除(会让段落缺镜头),不如源头约束——我在 prompt 里写入硬规则:
同一个「商品ID + 子ID」不允许重复出现,每个镜头最多用一次。不存在任何后处理兜底——你输出什么就是什么。
并要求模型输出前自查一遍镜头清单,保证约束真正被执行。
第三层:成片层修复循环(step9.5)
LLM 的遵循不是 100%,最后还有一道确定性防线:脚本产出后,纯 Python 校验器全量检查(路径无重复、每段有镜头、总时长 15~25 秒、逐段素材够配音长度);发现重复就删掉一处,把空位连同剩余素材池发回 LLM 补选,再复检,最多 3 轮,仍不达标走兜底。所有拦截都收敛在 TTS 之前——不合格的脚本在配音前就被剔除,不浪费推理成本。
三层由粗到细,成片重复感问题在评审中被彻底解决。
2.5 成片生成段:从素材池到成片(step9 ~ step13)
step9 LLM 鸡汤脚本生成
用 Qwen3-14B 为每个作者生成一支 15~25 秒的脚本。输入是结构化的「商品-素材清单」(标题、颜色、展示类型、场景、时长等,来自 step7 的标签),再随机抽两条历史优秀文案做 few-shot。prompt 里除镜头唯一性外,还沉淀了一组业务编排规则:商品单向推进不折返、季节类目一致(混搭仅限秋冬、从薄到厚)、姿态背景连贯(室内外最多切换一次)、每秒文案不超过 4 个字、末段必须是引流 CTA。输出结构化 JSON:每段一条「旁白文案 + 搭配镜头」,外加一个 12 字以内的封面标题。
step9.5 脚本修复循环
见 2.4 第三层——全部校验通过后,脚本才被放行进入配音。
step10 IndexTTS 声音克隆配音
IndexTTS 零样本音色克隆,把每段旁白逐段合成独立 wav——逐段而非整篇是刻意的,混剪时才能逐段对齐画面时长。这一步之后,各段的精确时长才真正确定。
step10.5 BGM 时间戳匹配
脚本定稿、配音完成后,再跑一遍时间戳匹配算法复核选曲,必要时保留第二版选曲,具体做法见 2.6。
step11 / step12 封面选择与人体检测
每个素材段抽 5 帧,Qwen3-VL 逐帧判断「是否正面照、动作表情是否自然」,只有正面且自然的帧才有资格当封面;再用 YOLO11L 检测人物框——后面拼封面时按人物框裁剪,保证人物完整、构图协调。
step13 混剪成片
最后把所有原料组装成片:
- 封面:1~2 张用第一张,3 张做「1 大 + 2 小」拼接,≥4 张做 2×2 宫格;标题拆两行烧字;
- 逐段合成:素材拼接后对齐目标时长(经 2.6 的鼓点吸附确定)——够长就裁剪,不够就微变速(±10% 内人眼无感),音轨替换为 TTS 配音;
- 字幕:旁白拆两行,生成带展开动画的 ASS 字幕烧进画面;
- 合并 + BGM:各段统一分辨率拼接,选定 BGM 以 30% 音量混入;
- 封面帧:封面图作为视频第一帧前插,提升点击率;
- 贴纸:结尾叠加随机角度的引导 GIF。
2.6 BGM 节拍卡点(难点二)
问题根因:初版成片里,画面切换点由各段 TTS 时长累加决定,BGM 是最后一步才混入的背景音——两条时间轴各自独立、最后才叠加,切换点能不能踩在鼓点上全凭运气,观感生硬。
解决思路是把节拍信息变成贯穿决策链的一等公民:离线把鼓点算好、存下来,生成时参考它,混剪时对齐它。三个环节:
环节一:曲库节拍预计算(离线,一次性)
用 librosa 对曲库全部 BGM 做节拍追踪,每首曲子提前算好 BPM 和完整的鼓点时间戳序列,存成一份索引。运行时只读索引、不做任何音频分析——最重的音频分析成本一次性摊销掉,新增曲目增量补算即可。
环节二:两次选曲(写脚本时 + 写完后)
第一次选曲——写脚本时(step9):把曲库里 20 首 BGM 的鼓点时间戳连同风格描述一起喂给大模型,让它先按文案情绪挑一首风格合适的;选定之后,以这首曲子的鼓点时间戳作为硬约束去写脚本——每段旁白尽量落在鼓点上。这一步的意义是:脚本从诞生那一刻起就贴着音乐节奏走,而不是写完了再去迁就音乐。
第二次选曲——脚本定稿后(step10.5):脚本定稿、配音完成后各段真实时长已知,再跑一遍时间戳匹配算法做复核——遍历曲库算出哪一首和当前的切换点序列咬得最紧(切换点到最近鼓点的整体偏差最小)。如果算法排出的第一选择和模型按风格选的那一首不是同一首,就两首都保留,下游各出一版成片:一版是「模型按风格选的」,一版是「算法按时间戳匹配的」,供后续择优选用。
这样兼顾两种取向:风格对味(模型擅长)和节奏严丝合缝(算法擅长),不必二选一。
环节三:切换点吸附(step13,snap 落地)
出片前的最后一步。这里有个关键约束:不是所有切换点都要适配——只有画面切换点和最近的鼓点相差不超过 0.25 秒时,才把这一段视频微加速 / 微减速,让切换点精确落上鼓点;差得更多的点直接跳过。硬凑会让画面忽快忽慢,反而更难看。
图 1: BGM 鼓点与画面切换点的吸附示意(偏差 ≤0.25s 的切换点做微变速吸附,超出则保持原样)
也就是说,最终成片里能踩的切换点精确踩点,踩不上的宁可保持自然,而不是为了卡点把整条视频的节奏拉变形。时长差通过裁剪或 ±10% 以内的微变速抹平,人眼无感。
上线评估以「切换点距最近鼓点 <150ms 的比例」定义卡点率,成片卡点率相对基线提升 37.2%,节奏感评审明显改善。这条 pipeline 也顺利通过评审并正式上线,成为平台上可规模产出的内容形态之一。
2.7 成品效果
下面是一条 pipeline 自动产出的鸡汤类挂店短视频成片:
视频 1: 鸡汤类挂店短视频自动剪辑成片(脚本 + 配音 + 封面 + 混剪)
3. 项目二:视频素材质量提升与扩充
3.1 背景
挂店短视频的混剪质量高度依赖素材库的丰富程度与素材本身的「干净度」。原始素材往往存在字幕残留、毛玻璃遮挡等问题,且素材形态单一(多为单一商品展示),直接限制了可生成内容的多样性。我的第二项工作是围绕「素材质量」与「素材规模」两条线展开。
3.2 字幕擦除与毛玻璃去除
针对素材中残留的硬字幕以及遮挡商品的毛玻璃特效,我基于视频编辑大模型 VACE-14B 实现了自动化的字幕擦除与毛玻璃去除:
- 字幕检测:构建了一条「文本特征 → 图像特征 → 几何位置」三道关卡过滤的字幕检测链路(详见 3.3),精确锁定需要擦除的字幕区域;
- 视频 Inpainting:将检测到的字幕/毛玻璃区域作为 mask,交给
VACE-14B进行视频级擦除与修复。
下面展示了毛玻璃去除前后的对比效果:
图 2: 毛玻璃去除前后对比(左:去除前,右:去除后)
下面是一段字幕擦除后的成片效果:
视频 2: 基于 VACE-14B 的字幕擦除效果
3.3 字幕检测链路
字幕擦除的关键在于「检测」。我搭建了一条三道关卡的字幕检测 pipeline:
- 文本特征关卡:利用 PaddleOCR 识别画面文本,通过正则规则过滤掉明显非字幕的文字;
- 图像特征关卡:使用 EfficientNet 分类模型,对候选区域做「是否为字幕」的二分类,进一步剔除误检;
- 几何位置关卡:结合字幕的边界框几何特征(位置、尺寸、长宽比等)做最终约束。
三道关卡由粗到细逐级过滤,最终在字幕检测任务上达到精确率 86.7%、召回率 78.9%、F1 82.7%。
图 3: 字幕区域检测(左)与三道关卡过滤掉的误检示例(右)
3.4 推理加速
VACE-14B 视频编辑虽然效果好,但单条视频的处理时间较长(十几分钟),无法满足线上规模化生产的时效要求。我通过 Omni-vLLM 推理加速对链路做了性能优化:
- 将推理引擎迁移到 Omni-vLLM,并对推理流程做了并行化重构;
- 去除冗余的模型下载与路径解析逻辑,减少无效等待;
- 优化显存管理,及时释放显存并触发 GC,避免长任务下的显存堆积。
优化后,单条视频的编辑时间从十几分钟降至 2~3 分钟,时效性提升了数倍,使字幕擦除/毛玻璃去除具备了规模化应用的条件。
3.5 素材库扩充
在提升素材质量的同时,我还通过多种生成模型大幅扩充了素材库的形态:
- nano-banana 首尾帧生成:生成「衣服 + 裤子」复合搭配的首尾帧,扩充商品组合类素材;
- Qwen-Edit 动作更换:对既有商品素材中的人物动作进行替换,丰富同一商品的动作形态;
- Seedance 多形态展示:为同一商品生成多视角、多形态的展示视频。
通过这些手段,素材库从「单一商品静态展示」拓展到「组合搭配 + 多动作 + 多形态」的丰富形态,为智能剪辑提供了更充足的素材基础。
视频 3: 基于文生视频模型生成的商品多形态展示素材
4. 总结
这段实习让我完整经历了一条从算法设计到真实上线的电商内容生产链路:
- 工程落地能力:从零搭建鸡汤类短视频智能剪辑 pipeline,串起大模型脚本生成、TTS 配音、封面生成、混剪等多个环节,并解决去重、卡点等真实质量问题,最终推动上线;
- 模型调优与加速能力:基于 VACE-14B 实现字幕擦除与毛玻璃去除,并通过推理加速将编辑时效从十几分钟优化到 2~3 分钟;
- 生成式内容生产:熟练运用 nano-banana、Qwen-Edit、Seedance 等多种生成模型,从「生成首尾帧、换动作、多形态展示」多个维度扩充素材库。
这段经历让我深刻理解了工业级 AIGC 内容生产链路中「效果、时效、成本」三者的权衡,也积累了视频编辑大模型在实际业务中的落地经验。