← MedLoom

PoC 验证:视频生成能力

验证目标:从现有素材和 AI 能力出发,找到能快速产出医学科普视频的最优路径。每个方案独立验证,记录真实数据。

核心问题与解法 Demo

视频生成管线中需要优先解决的 4 个问题。每个问题附带可交互的技术方案演示。

1从关键帧生成视频 已验证

场景:从原始素材中截取中间关键帧(教科书模式),然后从关键帧合成一段同时长的视频。

技术管线

原始素材
~10s 动画
关键帧提取
场景变化检测
关键帧检查
人工 / 自动质检
视频合成
I2V 插帧
输出
同时长视频

交互演示:关键帧提取 → 合成

点击按钮观察 24 帧(1 秒 @24fps)中关键帧的提取与合成过程。

24 帧连续序列,等待操作…

实际运行结果

源素材: BY-1 前 3 个切片拼接(13.9s, 1920×1080, 24fps, 333帧)→ 提取 4 个关键帧 → 重建 13.1s 视频

原始素材(333帧)
BY-1 clips 1-3 · 13.9s · 3.6MB
关键帧重建(4帧→视频)
Ken Burns + crossfade · 13.1s · 384KB

提取的关键帧

K1
K1 @ 0.00s
K2
K2 @ 5.00s
K3
K3 @ 10.00s
K4
K4 @ 13.79s

技术选型

步骤方案说明
关键帧提取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

2音画不同步:视频长度适应音频 已验证

问题:同一段动画配不同长度的旁白音频,画面结束但旁白还在说(或旁白结束了画面还没完)。
解法:改变画面播放速度(插帧或抽帧),让视频精确适配音频时长。

交互演示:同一动画 × 两段音频

原始动画 9.8s,两段中文旁白分别 7.2s 和 13.8s(相差 6.6s)。点击切换观察视频如何变速适配。

动画
原始 9.8s 9.8s
音频 A
较短旁白 7.2s
音频 B
较长旁白 13.8s
音频 A → 视频加速
1.36×
9.8s ÷ 7.2s · 抽帧处理
235帧 → 173帧(丢弃 62 帧)
音频 B → 视频减速
0.71×
9.8s ÷ 13.8s · minterpolate 插帧
235帧 → 331帧(插入 96 帧)

帧级可视化

下方展示 20 帧片段的帧处理效果。绿色 = 保留帧,灰色虚线 = 被丢弃,蓝色虚线 = 插值新帧。

原始 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 变速适配。

原始动画(无声)
9.8s · 1920×1080 · 24fps
加速版 → 适配短旁白
1.36× 加速 · 7.2s · 281KB
减速版 → 适配长旁白
0.71× 减速(minterpolate) · 13.7s · 580KB

运行命令

# 运行完整的音画同步 Demo
python scripts/sync_demo.py

3根据旁白生成视频 已验证

输入一段旁白文本,自动生成配套的科普视频。通用管线,不限于特定素材库。

端到端管线

📝
旁白文本
用户输入或 AI 生成
🧠
语义拆分
LLM 按场景分句
🔊
逐句 TTS
生成各句音频+时长
🎨
画面生成
T2V / I2V 按句生成
变速对齐
画面适配音频时长
🎬
合成输出
拼接+转场+字幕

核心流程说明

步骤输入输出技术
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 + 转场 + 字幕
关键点:旁白是唯一输入,所有后续步骤(场景规划、画面选择、时长控制)都由旁白驱动。 这意味着旁白的分句质量直接决定最终视频质量。语义拆分 prompt 需要精心设计。

实际运行结果

输入 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
旁白驱动生成(5 句 → 5 个模块)
118 字旁白 · 26.3s · 944KB · 9s 生成

运行命令

# 使用默认 Demo 旁白
python scripts/narration_demo.py

# 自定义旁白文本
python scripts/narration_demo.py --text "你的旁白内容"

# 从文件读取旁白
python scripts/narration_demo.py --text-file narration.txt

4用户手写旁白 → 已选 + 通用素材视频 暂缓

用户自己编写旁白文本,系统从已选素材库 + 通用素材库中匹配画面,生成视频。

暂缓原因:待定义的产品细节较多 —— 素材库的组织方式、已选/通用素材的优先级、用户编辑旁白的 UI 交互、 素材与旁白的语义匹配策略等。建议先跑通问题 3 的通用管线,再在此基础上扩展用户自定义能力。

待定义的产品细节

维度待决问题
素材库如何组织"已选素材"和"通用素材"?标签体系?搜索方式?
匹配策略用户旁白 → 画面的匹配用 CLIP?语义搜索?手动选择?
编辑 UI用户编辑旁白时能否实时预览匹配的画面?逐句还是整体?
优先级已选素材优先还是通用素材优先?冲突时如何处理?
质量控制自动匹配不满意时,用户如何手动替换单个片段?

验证思路

三个方案代表三种不同的视频生产路径,技术栈和成本结构完全不同。先各自跑通一个最小闭环,再横向对比。

已验证

方案一:切片拼接 + TTS

