1仕組みと動作原理
成果物は「Webページに偽装した録画可能な動画」:Vite + React + TSプロジェクトと章ごとに分割された音声で構成され、HTML検証通過後にデフォルトでナレーション音声を直接合成します。
把一篇文章或口播稿,一步步做成可录屏的"伪装成网页的视频",HTML 验证完成后默认直接合成口播音频。产出物 = Vite + React + TS 项目 + 按章节切分的音频。
narrations.tsをステップ数および音声合成の唯一の信頼できる情報源(Single Source of Truth)とし、章コード内の最大ステップ値 + 1がnarrations.lengthと完全に一致することを必須とします。
> **关键**:`narrations.ts` 是 step 数和音频合成的**唯一真相源**。
3つの成果物(script.md / outline.md / 単一章の実装)を対象とする厳格な自己点検プロトコルを適用し、不合格項目を修正してから報告することを義務付けます。
下面三个产出,每一个**完成后必须走自检 → 修复 → 再汇报 / 推进**:
outlineにはアニメーションの詳細を意図的に記載しません。アニメーションを固定化すると章実装エージェントが機械的翻訳に陥るため、余白を残すことで本物の動画らしい表現を生み出します。
> **outline 不写动画的理由**:写死动画 = chapter agent 退化为翻译机;
Checkpoint Planを必須ゲートとし、原稿・outline・素材・開発モードの4点を一括で整合確認します。テーマのデフォルトはd2-editorial-gridです。
## Checkpoint Plan —— 4 件事一次对齐(**硬节点**)
第1章はメインスレッドでの実装とユーザー検収を必須とします。選択したテーマ/題材におけるCHAPTER-CRAFT指針の初回適用例となり、後続章のコードスタイルの基準となります。
**第 1 章无论哪种模式都必须主线程做完 + 用户验收**(强制 anchor)。
Phase 3では音声合成の要否を確認せずデフォルトで実行します。全HTMLの完了および検証通過後、直ちに音声合成へ移行し、4つの例外時(不要の指示、認証情報不足、ローカルTTSへの変更など)のみ停止します。
**默认不要停下来问是否合成音频**。Phase 2 全部 HTML 已完成且验证通过后, agent 直接进入本阶段。
デフォルトのTTS設定はVolcengine/Doubao向けに固定されています:engine=volcengine、seed-tts-2.0、voice_type zh_male_liufei_uranus_bigtts、speed 1.2、speech_rate 20。
engine=volcengine resource_id=seed-tts-2.0 voice_type=zh_male_liufei_uranus_bigtts voice_name=刘飞 2.0 speed=1.2 speech_rate=20
Phase 4の画面録画はデフォルトでCDP自動録画を採用し、本ワークフローでのscreencliの使用は明確に禁止します(AIエージェントが起動しトークンを消費するため)。
默认不要用 screencli 做本流程:它会启动 AI agent、消耗 tokens
視覚表現には10項目のワンフレーズ原則をインデックスとして定めています(16:9固定ステージ、グローバルステップカウンター、ステップごとの全画面占有、ナレーションの拍=ステップ、内容駆動型アニメーション、段階的開示、デュアルソース原則など)。
| 10 | 双源原则 | script 定节拍,**article 定画面密度**(落到信息池) |
2コア機能
3外部依存関係
| Kind | Dependency / Endpoint |
|---|---|
| cli | npm / Vite 脚手架与依赖安装(npm create vite、npm install、npm install --save-dev tsx puppeteer-core、npx tsc --noEmit) |
| api | 火山/豆包语音合成(默认引擎;鉴权仅从环境变量读,curl 调 unidirectional 接口) |
| api | MiniMax CLI(可选 TTS 路径,走 mmx auth login --api-key;key 在平台获取) |
| cli | MeloTTS 本地路径(可选:调 ../../.venv-tts/bin/melotts 生成 wav 再用 ffmpeg 转 mp3) |
| package | puppeteer-core + 本机 Chrome(CDP 录屏与字幕烧录;headless 启动参数不含任何反自动化绕过) |
| network | Google Fonts(主题 CSS 引用,浏览器端/录屏期拉取)与本地 dev server 端口 |
4推奨統制措置と判定根拠
- scripts/: ローカルスクリプトまたはコマンドの実行: bash scripts/scaffold.sh <target> [--theme=…] (npm create vite + npm install)
- scripts/ 或 SKILL.md: 外部言語パッケージ依存関係の動的インストール宣言
- 网络端点: 外部ネットワークアクセスの宣言: https://openspeech.bytedance.com/api/v3/tts/unidirectional (デフォルトのVolcengine/Doubao TTS、POST)
- 本地工作目录: ファイルの読み書きおよび成果物の出力: 生成される presentation/ プロジェクト(Vite + React + TS フルソースコード、package.json、vite.config.ts、tsc)
5二重目の独立検証
- [ok] TTS 凭证读取与外发是否真实(橙档关键证据) — synthesize-audio.sh 原文:'# 2. DOUBAO_TTS_API_KEY or VOLCENGINE_TTS_API_KEY for default Volcengine/Doubao TTS';'DEFAULT_VOLCENGINE_ENV_FILE="$HOME/.config/doubao-tts/env"';缺失时 source 该文件;取到后作为鉴权头 curl 到 https://openspeech.bytedance.com/api/v3/tts/unidirectional。调用点与降级说明(AUDIO.md 的「缺少 API Key 时不要假装合成成功」)一致。
- [ok] 是否存在反自动化绕过或安全降级(红档排除) — record-cdp-screencast.mjs 的 puppeteer.launch 只有 headless: true 与 args=[--autoplay-policy=no-user-gesture-required, --hide-scrollbars, --window-size=…],无 AutomationControlled、无 remote-allow-origins=*、无 webdriver 伪装;全目录 grep --no-verify / --sandbox / dangerouslyDisableSandbox 零命中。CDP 只连本机回环页面(默认 http://127.0.0.1:5175/?auto=1&record=1&autostart=1)。
- [discrepancy] 「默认不停下问」会不会导致未经同意的付费合成 — [判定:设计取舍,非缺陷]SKILL.md 明写 '**默认不要停下来问是否合成音频**。Phase 2 全部 HTML 已完成且验证通过后,agent 直接进入本阶段。',并列出四种收口例外(用户说不要/鉴权缺失/换本地 TTS)。即:默认路径会消耗 TTS 账号额度且不再二次确认——属有意的流程设计(音频是一镜到底前提),但使用者应在开始前知情并配好额度与凭证。
- [ok] 脚手架是否真的安装 puppeteer-core(录屏能力来源) — scripts/scaffold.sh 内含 `npm install >/dev/null 2>&1` 与 `npm install --save-dev tsx puppeteer-core >/dev/null 2>&1`,随后跑 `npx tsc --noEmit` 自检;即录屏/字幕脚本的依赖由脚手架负责安装,而非假定全局存在。
- [unlocatable] 并行章节开发(模式 C)带来的风格与质量分散 — 文档声称主题 token 兜底、章节 CSS 物理隔离、风格不一致等于「人手写视频的呼吸感」;但 pin 仓库内没有多章并行产出的成品或验收记录可用于验证该主张,本次只读侦查不运行生成,故仅作「文档声明」记录,不当作已核事实。
- [ok] 「?auto=1 一镜到底」的机制描述是否与代码一致 — AUDIO.md 与 build-master-audio.mjs 的描述一致:分段合成后拼成 master.mp3 + timeline.json,运行时 Auto 模式优先播 master 音轨并按 timeline 驱动 HTML 节点;RECORDING.md 的 CDP 路径以 --audio=<normalized master> 复用同一条母版,避免分段交接造成尾字截断。
6結論
6c6b9cedf0142114…