验证目标:从现有素材和 AI 能力出发,找到能快速产出医学科普视频的最优路径。每个方案独立验证,记录真实数据。
视频生成管线中需要优先解决的 4 个问题。每个问题附带可交互的技术方案演示。
场景:从原始素材中截取中间关键帧(教科书模式),然后从关键帧合成一段同时长的视频。
点击按钮观察 24 帧(1 秒 @24fps)中关键帧的提取与合成过程。
源素材: BY-1 前 3 个切片拼接(13.9s, 1920×1080, 24fps, 333帧)→ 提取 4 个关键帧 → 重建 13.1s 视频
| 步骤 | 方案 | 说明 |
|---|---|---|
| 关键帧提取 | ffmpeg scene detection |
基于 scene change score 自动检测画面突变帧,阈值可调(本次 threshold=0.08) |
| 关键帧质检 | 人工审查 / CLIP 相似度 |
确保关键帧覆盖所有语义段落,无遗漏无冗余 |
| I2V 插帧合成 | Wan 2.2 I2V / 可灵 3.0 |
两张关键帧之间插值生成平滑过渡帧,保持原始时长 |
| 时长对齐 | ffmpeg setpts + atempo |
微调合成视频播放速度使其精确匹配原始时长 |
# 默认参数(threshold=0.3) python scripts/keyframe_demo.py # 提高灵敏度获取更多关键帧 python scripts/keyframe_demo.py --threshold 0.08 # 使用自定义源视频 python scripts/keyframe_demo.py --source path/to/video.mp4
问题:同一段动画配不同长度的旁白音频,画面结束但旁白还在说(或旁白结束了画面还没完)。
解法:改变画面播放速度(插帧或抽帧),让视频精确适配音频时长。
原始动画 9.8s,两段中文旁白分别 7.2s 和 13.8s(相差 6.6s)。点击切换观察视频如何变速适配。
下方展示 20 帧片段的帧处理效果。绿色 = 保留帧,灰色虚线 = 被丢弃,蓝色虚线 = 插值新帧。
| 场景 | ffmpeg 命令 | 说明 |
|---|---|---|
| 视频加速 1.25× | setpts=PTS/1.25 |
画面加速,丢弃多余帧 |
| 视频减速 0.91× | setpts=PTS/0.91 + minterpolate |
画面减速,用运动插值生成新帧 |
| 音频适配 | atempo=0.8 / atempo=1.1 |
备选方案:调整音频速度而非视频(可能影响语音自然度) |
| 精确对齐 | -shortest |
取音视频中较短的作为输出时长 |
原始动画 9.8s(BY-1 切片 1-2),两段 TTS 旁白通过 ffmpeg setpts + minterpolate 变速适配。
# 运行完整的音画同步 Demo python scripts/sync_demo.py
输入一段旁白文本,自动生成配套的科普视频。通用管线,不限于特定素材库。
| 步骤 | 输入 | 输出 | 技术 |
|---|---|---|---|
| 1. 语义拆分 | 完整旁白文本 | 分句列表 + 场景描述 | LLM(GPT-4o / Claude)+ 自定义 prompt |
| 2. 逐句 TTS | 每句文本 | 音频文件 + 精确时长 | Edge TTS / OpenAI TTS |
| 3. 画面生成 | 场景描述 + 时长约束 | 视频片段 | 可灵 3.0 T2V / Wan 2.2 I2V |
| 4. 变速对齐 | 视频片段 + 目标时长 | 精确时长的视频 | ffmpeg setpts + minterpolate |
| 5. 合成输出 | 所有片段 + 音频 | 完整视频 | ffmpeg concat + 转场 + 字幕 |
输入 5 句旁白(118 字),自动匹配 5 个模块的素材 → 变速对齐 → 合成 26.3s 视频,耗时 9 秒。
| # | 旁白 | 匹配模块 | 素材 | 变速 | 时长 |
|---|---|---|---|---|---|
| S1 | 银屑病是一种慢性炎症性皮肤病,俗称牛皮癣。 | DY 定义 | DY-Q1#1 |
0.74× | 4.8s |
| S2 | 具有遗传倾向,父母一方患病子女风险升高。 | BY 病因 | BY-1#2 |
0.97× | 6.0s |
| S3 | 主要症状为红色斑块,覆有银白色鳞屑。 | ZZ 症状 | ZZ-1#5 |
1.07× | 5.9s |
| S4 | 应注意日常护理,保持皮肤清洁和保湿。 | HL 护理 | HL-2#1 |
1.29× | 4.5s |
| S5 | 治疗应在医生指导下合理用药。 | ZL 治疗 | ZL-1#6 |
0.90× | 5.0s |
# 使用默认 Demo 旁白 python scripts/narration_demo.py # 自定义旁白文本 python scripts/narration_demo.py --text "你的旁白内容" # 从文件读取旁白 python scripts/narration_demo.py --text-file narration.txt
用户自己编写旁白文本,系统从已选素材库 + 通用素材库中匹配画面,生成视频。
| 维度 | 待决问题 |
|---|---|
| 素材库 | 如何组织"已选素材"和"通用素材"?标签体系?搜索方式? |
| 匹配策略 | 用户旁白 → 画面的匹配用 CLIP?语义搜索?手动选择? |
| 编辑 UI | 用户编辑旁白时能否实时预览匹配的画面?逐句还是整体? |
| 优先级 | 已选素材优先还是通用素材优先?冲突时如何处理? |
| 质量控制 | 自动匹配不满意时,用户如何手动替换单个片段? |
三个方案代表三种不同的视频生产路径,技术栈和成本结构完全不同。先各自跑通一个最小闭环,再横向对比。
利用现有 463 个视频切片 + JSON 知识结构,自动拼接 + 合成旁白。
同一内容四种渲染方式:ffmpeg 基础/增强、HyperFrames、Remotion。
| 维度 | 数值 | 说明 |
|---|---|---|
| 视频切片 | 463 | 无字版动画,H264 1920×1080 24fps |
| 知识点 | 57 | 按 video_code 分组,每个含 2-16 个切片 |
| 模块 | 12 | 病因/症状/治疗/药物/护理/检查/危害/诱因/预防/定义/流病/就医 |
| 旁白文本 | 已结构化 | converted_text 字段,每个切片一句话 |
| 上下文 | 已结构化 | splicing 字段描述模块→知识点→切片的语义关系 |
从 JSON 数据自动生成完整科普视频。零 AI 生成,纯编排+合成。
| 字段 | 类型 | 在管线中的用途 |
|---|---|---|
video_code | string | 知识点分组键(如 YXB-BY-1 = 遗传因素) |
collect | int | 切片播放顺序(1,2,3...) |
converted_text | string | TTS 输入文本,按 collect 拼接成完整旁白 |
video_name | string | 本地文件定位(assets/{prefix}/{name}.mp4) |
path | string | CDN 原始 URL(备用下载源) |
splicing | string | 提取模块名和知识点标题 |
video_groups_id | string | 模块分组标识 |
sound_name | string | = video_name 去掉 WZB- 前缀 |
id | int | 数据库主键(溯源用) |
全部 5/5 成功,总耗时 14 秒(含网络 TTS 调用)。
| 知识点 | 切片数 | 视频时长 | TTS时长 | 文件大小 |
|---|---|---|---|---|
YXB-BY-1 遗传因素 | 6 | 25.3s | 18.9s | 3.7MB |
YXB-BY-2 免疫异常 | 4 | 16.1s | 12.8s | 6.5MB |
YXB-BY-9 病因总结 | 2 | 6.3s | 5.2s | 0.5MB |
YXB-BY-Q1 遗传详解 | 8 | 29.1s | 24.0s | 3.3MB |
YXB-BY-Q2 免疫详解 | 11 | 44.5s | 35.4s | 24MB |
以下为实际生成的视频。原始切片为无声动画,旁白由 Edge TTS (zh-CN-YunyangNeural) 合成。
# 列出所有可用知识点和模块 python scripts/assemble.py --list # 生成单个知识点 python scripts/assemble.py YXB-BY-1 # 生成整个模块 python scripts/assemble.py --module BY # 生成全部 57 个知识点 python scripts/assemble.py --all # 仅拼接视频,不加 TTS python scripts/assemble.py YXB-BY-1 --no-tts
从实际生成结果倒推,共发现 5 类问题。以下数据基于 463 条切片的全量分析。
| 问题 | 数量 | 说明 | 解法 |
|---|---|---|---|
| 视频比 TTS 短 | 1 个 | YXB-YW-9:11s 视频 vs 17s 旁白 |
视频放慢 / TTS 加速 |
| 视频比 TTS 长 >10s | 6 个 | 如 YXB-ZZ-Q5:61s 视频 vs 43s TTS |
视频加速 / TTS 放慢 |
| 整体叠加而非逐句对齐 | 全部 | 第 3 句旁白可能播在第 5 个切片画面上 | 逐切片生成 TTS + 变速匹配 |
| 问题 | 数量/比例 | 示例 | 解法 |
|---|---|---|---|
| 开头有悬挂标点 | 21 处 | ",发病率愈高。" | 正则清洗 |
| 结尾逗号(不完整句) | 120 处 | "大约1/3的银屑病患者," | 正常断句,非错误 |
| 数字/分数/百分比 | 23 处 | "1/3" → "三分之一" "20%" → "百分之二十" |
文本预处理转换 |
| 跨切片断句 | 329/406 (81%) | 前一切片结尾不是完整句 | 逐切片 TTS 时需合并上下文 |
跨切片断句的核心含义:原始数据把完整解说词拆成了多个切片,每个切片不是独立语义单元。 如果逐切片生成 TTS,会在不该停顿的地方产生停顿。
| 缺失项 | 影响 | 解法 |
|---|---|---|
| 无转场效果 | 切片间硬切,画面跳变 | ffmpeg xfade 滤镜 |
| 无背景音乐 | 只有人声,显得单薄 | 叠加免版权 BGM |
| 无片头/片尾 | 不像完成品 | ffmpeg 拼接模板片段 |
| 无字幕轨道 | 医学内容无字幕可读性差 | ffmpeg drawtext / ASS 字幕 |
| 场景 | 问题 | 解法 |
|---|---|---|
| 英文版 | 翻译后文本更长,同样画面时间不够 | 变速 + 可能需额外切片 |
| 字幕切换 | 换语言不只是换音频 | 字幕文件独立生成 |
| 术语翻译 | 医学术语准确性 | 需专业审核 |
| 需求 | 当前能力 | 解法 |
|---|---|---|
| 跳过某个切片 | 不支持 | assemble.py 加 --exclude 参数 |
| 调整切片顺序 | 只能按 collect | 支持自定义排序文件 |
| 插入文字卡片/图表 | 不支持 | ffmpeg 生成静态帧 → 插入 |
| 替换单个切片内容 | 不支持 | 支持 override 映射 |
同一知识点(YXB-BY-1 银屑病与遗传因素),四种渲染方式的实际效果对比。
| 方式 | 工具 | 特性 | 渲染耗时 | 输出大小 | 时长 |
|---|---|---|---|---|---|
| 基础拼接 | ffmpeg concat + copy | 硬切,整体 TTS 叠加 | <1s | 3.7MB | 18.9s |
| ffmpeg 增强 | ffmpeg xfade + setpts | fade 转场 + 逐切片变速对齐 | ~3s | 946KB | 19.3s |
| HyperFrames | HTML + GSAP → Puppeteer 截帧 | 片头片尾 + 字幕 + 进度条 + Ken Burns | ~14s | 3.8MB | 21.1s |
| Remotion | React 组件 → Chromium 截帧 | 片头片尾 + 字幕 + 进度条 + Ken Burns | ~31s | 2.5MB | 21.1s |
同一知识点、同一 TTS 旁白,四种渲染引擎的输出。请逐个播放对比画面质量、转场效果和整体观感。
| 能力 | ffmpeg 基础 | ffmpeg 增强 | HyperFrames | Remotion |
|---|---|---|---|---|
| 切片拼接 | ✓ | ✓ | 图片替代 | 图片替代 |
| 转场效果 | ✗ | ✓ fade | ✓ GSAP | ✓ React |
| 字幕 | ✗ | ✗ (需 freetype) | ✓ HTML | ✓ JSX |
| 片头/片尾 | ✗ | ✗ | ✓ | ✓ |
| 进度条/UI叠加 | ✗ | ✗ | ✓ | ✓ |
| 逐切片变速 | ✗ | ✓ | 手动 | ✓ fps 控制 |
| 嵌入真实视频 | ✓ 原始视频 | ✓ 原始视频 | 需额外方案 | ✓ <Video> |
| 模板化批量 | 脚本逻辑 | 脚本逻辑 | ✓ HTML 模板 | ✓ React 组件 |
| 实时预览 | ✗ | ✗ | ✓ 浏览器 | ✓ Player |
| 学习成本 | 低 | 低 | 低 (HTML) | 中 (React) |
| 安装依赖 | 仅 ffmpeg | 仅 ffmpeg | Node + Puppeteer | Node + Chromium |
ffmpeg 适合快速原型和批量拼接(速度最快、依赖最少),但缺少呈现层能力。
HyperFrames 适合 AI Agent 驱动的工作流(HTML 即可,无需 React),出品有片头字幕。
Remotion 适合长期产品化(React 生态、精确帧控制、原生支持嵌入 Video 组件)。
推荐路径:ffmpeg 做内容处理层(变速、拼接),HyperFrames 或 Remotion 做呈现层(字幕、转场、模板)。
从教科书风格关键帧出发,通过云端 I2V + TTS,端到端生成带旁白的医学教学视频。
python scripts/pipeline_full.py --api dashscope --set pathology # 全自动:6帧 → 6段I2V → 6段TTS → 变速合成 → 拼接 → final_pathology.mp4 (39.2s)
| 图集 | 帧数 | I2V 成功率 | 总时长 | 文件大小 | 耗时 |
|---|---|---|---|---|---|
| ZZ-1 症状 (pathology) | 6 帧 | 6/6 (100%) | 39.2s | 7.2 MB | 120s |
| BY-1 病因遗传 | 4 帧 | 4/4 (100%) | 19.4s | 2.2 MB | 82s |
| # | 关键帧 | 旁白 | I2V | TTS | 最终 |
|---|---|---|---|---|---|
| 1 | 关节剖面 | 寻常型银屑病…常累及肘部膝盖 | 5.0s | 7.4s | 7.4s |
| 2 | 丘疹 | 皮肤表面凸起红色丘疹 | 5.0s | 5.2s | 5.2s |
| 3 | Auspitz 征 | 刮去鳞屑…点状出血 | 5.0s | 8.2s | 8.1s |
| 4 | 斑块 | 红色丘疹进展为红色斑块 | 5.0s | 8.2s | 8.1s |
| 5 | 组织切片 | 表皮增生…真皮乳头上延 | 5.0s | 5.4s | 5.4s |
| 6 | 毛细血管 | 毛细血管扩张…红细胞聚集 | 5.0s | 4.9s | 4.9s |
| 环节 | 方案 | 说明 |
|---|---|---|
| I2V 模型 | 百炼 Wan 2.7 | 阿里云 DashScope API,720P/1080P,5-15s |
| TTS | edge-tts | 微软云语音,zh-CN-YunyangNeural |
| 变速合成 | ffmpeg | setpts 变速 + aac 音频合成 |
| 关键帧风格 | textbook 3D | 教科书渲染风格,深色背景 |
备选 I2V 后端:FAL.ai (Wan 2.7 / Kling 3.0 / Seedance 2.0 / PixVerse V6),已编写对比脚本 scripts/i2v_compare.py
| 项目 | 单价 | 本次用量 | 费用 |
|---|---|---|---|
| 百炼 Wan 2.7 I2V (720P) | ¥0.6/秒 | 50s (10段×5s) | ¥30 |
| edge-tts | 免费 | 10段 | ¥0 |
| 新用户免费额度 | — | 50秒 | -¥30 |
| 实际花费 | ¥0 | ||
教科书关键帧 → Wan 2.7 I2V → TTS → 完整视频
数字人形象口播 + 切片画中画
将原始切片动画 vs 教科书风格 I2V 生成进行对比。下方时间轴展示每段的关键帧来源和内容缺口补充情况。
6 个段落 · 5 个有原始素材 · 1 个缺口(皮肤镜检查)
| # | 输入旁白 | 语音时长 | 来源片段编号 | 来源片段旁白 |
|---|---|---|---|---|
| 1 | 银屑病检查流程简单,优先选择正规皮肤科就诊。 | 5.0s | JY-1-1 | 当全身皮肤出现红色丘疹、 |
| 2 | 最基础的是皮肤肉眼面诊,医生依靠红斑、鳞屑、点状出血等典型症状,即可初步确诊,便捷无痛苦。 | 10.2s | JC-Q2-2 | 。医生一般通过了解病史和观察皮肤病损的情况可作出银屑病的诊断。 |
| 3 | 若症状不典型,需做皮肤镜检查,放大观察皮肤结构,区分湿疹、体癣等相似皮肤病。 | 8.5s | AI 生成 | 无原始片段(首帧 AI 生成) |
| 4 | 病情复杂时,可做皮肤组织病理活检,少量取样化验,精准判定类型。 | 6.8s | JC-1-2 | 局麻后,取部分皮肤病变处组织 |
| 5 | 合并关节疼痛的患者,需做关节影像学检查。 | 4.5s | JC-2-1 | X线检查能够帮助检查银屑病, |
| 6 | 同时血常规、免疫检查,能判断身体炎症与免疫状态,为治疗方案提供依据,检查安全性高,无需过度担心。 | 10.8s | JC-3-1 | 血液检查是银屑病的重要检查手段,主要包括血 |
| 文章 | 段数 | 缺口 | 模式 | 状态 |
|---|---|---|---|---|
| Art1 · 典型症状 | 6 | 0 | — | 待做 |
| Art2 · 诱发因素 | 7 | 0 | — | 待做 |
| Art3 · 检查流程 | 6 | 1(皮肤镜) | 首帧+尾帧 I2V · 45.3s | 已完成(v2) |
| Art4 · 科学治疗 | 6 | 1(慢病管理) | 首帧+尾帧 I2V · 41.8s | 已完成 |
| Art5 · 预防护理 | 7 | 0 | 首帧+尾帧 I2V · 43.0s | 已完成(v2) |
三个方案跑通后,从以下维度横向对比:
| 维度 | ffmpeg 基础 | ffmpeg 增强 | HyperFrames | Remotion |
|---|---|---|---|---|
| 渲染速度 | <1s | ~3s | ~14s | ~31s |
| 视觉丰富度 | 低 | 中 | 高 | 高 |
| 字幕支持 | ✗ | ✗ (需编译) | ✓ | ✓ |
| 转场效果 | 硬切 | fade | GSAP 动画 | React 控制 |
| 嵌入真实视频 | 原始视频 | 原始视频 | 需额外处理 | Video 组件 |
| 批量能力 | 57个/5min | 57个/10min | 需模板化 | 需模板化 |
| 产品化潜力 | 低 | 中 | 高 | 最高 |
| 安装复杂度 | ffmpeg only | ffmpeg only | Node+Puppeteer | Node+Chromium |