launch-video-kit 是做什么的?
视频中非设计部分的六个组件:音频、字幕和摄像机。README 是参考文档(解释每项决策的原因及其支撑数据)。以下是工作顺序及容易忽略的规则。
顺序很重要
- 先处理语音,再进行剪辑。
gen-voice.mjs会打印每一行的实际时长(以帧为单位)。这些数字决定了场景的时间点。如果先进行剪辑,那么实际每条语音都会打乱剪辑,导致需要重做。 - 然后处理音乐,根据能量曲线选择窗口(
analyze-music.mjs),并在必要时延长(loop-music.mjs)。 - 接着进行剪切,将其绑定到分析结果输出的小节网格上。
- 最后添加字幕,此时你已知道哪些句子有屏幕上的标题,哪些没有。
容易自动违反的规则
- 每个语音文件对应一行。 永远不要使用长录音。
- 只给屏幕上未显示的文字添加字幕。 如果句子已经出现在标题中,再添加字幕会导致同一位置出现重复文本。
- 字幕的
dur是阅读时间,而不是语音的持续时间。手动裁剪范围,确保前后不重叠,也不与后面的标题重叠。 DUCK.base不超过 ~0.85。 库中的音轨通常为 0 dB,任何叠加效果都会导致削波。- 摄像机:保持静止,或者进行短距离移动。 既不要持续漂移(分散注意力),也不要生硬切换(跳跃)。并且每个场景应从上一场景结束时的取景开始。
- 拼接两侧的界面使用相同的组件。 如果一个场景是手动绘制的,它会在某个细节上产生差异,在切换块时会突然出现那个差异。
- 在时间数组上迭代,而非内容数组。 在内容数组上循环,但索引较短的时间数组,一旦移除一个节拍,渲染就会崩溃。
进行验证而非猜测
智能体无法看到或听到视频。所有看似主观的内容都有对应的数字指标:
# 按片段检查混音:语音与音乐的混合应与单独语音的音量相当
ffmpeg -hide_banner -ss 27 -t 4 -i out.mp4 -af volumedetect -f null /dev/null
# 全局峰值必须低于 -1 dB
ffmpeg -hide_banner -i out.mp4 -af volumedetect -f null /dev/null
# 使用联系 sheet 替代逐帧审查
ffmpeg -v error -i f_%d.png -vf "scale=560:-1,tile=5x4" -frames:v 1 sheet.png
loop-music.mjs 会自动验证其拼接点:如果某个拼接点不在静音区域,它会发出警告,此时需要选择另外两个间隙。
环境要求
- 需要在 PATH 中包含
ffmpeg和ffprobe,以及 Node 20 或更高版本。 - 在 Windows 下的 Git Bash 中:
ffmpeg不支持glob模式,且drawtext因缺少 fontconfig 而无法使用。请使用编号序列。此外也没有bc。 - Remotion 的
staticFile()对空格和重音敏感:请将资源重命名为 ASCII 字符。 - 在
<Sequence>内部,useVideoConfig().durationInFrames是该序列的时长,而不是整个视频的。不要将其与绝对帧混淆。
无法实现的功能
TTS 只有语音,没有呼吸声。叹息、笑声和效果音需要单独录制。合成哔哔声可以通过 ffmpeg 生成,README 中有一个示例。