利用现有 463 个视频切片 + JSON 知识结构,自动拼接 + 合成旁白。

  • 输入:video_code + collect 排序
  • 输出:带旁白的完整知识点视频
  • 状态:病因模块 5/5 知识点已跑通
已验证

渲染引擎对比

同一内容四种渲染方式:ffmpeg 基础/增强、HyperFrames、Remotion。

  • ffmpeg:速度最快,依赖最少
  • HyperFrames:HTML→MP4,Agent 友好
  • Remotion:React→MP4,最适合产品化

数据基础

维度数值说明
视频切片463无字版动画,H264 1920×1080 24fps
知识点57按 video_code 分组,每个含 2-16 个切片
模块12病因/症状/治疗/药物/护理/检查/危害/诱因/预防/定义/流病/就医
旁白文本已结构化converted_text 字段,每个切片一句话
上下文已结构化splicing 字段描述模块→知识点→切片的语义关系
已验证

方案一:切片拼接 + TTS 旁白

从 JSON 数据自动生成完整科普视频。零 AI 生成,纯编排+合成。

技术管线

数据源
JSON
分组排序
video_code + collect
视频拼接
ffmpeg concat
旁白生成
Edge TTS
音视频合并
ffmpeg merge
输出
成品视频

JSON 字段利用

字段类型在管线中的用途
video_codestring知识点分组键(如 YXB-BY-1 = 遗传因素)
collectint切片播放顺序(1,2,3...)
converted_textstringTTS 输入文本,按 collect 拼接成完整旁白
video_namestring本地文件定位(assets/{prefix}/{name}.mp4)
pathstringCDN 原始 URL(备用下载源)
splicingstring提取模块名和知识点标题
video_groups_idstring模块分组标识
sound_namestring= video_name 去掉 WZB- 前缀
idint数据库主键(溯源用)

运行结果:银屑病病因模块(5 个知识点)

全部 5/5 成功,总耗时 14 秒(含网络 TTS 调用)。

知识点切片数视频时长TTS时长文件大小
YXB-BY-1 遗传因素625.3s18.9s3.7MB
YXB-BY-2 免疫异常416.1s12.8s6.5MB
YXB-BY-9 病因总结26.3s5.2s0.5MB
YXB-BY-Q1 遗传详解829.1s24.0s3.3MB
YXB-BY-Q2 免疫详解1144.5s35.4s24MB

成品视频

以下为实际生成的视频。原始切片为无声动画,旁白由 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

验证清单

  • 463 个切片全部可定位和访问
  • collect 排序正确,拼接后叙事连贯
  • converted_text 拼接后的完整旁白可读
  • TTS 语音清晰、语速适中
  • 音视频合并后时间轴对齐
  • 批量生成稳定(病因模块 5/5)
  • 全量 57 知识点批量验证
  • 旁白文本细节修正(如数字读法、标点处理)
  • TTS 供应商对比(Edge vs OpenAI vs ElevenLabs)
  • 视频与旁白时长精确同步(逐句对齐而非整体叠加)

已知问题清单

从实际生成结果倒推,共发现 5 类问题。以下数据基于 463 条切片的全量分析。

一、时长对齐(7/57 知识点有明显问题)

问题数量说明解法
视频比 TTS 短1 个 YXB-YW-9:11s 视频 vs 17s 旁白 视频放慢 / TTS 加速
视频比 TTS 长 >10s6 个 YXB-ZZ-Q5:61s 视频 vs 43s TTS 视频加速 / TTS 放慢
整体叠加而非逐句对齐全部 第 3 句旁白可能播在第 5 个切片画面上 逐切片生成 TTS + 变速匹配

