运行时依赖
安装命令
点击复制技能文档
Remotion Word Highlight Subtitles 概述 此技能使用可重用的“精细版本”将本地视频转换为带有字幕的视频,使用 Whisper 单词时间戳和 Remotion 渲染的当前单词高亮。除非用户明确要求简单静态字幕,否则应使用此技能代替普通 SRT 烧录。
触发短语 使用此技能处理以下请求: “给这个视频添加字幕:/path/to/video.mp4” “给这个视频加逐词高亮字幕” “按之前 Remotion 那个字幕方案处理这个视频” “重新转写 word timestamps,然后加当前词高亮字幕” 如果用户只提供一个视频路径,则在源视频旁边写入输出。
默认值 源:本地 .mp4、.mov、.m4v 或具有可用音频的音频/视频文件。 输出:<源文件名>_remotion逐词高亮字幕.mp4,在同一目录中,除非用户指定其他目标。
转录:使用 Whisper 和单词时间戳,默认为中文:--language zh --word_timestamps True --output_format json。 字幕数据:每个 Whisper 段使用一个 Remotion 字幕,具有 token 级别的 startMs 和 endMs。 字幕位置:将所有字幕保持在截图友好型的下部区域,略高于底部 UI 区域。从高度 0.28 的底部填充开始,然后仅在源帧明显需要时进行调整。 视觉样式:粗体中文 UI 字体,白色基准文本,当前 token 黄色,选项稀疏关键词强调和黑色阴影/轮廓以提高可读性。
验证:检查渲染文件是否存在,保持音频,匹配源持续时间,并在接受样式之前检查静态图像。
工作流 使用 ffprobe 检查源视频的宽度、高度、fps、持续时间和音频存在。 运行 Whisper 单词时间戳转录。首选缓存/本地模型,该模型可在机器上运行;turbo 是一个好的默认值,当可用时。 使用 scripts/whisper_json_to_captions.py 将 Whisper JSON 转换为 public/captions.json。 在视频文件夹中构建或重用一个小型 Remotion 项目。 将视频复制到 public/input.mp4 或编码为 H.264 兼容副本 public/input-h264.mp4。 将 Remotion 组合设置为源视频的精确宽度、高度、fps 和持续时间(以帧为单位)。 在完全渲染之前,渲染和检查至少两个 Remotion 组合的静态图像:一个长/两行字幕和一个密集关键词/当前 token 字幕。 在渲染最终视频之前,修复模糊文本、过多轮廓、大的黑色背景、糟糕的换行或位置不佳。 使用 Remotion 渲染到源视频旁边的输出路径。 使用 ffprobe 验证最终输出;提取并检查渲染视频中的静态图像,以确认最终编码文件保留了批准的字幕外观。
Whisper 命令 使用此形状,根据需要调整模型和路径: whisper "/absolute/path/video.mp4" --model turbo --language zh --word_timestamps True --output_format json --output_dir "/absolute/path" 如果 Whisper 在视频容器上失败,则先提取音频: ffmpeg -y -i "/absolute/path/video.mp4" -vn -ac 1 -ar 16000 "/absolute/path/video_audio.wav" 然后在 WAV 上运行 Whisper 并保持输出命名清晰。
字幕 JSON 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" 转换后,快速扫描转录文本以查找明显的识别错误,并在渲染之前修复 captions.json。
Remotion 字幕层要求 字幕层应: 使用 OffthreadVideo 作为源视频。 使用 delayRender、continueRender 和 staticFile 加载 captions.json。 通过 currentMs >= startMs && currentMs < endMs 找到活动字幕。 当 currentMs 在 token 时间内时,突出显示活动 token。 仅作为次要强调使用关键词着色;当前发言 token 是主要效果。 保持 letterSpacing:0。 保持所有字幕在正常位置;除非用户明确要求,否则不包括特殊截图句子放置。 不使用 WebkitTextStroke 作为粗体中文字幕轮廓。它很容易在小分辨率下吃掉白色填充。 更喜欢多方向 textShadow;如果使用 WebkitTextStroke,保持在或以下 1.5px,并验证静态图像。 不使用大半透明圆角黑色矩形作为整个字幕的背景。若视频确实需要背景,则使用非常微妙的每行背景,不透明度 <= 0.16,紧密填充,并验证它不会看起来像一个黑色横幅。 拒绝并修订任何静态图像,其中字幕具有模糊/灰色文本、厚黑色光环、大黑色框、剪切的单词、不雅的换行或在对话头视频中口/下巴上的放置。 使用以下样式常量作为基线: const captionBottom = Math.round(height 0.28); const captionFontSize = Math.round(height * 0.032);