02-pipeline

调度流程

article-slide-video 的流水线从输入文章、讲稿或脚本开始,到带字幕视频、横竖封面和 QA 报告结束。每一步都产出可落盘检查的中间文件。

1. 创建输出目录

默认输出根目录来自 article-slide-video/env.json:

{
  "ARTICLE_SLIDE_VIDEO_OUTPUT_ROOT": "~/ai-artifacts/article-slide-video"
}

如果用户没有指定输出目录,调度器按输入文件名或安全主题名创建子目录。所有中间产物和最终交付物都写入这个目录,禁止写到输入文件旁边。

2. 生成冻结口播稿

调度器加载 voiceover-editor,把输入文本整理为 voiceover.md。

这个阶段的原则是编辑而不是创作:

  • 成熟口播稿只修复明显错字、断句和朗读问题。
  • 普通文章或笔记改成自然口语和适合换气的句长。
  • 转写文本删除口头禅、口吃重复和重新起头残句。
  • 不添加原文没有的事实、数据、案例或结论。

voiceover.md 的第一行是 H1 标题,正文是自然段。写入后它被视为后续流程唯一文本来源。

3. 生成讲述规划

调度器加载 slide-narration-planner,从冻结的 voiceover.md 生成 narration-plan.json。

默认规则是:

  • 空行分隔视为页面边界。
  • 页面 ID 使用稳定格式:slide-01、slide-02。
  • 每页尽量一个口播片段。
  • 页面停顿通常为 0.35s 到 0.4s,最长不超过 0.5s。
  • 只允许重新分页,不允许改写口播稿措辞。

从这一阶段开始,slide_id 成为全流程主键。

4. 生成视频可渲染的 HTML deck

调度器选择 HTML 幻灯片生成器。默认是 frontend-slides;用户指定其他工具时,可以替换为 Hyperframes 或其他生成器。

生成器必须输出:

  • deck.html
  • deck-manifest.json
  • HTML 内部的 window.__SLIDE_VIDEO__ 浏览器桥接

生成器必须使用 narration-plan.json 中的原始 slide_id,不得重新编号,也不得按数量推断。

5. 生成分段 TTS

调度器加载 bytedance-tts,读取 narration-plan.json,生成:

  • voiceover.wav
  • tts-manifest.json

TTS 按片段请求语音,只把正文发送给接口。页面停顿不依赖 SSML,而是在本地插入真实静音,确保最终时间线可控。

6. 校验 ID 集合一致

进入视频交付前,调度器校验三处 slide_id 集合完全一致:

  • narration-plan.json
  • deck-manifest.json
  • tts-manifest.json

这是防错页、防音画错位的关键闸门。校验失败时不能继续合成视频,必须回到出错阶段修复。

7. 最终视频交付

调度器加载 slide-video-delivery,一次性完成:

  • 按 manifest 逐页渲染 PNG 帧。
  • 按 TTS 实际时长合成 final.mp4。
  • 生成 subtitles.ass。
  • 烧录字幕生成 final-subtitled.mp4。
  • 生成横屏 cover.png 和竖屏 cover-portrait.png。
  • 抽取逐片段 QA 帧。
  • 写入 delivery-report.json。

8. 检查交付报告

交付完成不只看文件是否存在,还要检查 delivery-report.json 中的视觉状态:

  • 每个片段的 visual_status 必须更新为 passed。
  • subtitle_status 必须为 passed。
  • cover_landscape_status 必须为 passed。
  • cover_portrait_status 必须为 passed。

失败时只重跑受影响阶段。例如封面失败只重做封面和报告,不重跑口播稿、TTS 和整段视频。

Comments

Popular posts from this blog

How to turn off Sass warning prompts in Nuxt.js projects

Configuring SSH Access to a Docker Container via an Alternative Port

Quickly Set Up a Cloud Database Using MongoDB Atlas