Просмотр исходного кода

docs: 新增 HANDOFF.md 项目交接文档(下次可直接接手)+ 入库端到端验证日志

- HANDOFF.md:现状/3条接手命令/目录结构/能力矩阵/真跑证据/凭据/下一步5项功能/7个已知坑/权威核验值
- out/verify-fullrun.log:10-13 端到端验证日志(.gitignore 已放行 out/verify-*.log)
- 项目状态:已挂起(用户指示暂停运行)
FmodeAgent 20 часов назад
Родитель
Сommit
25fa48786b
2 измененных файлов с 220 добавлено и 0 удалено
  1. 141 0
      HANDOFF.md
  2. 79 0
      out/verify-fullrun.log

+ 141 - 0
HANDOFF.md

@@ -0,0 +1,141 @@
+# HANDOFF.md — skill-mv 项目交接(下次直接接手)
+
+> 更新:2026-10-14 · 版本 v0.2.0 · 状态:**已挂起(用户指示暂停运行)**
+> 用途:任何数字生命 / 协作者克隆本仓后,按本文即可**零上下文接手,直接做下一步功能**。
+
+---
+
+## 一、一句话现状
+
+纯 AI 视频技能已能从「一句主题」跑到「成片」,**即梦(火山引擎)真实通道已打通**(文生图 / 图生图 / 图生视频 / 动作模仿 / 数字人)。
+两条产线(A 音乐 MV / B 口播短视频)**端到端已跑通**;**AI 音乐 / TTS 两个网关通道未开通**,走「诚实降级 + 可插拔 provider」。
+
+---
+
+## 二、快速接手(3 条命令)
+
+```bash
+git clone https://git.fmode.cn/fmode-13177980648/skill-mv.git
+cd skill-mv
+node bin/fmode-mv.js doctor        # 环境自检:node / ffmpeg / 凭据 / 各通道
+node bin/fmode-mv.js providers     # 能力现状表(--deep 做真实探活)
+node bin/fmode-mv.js --help        # 全部命令
+```
+
+- **零依赖**:纯 ESM,`dependencies: 0`;只要 `node >= 18` + `ffmpeg`。
+- **凭据**:走环境变量 / `fmode-identity.json`,**仓内零硬编码**(见第六节)。
+- 只读诊断命令**不花钱**:`doctor` / `providers` / `version`。
+
+---
+
+## 三、目录结构
+
+```
+bin/fmode-mv.js         CLI 入口(song / talk / 各分步命令 / jimeng / doctor / providers / version)
+lib/                    核心库
+  api.mjs               网关调用(chat/image 等)
+  jimeng.mjs            即梦通道(文生图/图生图/图生视频/超清/动作模仿/数字人三步)★核心
+  providers.mjs         可插拔 provider + 能力现状 + ProviderUnavailableError
+  prompts.mjs           作曲填词/分镜/口播稿 的 prompt 模板
+  ffmpeg.mjs            剪辑/混音/字幕/响度归一化
+  sharpness.mjs         图片清晰度择优
+  doctor.mjs            环境自检
+scripts/                各分步实现(lyrics/storyboard/character-sheet/scene/video/music/tts/lipsync/assemble…)
+  pipeline-a.mjs        产线A 端到端编排
+  pipeline-b.mjs        产线B 端到端编排
+references/             方法论文档(capability-matrix / jimeng-api / pipeline-a|b / voc-sop / narrative-playbook …)
+templates/              prompt 模板
+assets/                 真跑样例资产(人物四视图/场景/关键帧/视频成片),供直观核验
+out/                    产物与真跑验证日志(*.log / REPORT-*.md 入库,大文件不入库)
+```
+
+---
+
+## 四、能力矩阵(实测,非推测)
+
+| 通道 | 状态 | 说明 |
+|---|---|---|
+| chat(作曲填词/分镜/口播稿) | ✅ 可用 | 走网关 chat |
+| image(文生图) | ✅ 可用 | `gpt-image-2.5-sunburst` |
+| **即梦 jimeng** | ✅ **可用** | 文生图 / 图生图 / 图生视频 V3 720p **¥0.28/秒** / 超清 / 动作模仿 / 数字人 |
+| 剪辑合成 | ✅ 可用 | 本地 ffmpeg(拼接/混音/字幕/卡点/响度归一化 I=-14 LUFS) |
+| AI 音乐 | ❌ 未开通 | `/suno/*` 实测 503;可 `--music your-song.mp3` 自备 |
+| 图生视频(旧网关) | ❌ 未开通 | `/v1/video/generations` 503;**已改即梦** |
+| 唇形驱动 | ❌ 无路由 | **可用即梦数字人 `getOmniHuman` 替代**(代码已实现三步流水线) |
+| TTS 口播配音 | ❌ 未开通 | 网关无 `/v1/audio/speech`;本容器 edge-tts 实测 403 |
+
+**降级承诺**:未开通通道一律抛 `ProviderUnavailableError`(退出码 3)+ 可操作指引;图生视频不可用时自动降级「关键帧 + Ken Burns」,产物名带 `.fallback`。**绝不静默失败、绝不伪造产物。**
+
+---
+
+## 五、真跑证据(v0.2 实测,可复核)
+
+| 项 | 值 |
+|---|---|
+| 定妆照(3 候选择优) | ¥0.60 |
+| 图生视频(即梦 1 镜) | ¥1.41 |
+| 场景图(无人) | ¥0.20 |
+| 关键帧(有人) | ¥0.22 |
+| **产线A 单次真跑合计** | **≈ ¥2.43** |
+| 成片 | `assets/video/mv-final.mp4`(1280×720 / 18s / H.264 含烧字幕) |
+| 即梦单镜 | `assets/video/shot-01-jimeng.mp4`(832×1120 / 5.04s) |
+
+验证日志全部入库:`out/verify-pipeline-a.log`、`out/verify-pipeline-b.log`、`out/verify-character-sheet.log`、`out/verify-scene.log`、`out/verify-video.log`、`out/verify-providers.log`。
+
+---
+
+## 六、环境与凭据(零硬编码)
+
+| 变量 | 用途 |
+|---|---|
+| `FEME_API_KEY` | 网关 API key(chat/image 等) |
+| `FEME_API_ENDPOINT` | 网关地址(默认 `https://api.fmode.cn`) |
+| `FEME_SESSION_TOKEN` | 即梦通道鉴权(`/api/volcengine/jimeng/*`) |
+| `FEME_USERID` | 个人空间 userid(S3 发布路径) |
+| `FEME_TTS_ENDPOINT` | 可选:外部 TTS 服务 |
+| `--music <file>` / `--voice <file>` | 自备音频绕过未开通通道 |
+
+也可放 `fmode-identity.json`(**已 .gitignore,绝不入库**)。
+
+---
+
+## 七、下一步可直接接手的功能(按优先级)
+
+> 均为**增量**,不影响现有链路;建议仍按「先出工作内容要求+产出要求 → 派 FmodeCode 执行」推进。
+
+1. **【最高价值】AI 音乐通道替代**
+   - 现状:`/suno/*` 503。方向:① 申请开通该通道;② 对接外部音乐生成 API(可插拔 provider 已就绪);③ 走即梦音频能力。
+   - 落地:新增 `lib/providers/music-<x>.mjs` + 在 `providers.mjs` 注册,`--music` 保留自备兜底。
+
+2. **【最高价值】TTS 口播配音**
+   - 现状:网关无路由 + edge-tts 在部分云环境 403。
+   - 方向:① `FEME_TTS_ENDPOINT` 对接外部 TTS;② 容器内装本地 TTS(如 piper/sherpa);③ 复用即梦数字人自带配音。
+   - 落地:`scripts/tts.mjs` 加 provider 分支,未配置时保持 `unavailable`。
+
+3. **口腔/唇形**:把 `scripts/lipsync.mjs` 从「未开通」接到**即梦数字人 `getOmniHuman` 三步**(`lib/jimeng.mjs` 已实现 ohIdentify/ohDetect/omniHuman,只需在产线B 编排里串起来)。
+
+4. **产线A 音乐一键替换人声轨**(老板级需求「产线B:把歌曲人声轨换成口播音频 + 人物讲解 + 场景切换」):写 `scripts/voice-swap.mjs`,用音频对齐 + ffmpeg 混音。
+
+5. **多镜批量 + 成本护栏**:`--limit` / `--budget` 参数,超过预算即停并报告(当前已能单镜试跑)。
+
+---
+
+## 八、已知问题 / 坑(接手必读)
+
+1. **即梦「图片生成 4.0」多图参考合成关键帧**报 `height or width invalid`(¥0,非扣费失败)
+   → 现为**单图参考降级**,已如实标注,未伪造。修法:核对 4.0 尺寸约束或拆分为两次单图调用。
+2. **`.png` 命名瑕疵**:定妆照/场景图部分实为 JPEG 内容而命名 `.png`(工具链小 bug,不影响使用)。
+   → 修法:写图时按 `file` 实际类型定扩展名(`lib/jimeng.mjs` 落盘处)。
+3. **重跑会复用缓存**:`out/character/*`、`work/scene/*`、`work/clips/*` 存在时默认跳过(显示「已存在,跳过」,花费 ¥0.00)——**要真重跑加 `--force`**。若日志显示「成功 0 / ¥0.00」而你以为在真跑,就是命中了缓存,不是 bug。
+4. **`out/` 大文件不入库**(.gitignore:`out/*`,仅放行 `REPORT-*.md` / `verify-*.log` / `git-push.log`)。
+5. **仓库当前为公开**(`fmode-13177980648/skill-mv`,含人像资产)。若需私有化:改私有或迁到 `skill-wangyong`。
+6. **对象存储 key 大小写敏感**:`IGzPRXKpzm` 小写化即 404;发布 key 必须 ASCII(中文 key 被云函数静默拒)。
+7. **CDN 缓存**:同名 key 覆盖后裸链 30 天内回旧内容,须带 `?t=` 或换新 key。
+
+---
+
+## 九、权威核验值(拉取前后对账)
+
+- 远程 `master` = `4929359` · 本地 HEAD = `4929359` · 工作区干净(提交后三者一致)
+- 仓地址:`https://git.fmode.cn/fmode-13177980648/skill-mv`(公开)
+- 资产目录:`https://git.fmode.cn/fmode-13177980648/skill-mv/tree/master/assets`