二、文本→语音质量(影响 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 增强HyperFramesRemotion
切片拼接图片替代图片替代
转场效果✓ fade✓ GSAP✓ React
字幕✗ (需 freetype)✓ HTML✓ JSX
片头/片尾
进度条/UI叠加
逐切片变速手动✓ fps 控制
嵌入真实视频✓ 原始视频✓ 原始视频需额外方案✓ <Video>
模板化批量脚本逻辑脚本逻辑✓ HTML 模板✓ React 组件
实时预览✓ 浏览器✓ Player
学习成本低 (HTML)中 (React)
安装依赖仅 ffmpeg仅 ffmpegNode + PuppeteerNode + Chromium

结论

ffmpeg 适合快速原型和批量拼接(速度最快、依赖最少),但缺少呈现层能力。
HyperFrames 适合 AI Agent 驱动的工作流(HTML 即可,无需 React),出品有片头字幕。
Remotion 适合长期产品化(React 生态、精确帧控制、原生支持嵌入 Video 组件)。

推荐路径:ffmpeg 做内容处理层(变速、拼接),HyperFrames 或 Remotion 做呈现层(字幕、转场、模板)。

已验证

AI 视频生成 — 全流程验证通过

从教科书风格关键帧出发,通过云端 I2V + TTS,端到端生成带旁白的医学教学视频。

管线架构

输入
教科书关键帧
I2V 动画
百炼 Wan 2.7
旁白 TTS
edge-tts
变速匹配
ffmpeg
输出
完整教学视频
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.2s7.2 MB120s
BY-1 病因遗传4 帧 4/4 (100%) 19.4s2.2 MB82s

生成视频预览

ZZ-1 寻常型银屑病症状
6 段 · 39.2s · 百炼 Wan 2.7 720P
BY-1 遗传因素
4 段 · 19.4s · 百炼 Wan 2.7 720P

逐段明细 — Pathology (ZZ-1)

#关键帧旁白I2VTTS最终
1关节剖面寻常型银屑病…常累及肘部膝盖5.0s7.4s7.4s
2丘疹皮肤表面凸起红色丘疹5.0s5.2s5.2s
3Auspitz 征刮去鳞屑…点状出血5.0s8.2s8.1s
4斑块红色丘疹进展为红色斑块5.0s8.2s8.1s
5组织切片表皮增生…真皮乳头上延5.0s5.4s5.4s
6毛细血管毛细血管扩张…红细胞聚集5.0s4.9s4.9s

技术选型

环节方案说明
I2V 模型百炼 Wan 2.7阿里云 DashScope API,720P/1080P,5-15s
TTSedge-tts微软云语音,zh-CN-YunyangNeural
变速合成ffmpegsetpts 变速 + 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
已验证

AI I2V 视频生成

教科书关键帧 → Wan 2.7 I2V → TTS → 完整视频

  • 百炼 Wan 2.7 (720P) — 100% 成功率
  • 支持 pathology / BY-1 两套图集
  • 备选:FAL.ai 多模型对比(Kling/Seedance/PixVerse)
待验证

数字人讲解

数字人形象口播 + 切片画中画

  • 闪剪 / Flashcut(已有集成经验)
  • HeyGen / 可灵数字人
  • 验证:口型同步、生成成本、混合模式

5 篇科普文章 — 视频生成对比

将原始切片动画 vs 教科书风格 I2V 生成进行对比。下方时间轴展示每段的关键帧来源和内容缺口补充情况。

Art3 — 银屑病需要做哪些检查?

6 个段落 · 5 个有原始素材 · 1 个缺口(皮肤镜检查)

原始切片拼接(含黑屏缺口段)
教科书风格 I2V v2(首尾帧模式)

段落时间轴

1. 皮肤科就诊
JY-1-1
5.0s
2. 肉眼面诊
JC-Q2-2
10.2s
3. 皮肤镜检查
AI 生成
8.5s
4. 病理活检
JC-1-2
6.8s
5. 关节影像
JC-2-1
4.5s
6. 血液检查
JC-3-1
10.8s
有原始素材覆盖 缺口(AI 补充生成)

逐段旁白内容

#输入旁白语音时长来源片段编号来源片段旁白
1银屑病检查流程简单,优先选择正规皮肤科就诊。5.0sJY-1-1当全身皮肤出现红色丘疹、
2最基础的是皮肤肉眼面诊,医生依靠红斑、鳞屑、点状出血等典型症状,即可初步确诊,便捷无痛苦。10.2sJC-Q2-2。医生一般通过了解病史和观察皮肤病损的情况可作出银屑病的诊断。
3若症状不典型,需做皮肤镜检查,放大观察皮肤结构,区分湿疹、体癣等相似皮肤病。8.5sAI 生成无原始片段(首帧 AI 生成)
4病情复杂时,可做皮肤组织病理活检,少量取样化验,精准判定类型。6.8sJC-1-2局麻后,取部分皮肤病变处组织
5合并关节疼痛的患者,需做关节影像学检查。4.5sJC-2-1X线检查能够帮助检查银屑病,
6同时血常规、免疫检查,能判断身体炎症与免疫状态,为治疗方案提供依据,检查安全性高,无需过度担心。10.8sJC-3-1血液检查是银屑病的重要检查手段,主要包括血

生成流程

① LLM 语义匹配 → 确定画面内容 ② 从原始切片提取关键帧 ③ Gemini 风格转化(保留构图) ④ Wan 2.7 I2V(首尾帧) ⑤ TTS + 变速合成
文章段数缺口模式状态
Art1 · 典型症状60待做
Art2 · 诱发因素70待做
Art3 · 检查流程61(皮肤镜)首帧+尾帧 I2V · 45.3s已完成(v2)
Art4 · 科学治疗61(慢病管理)首帧+尾帧 I2V · 41.8s已完成
Art5 · 预防护理70首帧+尾帧 I2V · 43.0s已完成(v2)
v2 改进:每段使用独立首尾帧对 + 极简 prompt("Smooth transition."), I2V 仅做姿态插值,无自由发挥。变速匹配旁白时长后拼接成完整视频。
待数据

横向评估

三个方案跑通后,从以下维度横向对比:

评估维度

维度ffmpeg 基础ffmpeg 增强HyperFramesRemotion
渲染速度<1s~3s~14s~31s
视觉丰富度
字幕支持✗ (需编译)
转场效果硬切fadeGSAP 动画React 控制
嵌入真实视频原始视频原始视频需额外处理Video 组件
批量能力57个/5min57个/10min需模板化需模板化
产品化潜力最高
安装复杂度ffmpeg onlyffmpeg onlyNode+PuppeteerNode+Chromium