上周帮一个做求职辅导的朋友处理他的直播回放。他每周三晚上开两小时直播讲简历和面试,回放挂在视频号里,平均播放四百出头。他自己试过切片:暂停、找那句话的开头、拖进度条、导出,一条三分钟的竖屏视频要花四十分钟。两小时里明明有十几个能单独发出去的回答,最后一条都没发出去。
问题不在剪辑软件,在时间戳。人耳能听出一句话从哪开始,程序不知道。所以整条链路的核心只有一件事:把「哪一秒到哪一秒」变成可靠的数据。这篇就按这条线走一遍,同时标出哪些环节省不掉人工。
什么样的片源值得走这条路
口播、访谈、课程录播、直播答疑,信息集中在语言上,适合自动化处理。Vlog、探店、手工过程、剧情短片,切点由画面情绪决定,自动切片大概率切在半句话上。
有个不用工具的判断方法:把声音关掉看 30 秒。如果你还能大概知道在发生什么,说明画面本身承载信息,这套流程帮不上什么忙;如果你只看到一个人在动嘴,那就可以往下走。
转写:词级时间戳比文字本身重要
先抽音轨。转写模型基本都吃 16kHz 单声道 PCM,直接用原视频喂进去会多一道隐式重采样。
ffmpeg -i live_0903.mp4 -vn -ac 1 -ar 16000 -c:a pcm_s16le audio.wav
转写方案按你手上有什么设备来选:
| 方案 | 运行位置 | 中文标点 | 词级时间戳 | 备注 |
|---|---|---|---|---|
| FunASR Paraformer(阿里达摩院开源) | 本地 / 魔搭 | 需搭配 ct-punc | 支持 | 中文热词表好用,专有名词纠错方便 |
| faster-whisper large-v3 | 本地 | 自带 | word_timestamps=True | 术语靠 initial_prompt 引导 |
| 剪映专业版智能字幕 | 客户端 | 自带 | 字幕可导出 srt | 不用写代码,长视频上传和识别耗时较长 |
faster-whisper 的调用大致是这样:
from faster_whisper import WhisperModel
model = WhisperModel("large-v3", device="cuda", compute_type="float16")
segments, info = model.transcribe(
"audio.wav",
language="zh",
vad_filter=True,
word_timestamps=True,
initial_prompt="简历 面试 秋招 管培生 群面 单面 背调",
)
vad_filter=True 会先做人声活动检测,把长时间静音切掉,后面选段时不会挑到空档。initial_prompt 里塞进这场直播会反复出现的词,能明显减少专有名词写错的情况——一个把「群面」写成「裙面」的转写结果,后面无论怎么处理都是废的。
FunASR 这条路多了一个标点模型,输出直接是带标点的整句,做选段时更省事:
from funasr import AutoModel
model = AutoModel(
model="paraformer-zh",
vad_model="fsmn-vad",
punc_model="ct-punc",
)
res = model.generate(input="audio.wav", batch_size_s=300)
跑完把结果整理成一个 JSON 数组,每条带 id、start、end、text,这是后面所有步骤的底稿。
选段:让模型只返回句子编号
选段这一步最容易被做坏。很多人直接把整篇转写丢给模型,让它挑金句、顺便给出时间戳。这里有两个坑:模型给的时间戳基本靠猜,偏差十几秒很正常;挑出来的所谓金句,单看那一句很漂亮,但没有前文根本不知道在说什么。
两个坑的解法都很直接。
时间戳不要让模型碰。你传进去的是带编号的分句,要求它只返回 start_id 和 end_id,真实秒数从你自己的转写结果里查。这样无论模型怎么发挥,切出来的时间都是准的。
选段标准从「精彩」换成「不依赖前文也能看懂」。给模型的约束里写清楚几条硬性条件:起始句不能以「那」「然后」「所以刚才」这类指代词开头;片段长度落在 20 到 60 秒;每段必须包含一个完整的问题加回答,或者一个完整结论;最多返回 12 段,按可独立观看的程度排序。
提示词可以照这个骨架改:
你是直播切片选段助手。输入是带编号的口播转写分句。
输出 JSON 数组,每项包含 start_id、end_id、title、reason。
硬性要求:
- 起始句不能以「那」「然后」「所以」「刚才」开头;
- 长度 20-60 秒;
- 每段包含完整问答或完整结论;
- 最多 12 段,按独立可看程度排序。
只输出 JSON,不要解释。
模型返回 12 段,我通常会删掉三到五成。删的理由集中在两类:一段话里反复出现「这个」「那个」却没有明确指代对象;另一类是结论对,但听众需要知道提问者的背景才能理解。这两类模型判断不了,得人来。
切、竖起来、配字幕
切点前后各留一点气口
切片的第一句前面留 0.3 秒,结尾多留 0.5 秒。别把换气声剪得太干净,听起来像被掐断。
ffmpeg -ss 00:12:31.480 -i live_0903.mp4 -t 42.5 \
-c:v libx264 -preset medium -crf 20 \
-c:a aac -b:a 192k clip_07.mp4
-ss 放在 -i 前面是快速定位,速度快但会落到最近的关键帧上,可能有零点几秒误差;要精确到帧就把 -ss 挪到 -i 后面,代价是解码变慢。竖屏短视频这零点几秒影响不大,但如果你要从中间切掉一段再拼接,就得用精确模式。
竖屏两种做法
单人口播,用带人脸跟随的自动裁切就够了,剪映专业版的智能裁剪、腾讯智影里都有类似功能,画面会跟着人物在 9:16 画框里移动。如果原片机位本身比较正,也可以直接在 FFmpeg 里做中心裁切:
ffmpeg -i clip_07.mp4 -vf crop=ih*9/16:ih -c:a copy clip_07_vertical.mp4
双人访谈就不适合跟人了,画面来回跳。改用上下分屏,或者主画面加右上角小窗,把提问者和回答者同时放进竖屏框里。这种情况下人物位置固定,一次排好版就能批量套用。
字幕时间戳必须整体平移
这是最容易被忽略的一步。切片是从 12 分 31 秒开始的,但导出的视频从 0 秒开始,字幕文件里的时间还是原片的。直接挂上去,字幕会全部错位。
做法是把落在切片范围内的分句挑出来,每条的 start 和 end 都减去切片起点,再输出 srt 或 ass。切点不在句首时,第一句的时间可能变成负数,记得钳到 0。
烧录:
ffmpeg -i clip_07_vertical.mp4 -vf subtitles=clip_07.ass -c:a copy final_07.mp4
批量导出前的检查清单
- 前 3 秒有没有把这段的结论或冲突说出口
- 字幕单行不超过 16 字,最多两行
- 切片首尾没有半句话
- 响度统一,用 loudnorm 归到 -14 LUFS 附近
- 竖版封面文字落在安全区内,不被平台按钮遮挡
- 素材里的背景音乐、嘉宾画面有使用依据
- 文件名带日期和序号,方便后面翻找
ffmpeg -i final_07.mp4 -af loudnorm=I=-14:TP=-1.5:LRA=11 \
-c:v copy final_07_norm.mp4
四个容易翻车的环节
降噪引入延迟。 如果你先做降噪再转写,而导出时用的还是原始音轨,某些降噪插件会引入 100 到 300 毫秒的延迟,字幕整体偏。稳妥做法是转写和导出用同一份处理过的音频,省得来回对。
删静音后时间戳失效。 用 auto-editor 这类工具自动去掉停顿,成片比原片短,转写时间戳必须按删除区间重新映射,否则字幕全乱。第一次用建议先拿一段十分钟的素材试,对一遍再上长视频。
显存不够。 large-v3 用 float16 大概要 10GB 显存,跑不动就换 compute_type="int8",或者退到 medium 模型。中文口播场景下,两者的差距主要体现在专有名词上,日常对话内容差别没那么大。
版权。 直播时的背景音乐、连麦嘉宾的画面、转载素材,都要有使用依据。BGM 换成平台自带的曲库最省事。
另外,同一条切片不要原样发到所有平台。竖版平台要 9:16 带字幕,横版平台可以多留一点上下文,尤其当这个结论依赖前面铺垫时。
学习资源
FunASR 由阿里达摩院语音实验室开源,Paraformer、FSMN-VAD、CT-Transformer 标点模型的讲解和演示,可以在 B 站「魔搭ModelScope」账号的官方视频里看到。
剪映专业版的智能字幕和智能裁剪操作演示,可以在 B 站「剪映」官方账号查看;在 B 站或抖音搜索「剪映专业版 智能字幕」,也能找到大量创作者录制的分步教程。
视频来源网络,仅供学习参考,如有侵权请联系删除。
先做一件事
挑一条你手上时长超过 30 分钟的视频,只做第一步:抽出 16kHz 单声道音轨,跑一遍转写,把输出的文本导出来读一遍。重点看专有名词错了多少——如果错得比较多,先把热词表补齐,再谈自动选段。选段准不准,很大程度上取决于转写稿里那个人名和术语是不是对的。