README.md

《说书人》MV 制作项目


一、成果

产物位置规格
MV v2(全水墨合成版)04-动态预览/说书人-MV-v2-全水墨.mp41920×1080 / 30fps / 173s / 82MB / 含音轨
合成镜头 12 张06-合成镜头/2560×1440,人物×场景
水墨人物 10 张02-人物设定/2560×1440
水墨场景 13 张03-场景设定/2560×1440
音源 + 逐句时间轴05-音频/WAV 48kHz + 实测时间码
提示词 42 个prompts/可完整复现

访问地址


二、视觉方案演进(重要)

版本人物场景结论
v1电影级写实国风水墨❌ 写实人物与水墨场景割裂、出戏,已弃用
v2水墨水墨✅ 全片水墨统一,人物由 image2image 合成进场景

弃用的 10 张写实人物已移入 02-人物设定/_已弃用-写实版/(保留可对比,未删除)。


三、合成工序(本项目的关键手法)

单靠文生图拿不到「指定人物出现在指定场景」的画面。做法是用即梦 image2image: 上传 2 张参考图(参考图1 = 场景,参考图2 = 人物)+ 一段「把图2人物融入图1场景」的编辑提示词。

dreamina image2image \
  --images 03-场景设定/场景-路边茶楼-水墨.png \
  --images 02-人物设定/说书人-设定图-水墨.png \
  --prompt "$(cat prompts/合成-01-说书人×路边茶楼.txt)" \
  --ratio 16:9 --resolution_type 2k --model_version 5.0

关键提示词骨架(12 张共用,只换中间的动作描述):

把参考图2中的人物自然地融入参考图1的场景:〈动作与位置〉。严格保持参考图1的宣纸质感、 墨色晕染、留白构图与整体色调,人物同样以水墨线描与淡笔着色表现,与场景的光影氛围自然融合, 人物比例与场景透视协调,不能出现剪贴拼贴感或风格割裂。

12 个合成镜头:说书人×路边茶楼 / 说书人×戏台 / 天山女子×枯城 / 昆仑痴儿×雪山 / 侠女×桃花林 / 游子×酒剑随马 / 判官×戏台 / 看客×路边茶楼 / 天山女子×桃花林 / 游子×街市吆喝 / 侠女×楼阁夜 / 说书人×江山风雨

效果:模型不仅融合了人物,还会自动补出合理道具(说书人脚下多出说书台、看客身旁多出茶桌), 大幅提升画面完整度。风格统一性实测良好,无剪贴感。


四、时间轴怎么来的

音源总长 177.66s,但音乐实际在 2:52.85 结束,之后是静音尾巴。逐句时间码通过两法互证:

  1. 画面字幕法(主):该翻唱视频画面上带书法体歌词字幕。按 fps=1/1.5 抽 118 帧 → 做成带时间码的 4×4 对照表 → 直接读字幕,得到每句起止(误差 ≤1.5s)。
  2. 音频能量包络法(交叉验证):纯 Python(本机无 numpy/PIL,用 wave+array 手写) 按 50ms 窗口算 RMS,定位显著能量变化点 → 确认「前奏 0:00–0:09.25 弱起, 正片 0:09.25 进入,2:52.85 结束」。

完整逐句时间码:05-音频/时间轴-音源字幕实测.md

⚠️ 本翻唱版与原始歌词有出入:尾声副歌省略了 4 句(江山易老嘛 / 痴儿侠女 / 酒剑随马 / 白衣不见),从「谈笑一段」直接跳到「这江山风雨」。MV 按音源实际内容排镜。


五、MV v2 构成

复现:

cd ~/Downloads/dl-hub/52-说书人MV/04-动态预览
python3 build_mv.py            # 完整成片
python3 build_mv.py --preview  # 只渲前 3 镜自检

六、踩坑与修复(重要)

  1. 🔴 JSON 解析正则错误(影响最大,已修) 即梦 CLI 把日志与结果 JSON 混在 stdout,而 SLOW SQL 日志行里也含有 { (commerce_info="{...}")。原先用贪婪正则 0.*1 会从日志里的 { 开始匹配 → 解析必然失败 → 触发兜底逻辑 → 频繁误取上一条任务。 修复:改为 t.rfind("\n{\n"),从「行首单独一个 {」开始的最后一段解析。 修复后第 4 轮(6 人物 + 12 合成)零重试、零兜底。
  2. 🔴 兜底串图事故(已修 + 有护栏) 提交阶段网络超时(context deadline exceeded)时,原兜底会取 list_task 最新任务; 若本次根本没提交成功,就会把上一条的图当成本次产物——实测导致 天山女子-写实 与 说书人-写实 md5 完全相同。 护栏:提交前记录 PREV_SID → 失败先重试 3 次 → 仍失败才兜底,且兜底值必须 ≠ PREV_SID。 已实证生效:场景-城中楼阁-夜 提交失败被正确拒绝(而非复制上一张)。
  3. 本地任务库是共享的:list_task 会混入别的会话提交的任务(曾见 1728×2304 竖版,非本项目)。 兜底必须带 PREV_SID 护栏。
  4. ffmpeg 三个坑:drawtext 的 text='0:01.5' 冒号会被当选项分隔符截断(须写 0\:01.5); xstack 的 layout 行高必须累加(h0+h1),只写 h0 会行重叠; -frames:v 1 必须放在输出文件之前。
  5. get_history_by_ids failed: ret=1015:轮询报错但任务已提交、积分照扣。切勿重复提交。
  6. 环境限制:本机无 tesseract/numpy/PIL/ImageMagick,只有 ffmpeg。 OCR 靠多模态读图,图像合成与对照表全用 ffmpeg filter 完成。

七、版权与署名

本片为粉丝向非商用同人作品。音源来自 B站 UP 主「咻咻满」的翻唱(BV1aw326mE3x), 原词曲版权归 古道背棺人 / 暗杠 / 寅子 所有。对外发布请保留片尾署名并注明非商用。


八、下一步可选项

下载此文件