使用 Whisper 词级时间戳和 Remotion 渲染,为本地短视频添加词级高亮字幕。
Remotion Word 高亮字幕是一项面向实际任务的技能,主要用于Overview. 这种技巧将本地视频转换成字幕视频,使用可重复使用的"fine版本":Whisper word timestamps + Remotion-reserted exposed exact-word-word-timpts + 重點的現句。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。
若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;
涉及批量任务时,还应保存进度,避免中断后重复操作。该技能适合用于一次性任务,也可以接入自动化工作流,与其他技能或上层代理配合完成更完整的业务链路;在组合使用时,应明确每一步的输入输出关系,并避免不同步骤之间出现参数冲突。
本技能将本地视频转换为带字幕的视频,采用可复用的“精细版”方案:Whisper 生成带词级时间戳的转录结果,并由 Remotion 渲染当前词高亮效果。除非用户明确要求简单静态字幕(如纯 SRT 烧录),否则请优先使用本技能。
详细使用指南、README 及效果预览地址:https://github.com/0x00000003/remotion-word-highlight-subtitles
以下请求适用本技能:
若用户仅提供一个视频路径,则将输出文件置于源视频同一目录下。
.mp4、.mov、.m4v 或其他具备可用音频轨道的音视频文件。_remotion逐词高亮字幕.mp4 ,与源文件同目录;除非用户另行指定目标路径。--language zh --word_timestamps True --output_format json。startMs 和 endMs。Whisper 返回的长段落须依据标点、时间间隔、持续时长或字符长度进行合理切分后方可渲染。height * 0.28,仅当原始构图明显需要时才微调。height * 0.056(约 60px),且不得低于 56px;对于竖屏 720x1280,目标字号为 40–46px。其余分辨率按高度线性缩放,但须在静帧 QA 中保持一致的视觉感知大小。。 , 、 ? ! : ; , . ? ! : ;。仅当用户明确要求逐字保留标点时,才将其用于切分或计时目的。ffprobe 检查源文件的宽、高、帧率、时长及音频是否存在。turbo 是推荐默认选项(如有)。当术语表中含高风险名称或英文术语时,应使用 --initial_prompt 参数引导识别。scripts/whisper_json_to_captions.py 将 Whisper JSON 转换为 public/captions.json,通过 --replace 或 --replace-phrase 应用修正。同步完成转录修正、术语合并、展示标点剥离;若 Whisper 返回长段落,需启用辅助脚本的字幕切分功能。public/input.mp4,或编码为 H.264 兼容格式并保存为 public/input-h264.mp4。ffprobe 验证最终输出;提取并检查渲染视频中的静帧,确认最终编码文件完整保留已批准的字幕样式。按需调整模型与路径,命令结构如下:
whisper "/absolute/path/video.mp4" --model turbo --language zh --word_timestamps True --output_format json --output_dir "/absolute/path"
涉及专有名词或中英混用主题时,建议添加简短提示词,而非依赖 Whisper 自行推断:
whisper "/absolute/path/video.mp4" --model turbo --language zh --word_timestamps True --output_format json --initial_prompt "本视频可能出现这些词:Cursor、Kimi 2.5、马斯克、AI大模型、转推、套壳。" --output_dir "/absolute/path"
若 Whisper 无法直接解析视频容器格式,请先提取音频:
ffmpeg -y -i "/absolute/path/video.mp4" -vn -ac 1 -ar 16000 "/absolute/path/video_audio.wav"
随后对 WAV 文件运行 Whisper,并确保输出命名清晰可辨。
Whisper 完成后,在构建字幕前务必打印或通读分段转录文本。此步骤为必需关卡,非可选项。
重点核查以下内容:
Cursor、Kimi 2.5、ChatGPT、Claude、OpenAI创建简明修正映射并在渲染前应用。单 token 修正使用 --replace,跨相邻 Whisper token 的词语组合修正使用 --replace-phrase。
示例:
python3 scripts/whisper_json_to_captions.py "/absolute/path/transcript.json" "/absolute/path/remotion-project/public/captions.json" --replace-phrase "科舍=Cursor" --replace-phrase "KMI 2.5=Kimi 2.5" --replace-phrase "Kimi 2.5=Kimi 2.5" --replace-phrase "AI却=AI圈" --replace-phrase "死腿=转推" --merge-term "Cursor" --merge-term "Kimi 2.5" --keyword "AI" --keyword "Kimi 2.5"
若某项修正存疑,建议优先尝试使用更精准的 --initial_prompt 重新运行 Whisper,或在决策前检查对应音视频片段。最终响应中需汇报修正映射。
Remotion 应加载 public/captions.json,其结构如下:
[
{
"text": "我们用手机随便拍张照片",
"startMs": 0,
"endMs": 1600,
"tokens": [
{ "text": "我们", "startMs": 0, "endMs": 300, "keyword": false },
{ "text": "手机", "startMs": 440, "endMs": 700, "keyword": true }
]
}
]
推荐使用辅助脚本:
python3 scripts/whisper_json_to_captions.py "/absolute/path/transcript.json" "/absolute/path/remotion-project/public/captions.json" --keyword "提示词" --keyword "Codex" --replace-phrase "错识别词=正确词" --max-caption-chars 28 --max-caption-duration-ms 4200 --split-gap-ms 260 --min-punctuation-caption-ms 900
请在执行该转换命令前完成转录 QA。若修正导致相邻 tokens 合并为一个显示词,也需通过 --merge-term 或相同文本的 --replace-phrase 显式传入该最终词,以确保高亮呈现为完整单词而非断裂字符。
默认情况下,scripts/whisper_json_to_captions.py 会在最终字幕文本与 token 文本中剥离可见的展示标点,但仍保留标点作为切分信号。除非用户明确要求逐字保留标点,否则请勿传递 --keep-display-punctuation。若手动构建 JSON,请移除纯标点 token 并在渲染前裁剪末尾标点。
该辅助脚本会依据可见长度、持续时长、标点及词间时间间隔对 Whisper 长段落进行切分。短片字幕请保持此行为开启;否则单个 Whisper 段落可能被渲染为不可读的多行字幕。
字幕图层应满足以下条件:
OffthreadVideo 加载源视频。delayRender、continueRender 与 staticFile 加载 captions.json。currentMs >= startMs && currentMs < endMs 判定当前活跃字幕块。currentMs 处于某 token 的时间区间内时,高亮该 token。letterSpacing: 0。60px,且不得低于 56px;若静帧显示为细小 UI 注释文字,则需放大并重渲染。WebkitTextStroke 作为中文大字幕描边。该属性在小分辨率下极易吞噬白色填充。推荐使用多方向 textShadow;若必须使用 WebkitTextStroke,则描边宽度不得超过 1.5px,且需验证静帧效果。<= 0.16,内边距紧凑),并验证其不呈现为深色横幅。凡出现以下任一问题的静帧,均须拒绝并修订:文字模糊/灰暗、黑色光晕过厚、大块黑色背景、文字截断、断行突兀、句末标点可见、字号相对于画面过小、或字幕遮挡讲话者口部/下巴(适用于人像视频)。
以下样式常量为基准参考:
const captionBottom = Math.round(height * 0.28); const isLandscape = width >= height; const baseCaptionFontSize = Math.round(height * (isLandscape ? 0.056 : 0.032)); const minCaptionFontSize = isLandscape && height >= 1000 ? 56 : Math.round(height * 0.032); const captionFontSize = Math.max(baseCaptionFontSize, minCaptionFontSize); const captionMaxWidth = Math.round(width * 0.88); const activeColor = "#FFE45C"; const keywordColor = "#D6FFF8"; const outlinePx = Math.min(3, Math.max(1.5, captionFontSize * 0.055));
推荐使用干净的阴影描边,而非厚重描边:
const textShadow = [
`${outlinePx}px 0 0 rgba(0, 0, 0, 0.96)`,
`-${outlinePx}px 0 0 rgba(0, 0, 0, 0.96)`,
`0 ${outlinePx}px 0 rgba(0, 0, 0, 0.96)`,
`0 -${outlinePx}px 0 rgba(0, 0, 0, 0.96)`,
`0 ${outlinePx * 1.4}px ${outlinePx * 1.4}px rgba(0, 0, 0, 0.72)`,
].join(", ");
对于 1920x1080 横屏视频,此配置生成约 fontSize: 60,且不得低于 56。对于 720x1280 竖屏视频,对应值约为 paddingBottom: 358、fontSize: 41、maxWidth: 634 及 2px 描边。对于启发本技能设计的原始 2160x2974 源文件,对应底部留白约为 830。
若用户未指定关键词,应从转录文本中推断少量关键词:
Codex、Remotion、Whisper提示词、照片、手机、封面关键词高亮须保持稀疏。过多着色词会削弱当前黄色高亮词的视觉主导性。
优先采用:
_remotion逐词高亮字幕.mp4
同一源文件多次迭代时,依次追加 _v2、_v3 等后缀。严禁覆盖用户原始源文件。
向用户明确告知输出路径,说明其采用可复用的 Remotion + Whisper 词级时间戳流程,并附上转录修正映射;若无需修正,则注明“无修正项”。若任一验证步骤未能执行,需直述说明。
相关专题
热门下载
相关下载
精品课程
共6课时 | 54.7万人学习
共89课时 | 133.9万人学习
共49课时 | 82.5万人学习