一句话成片
把一条 1–3 分钟的口播教程视频从零做到可发布。人只需要给主题和素材、确认花钱的步骤、最后审片。
〇、开工前要拿到的东西
| 东西 | 用途 | 没有时 |
|---|---|---|
| 主题 + 目标观众 + 必须出现的事实 | 写稿 | 问一次 |
| 往期视频的标题 / 文案 / 链接 | 学他的写稿风格 | 用写稿 skill 里已有的风格 |
| 一张本人正脸照 | 口播数字人的参考图 | 最好从他真实视频里截一帧,不要用 AI 生成的人像 |
| 一段 8 秒左右干净的本人声音 | 口播数字人的参考音频 | 从往期视频里切一段没有配乐的 |
| 要发哪些平台 | 决定出几个版本 | 默认只出一个 |
花钱的步骤一律先问:每次提交生成前,列出模型、时长、预计积分,等对方明确说“提交”再提交;提交后报 submit_id 和余额。重跑也要问。
一、写稿
- 用写稿 skill(没有就先根据他往期视频总结一个)写三列分镜表:阶段|口播|画面。
- 每段口播 ≤ 15 秒;画面列标清【A】口播 /【B】B-roll /【B+A小窗】,B-roll 写明是截图、本人素材还是说明动画。
- 不编造数字;画面里不出现平台 logo、水印、网址。
- 分镜表给对方确认后再往下做。
二、口播画面(A-roll)
- 即梦 CLI 全能参考(multimodal2video),Seedance 2.5,16:9,参考图 + 参考音频,按分镜段落逐段生成。提示词见
references/prompts.md。 - 生成后逐段转文字(whisper),和台词逐字比对;念错的段落只重跑那一段(先报价再提交)。念错的词如果在全屏 B-roll 下面,可以直接换用别的 take 里那一句的声音,不必重跑。
- 下载原片保存,不要转码压缩后再用。
三、B-roll
- 截图 / 录屏:真实页面、终端、文件夹。平台标识、账号、隐私打码。
- 本人素材:往期视频片段、封面、照片,按原比例用,不裁切人脸。
- 说明动画:用代码动画 skill;每个动画先定好落在哪句台词上(用字级时间轴的 cue),再逐帧画。一个画面只讲一件事。
四、口播粗剪(最容易出问题的一步)
用 ffmpeg 一次滤镜图完成(每段 trim → setpts → scale → fps=30,再 concat),规则:
- 只在停顿里下刀:剪点吸附到 ±0.25 秒内最安静的 20ms;停顿段必须在下一个字开口前 0.05 秒收住,否则会带进半个字。
- 倍速按帧率选:25 帧素材 1.2×、24 帧(Seedance)1.25×,正好映射到 30 帧,一帧不重复。1.1× 之类会周期性重复帧(跳帧)。
- 气口:每句话讲完留 0.5–1 秒;关键句(包袱、情绪句)后约 1 秒;笑声按原速放完再切。
- 气口不够长时慢放静默段,用
minterpolate补帧;补帧会吃掉末尾几帧 → 多喂 0.25 秒原素材,再按精确帧数截断(tpad=stop_mode=clone,trim=end_frame=N,音频同样 apad + atrim 到对应采样数)。素材到头没法多喂时,别慢放,改用下一条素材开口前的静默当气口。 - 口播画面不做任何处理:不缩放(不做 100%/120% 跳切)、不推拉、不调色、不叠颗粒。720p 放大会发虚;两条不同 take 硬接的地方,用 B-roll 转场或小窗放大盖住。
- 缩放用 lanczos,中间文件 CRF ≤ 12,每秒一个关键帧(
-g 30)。 - 粗剪后跑
scripts/check_frames.py:总帧数 = 时长 × 30;步骤段不允许出现 ≥2 帧的定格(章节卡除外)。
五、时间轴
- whisper 字级对齐到成片口播,得到每句 s / e 和每个字的时间 ct;B-roll、字幕、动画都按 ct 取 cue。
- 笑声、极短的词附近对齐常常错位。关键位置(要哔掉的词、硬切点)把那一小段单独切出来转文字确认,别直接信对齐结果。
六、HyperFrames 合成
- 一个 index.html:口播
<video>+ 若干插入片段 + 两个 canvas(背景 / 前景),一条暂停的 GSAP 时间线驱动renderFrame(t),画面只由 t 决定(可逐帧导出、可跳到任意时间)。 - 镜头表:每个镜头 = {模式 A / B / BP, 起点(取自台词 cue), 绘制函数, 转场}。B→A 快切;A↔A 不做动画;需要硬切时起点放在口播剪接点前一帧。
- 字幕逐句、底部居中;配乐原创,人声出现时 sidechain 压低,整体 -14 LUFS。
- 平台版本用一个开关(如
window.HB_VARIANT)切换:换图、打码(把文字画到离屏画布再缩小放大成马赛克)、换头像,主版本输出不受影响。
七、分段渲染
整片固定切成 N 段(如 8 段 × 16 秒),每段是一份把时钟起点设成段首的 html(口播加 data-media-start,插入片段平移或去掉,去掉音频),hyperframes render -c 渲完核对帧数,再用 concat 拼接,最后单独混音、封装。改哪段只重渲哪段;平台版本只渲它改到的段。脚本见 scripts/render_segments.py。
八、抽帧检查(交付前必须做完)
- 每 2 秒抽一帧拼图,逐张看:文字出框、穿帮、黑帧、遮挡人脸、B-roll 与台词对不上
-
check_frames.py:帧数、剪接点后是否定格、每句之后的停顿长度 - 全片转文字,和台词逐句核对;平台版本再搜一遍不能出现的词
- 响度 -14 LUFS 左右、峰值 ≤ -1 dBFS
- 开头结尾:最后一个字说完再淡出,不要压在字上
九、交付
- 主视频(口播 + 转场音效)和 BGM(已避让人声 / 未避让)分开给,时长一致、从 0 对齐,叠加即原混音。
- 平台版本:小红书把工具 / 模型名在画面里打码、口播里用 1 kHz 哔声替换;视频号等可换真人头像。改动涉及的每一处(包括缩略图、截图里的小头像)都要查到。
- 附一份修改清单:每轮意见、改法、状态。
参考
references/prompts.md:写稿、口播生成、截图、代码动画、合成五段可直接复制的提示词scripts/check_frames.py:帧数 / 定格 / 停顿检查 + 抽帧拼图scripts/bleep.py:把指定时间段的人声换成哔声scripts/render_segments.py:HyperFrames 分段渲染与拼接