+ 79 - 0
out/verify-fullrun.log

@@ -0,0 +1,79 @@
+
+▶ [1/8] 作曲填词
+  ✓ 《凌晨两点的热咖啡》(城市流行 City Pop / 92BPM)
+
+▶ [2/8] 分镜脚本
+  ✓ 2 个镜头,总时长 12s
+
+▶ [3/8] AI 音乐生成
+  ! 按参数跳过
+
+▶ [4/8] 人声 / 伴奏分离
+  ! 无音乐文件,跳过
+
+▶ [4.5/8] 人物资产多视图(即梦)
+  ! 未能从描述里识别出服装 → 沿用兜底「白色T恤 + 波点半身裙」
+  建议在 --desc 里明确写「身穿…」,例如:--desc "25岁东亚女性,身穿米色针织衫和长裤"
+
+▶ 人物资产 · 1-定妆照(text2img,1728×2304,3 张候选)
+  /opt/data/workspace/skill-mv/out/character/1-定妆照.png 已存在,跳过(--force 重跑)
+
+▶ 人物资产 · 2-上半身(img2img,1728×2304,2 张候选)
+  /opt/data/workspace/skill-mv/out/character/2-上半身.png 已存在,跳过(--force 重跑)
+
+▶ 人物资产 · 3-全身(img2img,1440×2560,2 张候选)
+  /opt/data/workspace/skill-mv/out/character/3-全身.png 已存在,跳过(--force 重跑)
+
+▶ 人物资产 · 4-多视图(img2img,1440×2560,2 张候选)
+  /opt/data/workspace/skill-mv/out/character/4-多视图.png 已存在,跳过(--force 重跑)
+  ✓ 完成 4 步,花费 ¥0.00
+
+▶ [5/8] 场景图(无人)→ 关键帧(有人)
+  [shot-01] 场景图已存在,跳过
+  [shot-01] 关键帧已存在,跳过
+  ✓ 成功 0,失败 0,花费 ¥0.00
+
+▶ [6/8] 图生视频(即梦)
+  即梦通道就绪(鉴权通过,代理存活(探活不产生费用)),分辨率 720p ¥0.28/秒
+
+  费用预估:1 镜 × 平均 6.0s = 6.0s × ¥0.28/秒 ≈ ¥1.68
+  (即梦接口只接受 121~241 帧,即 5~10 秒/镜;单镜时长会就近吸附)
+
+  [shot-01] 已存在,跳过(--force 覆盖)
+  ✓ 即梦真通道:0 段,花费 ¥0.00
+
+▶ [7/8] 唇形驱动
+  分镜里没有标记唇形的镜头,跳过
+
+▶ [8/8] 剪辑合成
+
+▶ 合成成片(1 段)
+  ✓ 画面轨:/opt/data/workspace/skill-mv/work/video-only.mp4(5.0s,832x1120,2.3MB)
+  ✓ 字幕:/opt/data/workspace/skill-mv/work/subtitles.srt(2 条)
+  ! 未提供任何音轨(--music / --voice / --bgm),成片将无声音
+  ✓ 字幕已烧入画面
+  ✓ 响度归一化完成(I=-14 LUFS)
+
+▶ 成片
+  文件             out/mv-final-v0.2.0.mp4
+  时长             5.0s
+  分辨率            832x1120 @ 24fps
+  大小             895KB
+
+════════════════════════════════════════════════════════════════
+  产线A · AI 单曲 MV · 执行报告
+════════════════════════════════════════════════════════════════
+  ✅ 作曲填词     《凌晨两点的热咖啡》
+  ✅ 分镜脚本     2 镜 / 12s
+  ⏭️  AI 音乐    --skip-music
+  ⏭️  音轨分离     无音乐文件
+  ♻️  人物资产     4 步,¥0.00 → /opt/data/workspace/skill-mv/out/character/4-多视图.png
+  ✅ 场景图+关键帧  成功 0 / 失败 0 / 花费 ¥0.00
+  ✅ 图生视频     即梦真通道:0 段,花费 ¥0.00
+  ·  唇形驱动     分镜中无 lipSync:true 镜头
+  ✅ 剪辑合成     5.0s / 895KB
+────────────────────────────────────────────────────────────────
+  成片: out/mv-final-v0.2.0.mp4
+
+════════════════════════════════════════════════════════════════
+