短视频生产流水线
把「一句话 / 一份文案」做成一条 1080×1920 的成片:主张 → 逐句配音 → 数据动效 → 镜头对位合成 → 出片闸门。
不分行业、不分风格:科技、财经、农业、跨境、本地生活都能用,换的是文案和素材,不换流水线。
换行业要改的四件事(词表 / 证据 / 数据源 / 口吻)见 references/06-跨行业适配.md。
整套东西只有三个硬依赖:Python 3.8+、Pillow、ffmpeg。中文字体用系统自带的(没有就放一款到 assets/fonts/)。
配音不绑定任何厂商:现成音频、edge-tts、本地 GPT-SoVITS / CosyVoice / 火山 / 百炼,任选。
什么时候用
用户说「把这段文案做成视频」「这条新闻出个短视频」「一句话生成视频」「帮我把数据做成视频里的图」,
或者已经有了文案、素材、配音其中任意一项,缺的是成片时,用这个技能。
不适合:需要真人出镜拍摄、需要复杂三维动画、需要多轨剪辑调色的片子。
开工前先问(一次问完,别边做边猜)
- 行业和受众是谁?(决定用词、例子、能不能用行话)
- 发哪个平台?竖屏默认 1080×1920;B站/西瓜要横屏就改
canvas.w/h和window。 - 风格:锐评型(有立场、敢下判断)/ 科普型(翻译成人话)/ 资讯型(快、密)/ 清单型(几大几点)。
- 配音从哪来?①已有音频 ②edge-tts ③本地 TTS 命令(要它支持逐句输入)。
- 有没有实拍素材?没有就全用数据动效 + 图片,也能成片,但数据画面占比别超 45%。
问完把答案写进 project.json 的 style 和 audio,后面所有脚本都读它。
五步出片(每步都能单独重跑)
# 0. 环境自检(第一次必跑;想直接看效果就加 --demo,会造一条 20 秒演示片)
python scripts/doctor.py --demo
# 1. 建工程(生成 project.json / script.json / 目录骨架)
python scripts/init_project.py ./我的片子 --title "第一行|第二行" --kicker "栏目名" --script 文案.txt
# 2. 配音 + 分句时间轴(逐句合成,时间轴自带,不用对齐模型)
python scripts/tts.py ./我的片子 --mode edge --voice zh-CN-YunxiNeural
# 已有整段配音:python scripts/tts.py ./我的片子 --mode file --audio 配音.mp3
# python scripts/align.py ./我的片子 --write
# 3. 底卡 + 数据动效
python scripts/make_card.py ./我的片子 --preview
python scripts/motion_card.py demo --out ./我的片子/video_cards # 看引擎怎么用
# 4. 字幕 + 合成
python scripts/make_subs.py ./我的片子
python scripts/build_video.py ./我的片子 # 先 --dry 看分镜表
# 5. 出片闸门(红牌就不许发)
python scripts/gate_visual.py ./我的片子
python scripts/gate_audio.py --out ./我的片子/tts/voice.mp3 --chars 351
时间基准只有一个:tts/segments.json。
镜头表写「第几句到第几句」,不写秒数——改文案、换配音、调速都不用重排时间轴。
三条铁律(违反就是返工)
- 数据画面不许是静态的。一个数字做成一张图,观众 0.3 秒读完就走。
用motion_card.py的六种原语(数字滚动/条形/环形/折线/点阵/KPI)做成 2~4 秒动效。
gate_visual.py会检查:静态图镜头 >1.5 秒直接红牌。 - 采样率必须和模型输出对齐。把 32kHz 的模型输出按 16kHz 写盘,声音会慢一倍、低八度,
听起来像换了个人,然后所有人都会去怀疑模型——根因其实在写文件的参数。gate_audio.py查这个。 - 字幕一条不超过 13 个字,按标点断。整句 20 字硬塞一行,一定会被画布宽度截掉一个字,
而且是在成片之后才发现。
缺东西怎么降级(都能跑,不要卡住)
| 缺什么 | 降级做法 |
|---|---|
| 没有 TTS | --mode file:先用任何工具生成一段整段音频,align.py --write 补时间轴;实在没有就先用占位音出无声草稿验证版式 |
| 没有 edge-tts | --mode cmd --template '你的TTS --text "{text}" --out "{out}"',本地模型全都能接 |
| 没有 numpy | gate_audio 只做采样率和语速检查,音高/音色项自动跳过并提示 |
| 没有中文字体 | 放任意一款 ttf/otf 到 assets/fonts/,或在 project.json 写 "fonts": {"bold": "...", "regular": "..."} |
| 没有实拍素材 | 全用 motion_card 动效 + 纯图片镜头;注意数据画面占比别超 45% |
| 素材分辨率和画面比例不符 | 不要用 iw:ih 相对裁剪硬拉,会纵向拉伸变形。在 sources.<key>.crop 里按实际像素写死裁剪框 |
目录结构
项目/
├── project.json 唯一配置:版式 / 音频 / 素材 / 镜头表
├── script.json 句子列表(一行一句)
├── media/ 实拍素材
├── video_cards/ 数据动效 mp4 + card.png 底卡
├── video_subs/ 字幕 PNG(自动生成)
├── tts/ voice.mp3 + segments.json + parts/
├── subs.json 字幕时间轴(make_subs 产出)
├── plan.json 分镜表(build_video 产出,闸门读它)
└── out/final.mp4 成片
详细方法(按需读,不要一次全读)
references/00-流程总纲.md—— 五阶段细节、镜头表语义、验收标准、抖动/黑屏等工程坑references/01-判断层-选题与钩子.md—— 写文案前必读:选题怎么筛、钩子怎么写(含一条被用户当场否掉的错误示范)、结构模板、事实核查references/02-画面规范.md—— 版式参数、动效原语怎么选、裁剪与字幕的硬规则references/03-配音与音质.md—— 采样率事故全记录、逐句合成 vs 整段对齐、闸门指标怎么读references/04-发布与平台约束.md—— 各平台硬约束(话题数、封面比例、定时)、半自动发布工具references/05-故障排查.md—— 症状 → 原因 → 处置,出问题先看这张表references/06-跨行业适配.md—— 换行业必读:词表、证据、数据源、口吻四件事怎么换