← 返回列表
需源码安装
二次元 MV 工坊 · 2D 运镜限制 · 一张图,一首歌,万千世界。
暂不能直接安装(需源码编译或环境不满足):仓库缺少 package.json,无法用 dsh 插件安装命令安装。 · 最近上游提交 2026/9/18 · 已提供中文文档
一个 DeepSeek Harness 智能体技能,可将一张角色图片和一首歌曲转化为适用于 MiniMax H3 的完整提示词包,生成一段 14.5 秒的动漫舞蹈音乐视频,镜头始终平贴在纸面上,舞蹈动作设计为可重复循环,直到你自己也能跳出来。
综合分
31.3
GitHub 分
31.3
用户评分
—
★ Stars
2
周下载量
—
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add YanKaFei/2d-limited-mv-studio仓库缺少 package.json,无法用 dsh 插件安装命令安装,改用 GitHub 源安装
信任档位:已验证本站已于 3 天前真实安装成功(L4 · 真实安装)
- 是什么
- dsh 原生插件 · vision
- 装得上吗
- 本站已真实安装成功(L4 · 真实安装,非静态推断)
- 安全吗
- 本站尚未对该插件做风险分级(暂未覆盖,不等同于无风险)
- 还在维护吗
- 活跃:最近一次提交在 7 天前
档位由下列信号合成:本站实装验证(真实安装,当前最高到 L4)· 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。下方各区块是它的证据明细。 验证判据与等级说明 →
🟢实装验证通过· 2026/9/23
由本站实装验证器在真实 dsh 环境安装成功,非静态推断。
数据截至 2026/9/20(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
安装兼容性检查需源码安装
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✗npm 包2d-limited-mv-studio(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✗入口文件缺少入口声明
仓库缺少 package.json,无法用 dsh 插件安装命令安装
验证方式:npm registry 存在性 + package.json 静态校验 · 最后验证 2026/9/20 15:19:32
用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动
README
由 DeepSeek 最新模型翻译生成2d-limited-mv-studio 二次元 MV 工坊 · 2D 运镜限制 · 一张图,一首歌,万千世界。 限制就是风格。 限制就是风格。 世界不断变异,角色始终稳定。 世界不断变异,角色始终稳定。 使用 DeepSeek Harness 构建 DSH Skill 目标 最佳运行于 测试 依赖 运镜 English · 中文 · 快速开始 · 平台 · 结局 一条 MV 不是一串好看的画面。 它是一具拒绝停下来的身体:周围的世界被反复 重画——印刷、撕开、刻蚀、溶解、错版——而到最后一帧,它仍然明确地 是同一个人。 一条 MV 不是一串好看的画面。它是一具拒绝停下来的身体:周围的世界被反复重画—— 印刷、撕开、刻蚀、溶解、错版——而到最后一帧,她仍然明确地是同一个人。 一键生成二次元人物 MV 音乐动画。 给它一张人物图和一首歌,它交回一整套经过机器校验的 MiniMax H3 提示词包:音乐按 14.5 秒切分,人物穿越多种艺术流派,歌词里的实物落进背景, 运镜只用 H3 官方词表,并且每一段都用上一段的真实尾帧续接。 一键生成二次元人物 MV 音乐动画。 给它一张人物图和一首歌,它交回一整套经过机器校验的 MiniMax H3 提示词包:音乐按 14.5 秒切分,人物穿越多种艺术流派,歌词里的实物落进背景, 运镜只用 H3 官方词表,并且每一段都用上一段的真实尾帧续接。 English 为什么是 14.5 秒 H3 的 duration 参数只接受 整数,范围在 4 到 15 秒之间——而它的帧网格 (17k+5)意味着请求 15 秒实际上会交付 362 帧 ≈ 15.083 秒。 所以这两个数字被刻意分开: | | 数值 | 原因 | |---|---|---| | 音乐切分 | 14.5 秒,对齐到最近的节拍线 | 符合音乐性,也是用户的单位 | | H3 request | 15 | 最小的合法整数,其实际交付长度仍能覆盖音乐 | | 实际交付 | 15.083 秒 | 已根据真实 H3 输出验证 | | 可用 | 14.5 秒 | 剩余的 0.58 秒是接缝重叠——把衔接藏在最快的动作里 | 天真的向上取整会悄悄截断音乐(请求 6 秒只会交付 5.875 秒)。 2d-limited-mv-studio 会选择实际交付长度仍能覆盖音频的最小整数。 六段式提示词 每个提示词都使用一种固定结构,顺序如下: 人物与参考保持一致性: 参考角色 + 完整角色设定 + 漂移禁止项 风格提示词: 2D · limited animation · hand-drawn · flat composition + this segment's movement 内容提示词: the continuity clause, then shot by shot integrated_multimodal_description: how reference, lyrics, music, dance and edit co-operate overall_soundscape: ambience and the physical sounds of the body non_diegetic_music: N/A N/A 不是省略。你已经上传了这首歌。 这里没有任何内容要求模型去作曲—— 这也避开了官方那种「一边要求音乐、一边禁止音乐」的失败模式。 摄影机永不离开纸面 这不是一台碰巧对着画作的实拍摄影机。它是一台架在一叠纸上的摄影机,而这正是关键所在。 摄影机可以做什么,是被刻意限定的: - 不做 3D 运镜。 不绕空间轨道运动,不无人机上升,不飞越,不穿越透视。 深度来自图层——前景纸、人物赛璐珞、背景插画、图形叠加——绝不来自移动的视点。 - 运动在 2D 中被写就。 摄影台推移在画面上平移,透视零变化。赛璐珞滑动让背景纹丝不动, 而人物在动。多层视差通过速度分离图层——这是 2D 唯一诚实的「景深」。 - limited animation 是质感本身。 定格帧、on twos、stepped motion、 pose-to-pose、smear drawing。丝滑不是目标;一张表现得像一张画的画才是。 - 错版是语言,不是事故。 色层错开几个像素,正是本技能表达身份松动了的方式。 运动词汇被压在 H3 的 20 个官方术语之内,正是这个原因——更大的词汇表会诱使摄影机离开纸面。 被丰富的是摄影机在看什么:角度、构图、焦、以及这一下要揭示什么。 我们拿来衡量自己的那条标准:如果把所有 3D 运镜全拿掉,这条片子还立得住吗? 立不住,那它本来就不是一条 2D 片。 摄影机永不离开纸面——运镜限制感 这不是一台「碰巧对着画的实拍摄影机」,而是一台架在纸堆上的摄影机——这才是重点。 摄影机被允许做什么,是被刻意限死的: - 不做 3D 运镜。 不绕空间、不无人机上升、不飞越、不穿越透视。 深度只来自图层:前景纸 + 人物赛璐珞 + 背景插画 + 图形叠加,绝不来自移动的视点。 - 运动在 2D 里被写出来。 摄影台推移是画面平移、透视完全不变; 赛璐璐滑动是背景纹丝不动、只有人在动;多层视差靠图层速度差—— 这是 2D 唯一诚实的那种「景深」。 - limited animation 是质感本身。 定格、on twos、stepped motion、pose-to-pose、 smear drawing。不追求丝滑——追求的是「一张画在该有的样子里动」。 - 错版是语言,不是事故。 色层错开几个像素,是本技能说「身份松动了」的方式。 运动词被压在 H3 官方那 20 个里,正是这个原因——词表一大,摄影机就想离开纸面。 于是我们丰富的是摄影机在看什么:角度、构图、焦、以及这一下要揭示什么。 我们拿来衡量自己的那条标准:如果把所有 3D 运镜全拿掉,这条片子还立得住吗? 立不住,那它本来就不是一条 2D 片。 摄影机:六个图层,一套词汇 H3 恰好识别 20 个运镜词——仅此而已。所以「更丰富的运镜」不可能来自发明新词; crane shot 和 whip pan 根本不会被读取。丰富来自分层: 镜头大小 → 角度 → 构图 → 对焦 → 官方运动词 → 主体–相机关系 → 它揭示了什么 | 层级 | 数量 | 示例 | |---|---|---| | 镜头大小 | 10 | 极远景 → 极特写 | | 角度 | 12 | 低角度 / 高角度 / 荷兰角 / 俯视 / 虫眼视角 / 过肩 / POV / 平面正面(2D 原生) | | 构图 | 12 | 三分法、对称、负空间、画中画、海报式布局 | | 对焦 | 4 | 深焦、浅焦、柔焦、变焦 | | 2D 原生运动 | 10 | 逐格摄影机、多层视差、赛璐璐滑动、定位偏移、纸擦、光圈、硬裁切重构、分屏、曝光闪烁、定格漂移 | | 关系 | 7 | 跟随 / 引领 / 匹配节奏 / 观察 / 揭示 / 对抗 / 环绕 | 缺失的层级从来不是运动——而是角度。 一个只有平移和推镜的库,正是相机显得单薄的原因。 三条规则,全部机器校验: 1. 固定镜头要有一行明确的锁定说明。 模型会漂移,尤其是在广角镜头上。每个 Static Shot 都要加上“相机在整个场景期间完全静止,只有主体产生运动。” 2. 每个运动镜头都必须写明它与主体的关系。 没有它,两种运动会各走各的时钟——表现为抖动,以及角色看起来像在滑行。 3. 丰富的相机工作不是相机展示 reel。 一个片段中最多一半的镜头可以运动; 其余锁定,能量由 2D 原生运动提供——锁定相机之下,一幅活着的画。 实拍术语用于思考;输出的一切都会映射回官方 20 个词 (crane_up → Pedestal Up、whip_pan → Pan Right + large + fast)。测试强制每个 映射目标都是真实的官方术语——该技能不会教你写出模型会忽略的词。来源与完整表格:references/camera-vocabulary.md。 运镜:六层,而不是一层(角度丰富,平面不变) H3 只认官方那 20 个运动词。所以「丰富运镜」不能靠编新词——crane shot、whip pan 模型根本不读。丰富化只能靠分层: 景别 → 角度 → 构图 → 焦 → 官方运动词 → 相机与主体的关系 → 这一下要揭示什么 原来缺的从来不是运动词,是角度层。 一个只有平移推拉的库,镜头当然是薄的。 三条硬规矩,全部机器校验:固定镜头必须再用自然语言加一次锁(模型在远景上会自己飘); 运动镜头必须写清与主体的关系(不写就抖动、人物像在飘); 运镜丰富 ≠ 运镜展览(每段运动镜头 ≤ 一半,其余靠 2D 专属招提供动感——机位锁死、画面在动)。 实拍术语只用于思考,输出前一律映射回官方词;测试强制每个映射目标都是真官方词。 词表与来源见 references/camera-vocabulary.md。 让舞蹈变得魔性(上瘾) 一支舞之所以令人难忘,不是因为它复杂,而是因为它被重复到你也能跳。所以运动层不是更长的词表——而是一套重复设计。 | 层级 | 字段 | 它决定什么 | |---|---|---| | 病毒式层级 | seg.motion.viral_level | 这个片段重复得有多狠——0 克制 → 3 洗脑 | | 重复安排 | seg.motion. | 运动单元长度、循环长度、重复次数、在哪里变异、哪个变体 | | 钩子 | plan.motion_design.hook_id | 影片的唯一标志性动作,每个副歌中都必须出现 | 魔性度逐段从音乐推导而来——而且越到结尾越升级,因为 魔性是先积攒、再引爆的东西。哪怕是一首能量平坦的曲子,你也会得到 主歌克制 → 副歌抓耳 → 结尾洗脑。 bash python3 scripts/mvstudio.py motion # 菜单 + 当前设计 python3 scripts/mvstudio.py motion --hook shoulder_pop_8 python3 scripts/mvstudio.py motion --viral 3 # 整部片子拉到洗脑 python3 scripts/mvstudio.py motion --segment C2 --viral 0 # 某一段保持克制 八种记忆点动作,每一种都为不同风味的成瘾性而设计:身体纹丝不动、只有脑袋在点的 点头;八次抖肩,计数本身就是笑点;每次停顿越来越久的跺脚;挤压拉伸的蹲弹, 这是通往惹人喜爱的笨拙感的最快路径;一个半转,三次都差一点停住,然后超额兑现。 五种重复变体——递增强调、双倍速、半速、错位半拍卡农,以及 砍掉最后一次(你一直在哼的那个记忆点做到一半就停了)。铁律: 变异是同一个动作的变奏;它绝不替换动作。 替换了动作,记忆就断了。 循环表由拍网格驱动,而不是靠猜一个「重复 4 次」——这与所有已发表的 音乐条件舞蹈生成模型共享同一个前提。我们取原理,不取任何 依赖;管线依然是零依赖。 让舞蹈「魔性」起来 一支舞之所以洗脑,不是因为编舞复杂,恰恰是因为它简单到你能跟着做,然后做了八遍。 所以动作层的核心不是更长的词表,而是重复的设计。 魔性度逐段从音乐推,而且往后递增——魔性是攒起来再爆的。哪怕整首歌能量平坦, 你也会得到 主歌克制 → 副歌魔性 → 结尾洗脑。 八种记忆点动作,各治一种「停不下来」:身体完全不动只有头在点的点头锁; 把计数本身变成笑点的抖肩八连;越停越久的跺脚停顿; 挤压拉伸最出「憨」的蹲弹;差一半三次然后超额兑现的半转重复。 五种重复变体——递增强调、双倍速、半速拖拍、错位半拍卡农,以及末次截断 (你正在哼的那个动作突然只做一半)。铁律:变异是同一个动作的变奏,绝不换动作。 换了动作,记忆点就断了。 循环表由拍网格驱动,不是拍脑袋写「重复 4 次」——这条前提和所有已发表的 音乐驱动舞蹈生成模型一致;我们只取原理,不取依赖,管线仍然零第三方依赖。 最后一个手势 一个站定的姿势是结束一部片子最偷懒的方式。最后一个手势才是观众会记住的东西。 2d-limited-mv-studio 提供八种可导演的结尾,依据音乐自身的结尾性格来排序: | id | 结尾 | 会发生什么 | |---|---|---| | jump_freeze | 跃起定格 | 完整起跳,在最高点定格,背景被抽离成一条偏移的轮廓线 | | reach_and_crack | 伸手裂屏 | 她把指尖戳进镜头;整个画面像玻璃一样裂开,白光透出 | | swipe_to_black | 手一滑黑屏卡点 | 手臂扫过镜头,画面在强拍上恰好切黑,留下一道残影 | | frame_drop_vanish | 逐帧抽掉 | 手臂先消失,然后是躯干,动作继续,直到只剩一条轮廓线 | | misregistration_exit | 印版退位 | 分层脱印:颜色 → 线条 → 只剩套准标记 | | spin_to_line | 旋转成线 | 旋转中途身体坍缩成一条竖线,然后向上被擦除 | | paper_tear_exit | Paper Tear Exit 纸撕离场 | 画面从中间撕裂;她从裂口处舞动离场 | | look_back_fade | Look Back, Fade 回望褪色 | 全片唯一的停顿——她回望,画面淡出为一张旧照片 | 每一个结尾都保留了身份。消失的是画,从来不是人。 末帧链接 C1 ──its last frame──▶ C2 ──its last frame──▶ C3 ──▶ C4 前一段的末帧成为下一段的首帧。 这是模型无法反驳的唯一连续性证据:它看到的是同一张图。 由此产生两条硬约束,其中一条是真正值得点明的设计张力: 1. 风格变化发生在片段内部。 链接的首帧会把前一段的美术风格一并带入。与其在“连贯”和“每段一种新风格”之间二选一,2d-limited-mv-studio 两者兼顾:0–1.5 s 保持前一段的绘画风格和姿态,然后世界在镜头内完成过渡。过渡本身成为一个事件,而非一次剪切。 2. 链接时不要改变姿态。 一份第三方实测报告(未经核实——见 references/platform-playbook.md)指出,当两个链接帧之间的垂直位移超过画面高度的 12 % 时,会出现肢体撕裂。我们采取保守立场。 帧捕获阶梯:ffmpeg → macOS AVFoundation(无需安装;已验证可在 15.034 s 处提取 2560×1440 的帧)→ 从平台时间线导出。 它绝不会把首帧冒充为末帧。 每一步都等你确认 bash python3 scripts/mvstudio.py confirm --status python3 scripts/mvstudio.py confirm --step canon --note "人设没问题" python3 scripts/mvstudio.py confirm --all 确认点写入 workspace/confirmations.json——可审计、可撤销: gate → analyze → lyrics → canon → threeview → styles → segments → prompt-01 … prompt-N 每一个提示词 → chain-01 … chain-N 每一段的输出和尾帧 → ending → render → validate → pack 只要有任何未确认项,render 和 pack 会拒绝继续(退出码 5),除非你传入 --unattended。(MiniMax Design 自己的上手评测把用户仅有的两个动作描述为 “确认,以及等”——确认,然后等待。节奏吻合。) 机器检查的内容 不是“看起来不错”——而是那些可以被断言的东西: segments = ceil(duration / 14.5), each ≤ 15 s, contiguous every camera word is in H3's official 20-term vocabulary every background lyric element is derivable from that segment's lyrics ≥ 3 distinct art movements across the film, never the same one twice in a row six sections present, in order, zero Markdown, ≤ 7000 chars per prompt no music-generation instruction anywhere the six render-critical canon fields are filled 中文 为什么是 14.5 秒 H3 的 duration 只接受 4–15 的整数;而它的帧网格(17k+5)意味着 请求 15 秒实际交付 362 帧 ≈ 15.083 秒。 所以两个数字被刻意分开: | | 值 | 为什么 | |---|---|---| | 音乐切点 | 14.5 秒,吸附到最近的小节线 | 音乐上干净,也是你要的单位 | | H3 duration | 15 | 「实出时长仍能盖住音乐」的最小合法整数 | | 实出 | 15.083 秒 | 已在真实 H3 产出上核对 | | 可用 | 14.5 秒 | 多出的 0.58 秒是接缝重叠量——把缝藏在最快的那一下动作里 | 单纯向上取整会悄悄截断音乐(请求 6 秒只交付 5.875 秒)。 2d-limited-mv-studio 取的是「实出时长仍能盖住音乐」的最小整数。 每条提示词的固定六段 text 人物与参考保持一致性: 参考素材职责 + 完整 Character Canon + 漂移禁令 风格提示词: 2D · limited animation · hand-drawn · flat composition + 本段画风 内容提示词: 延续上一帧的接续句,然后逐镜头写 integrated_multimodal_description: 参考 / 歌词 / 音乐 / 舞蹈 / 剪辑如何协同 overall_soundscape: 环境音与身体动作的物理声音 non_diegetic_music: N/A N/A 不是省略。你已经自己上传了原曲,这里没有任何一句要求模型作曲—— 这同时避开了官方列出的失败模式:一边要配乐、一边禁配乐。 最后一个手势 站定是最偷懒的收尾。观众记住的是最后一个动作。 2d-limited-mv-studio 提供 八种可直接写进提示词的收尾效果,并按音乐自己的收束性格排序 (见上方英文表格 / python3 scripts/mvstudio.py endings)。 每一种都不改变人物身份。消失的是「画」,不是「人」。 尾帧续接 C1 ──它的最后一帧──▶ C2 ──它的最后一帧──▶ C3 ──▶ C4 上一段的最后一帧成为下一段的第一帧。这是模型无法争辩的连续性证据—— 它看到的是同一张图。 随之而来两条硬约束,其中一条是值得点明的设计张力: 1. 画风转换发生在段内。 续接的首帧会把上一段的画风一起带进来。 我们没有在「接得上」和「每段换画风」之间二选一,而是两个都要: 0–1.5 秒保持上一帧的画风与姿势,之后世界在同一个镜头内转场。 转场本身变成了一个事件,而不是一次硬切。 2. 续接时不要换姿势。 一条第三方现场经验(未经官方证实,见 references/platform-playbook.md):首尾帧之间垂直位移超过画面高度 12% 容易肢体撕裂。我们取保守的一侧。 取帧降级:ffmpeg → macOS 自带 AVFoundation(无需安装;实测取出 2560×1440、位于 15.034 秒的精确尾帧)→ 平台时间轴导出。 绝不拿首帧冒充尾帧。 每一个步骤都等你确认 确认点落盘在 workspace/confirmations.json,可查、可撤销: gate → analyze → lyrics → canon → threeview → styles → segments → prompt-01 … prompt-N 每一条提示词 → chain-01 … chain-N 每一段的输出与尾帧 → ending → render → validate → pack 未确认时 render / pack 拒绝继续(exit 5),除非显式 --unattended。 机器校验的是这些 段数 = ceil(时长 / 14.5),每段 ≤15s,首尾相接 运镜全部落在 H3 官方 20 词表内 每个背景歌词元素都能从该段歌词推出 整片穿越 ≥3 种画风,且相邻两段不重复 六段齐全且有序,零 Markdown,每条 ≤7000 字符 全文没有任何生成音乐的要求 六个渲染关键 Canon 字段已填满 Quick start bash git clone ~/Desktop/2d-limited-mv-studio && cd ~/Desktop/2d-limited-mv-studio python3 scripts/mvstudio.py doctor # environment check python3 scripts/mvstudio.py all # deterministic pipeline python3 scripts/mvstudio.py endings # pick the last gesture python3 scripts/mvstudio.py confirm --all # confirm each step python3 scripts/mvstudio.py render # six-section package python3 scripts/mvstudio.py validate # must exit 0 python3 scripts/mvstudio.py pack --platform xiaoyunque Runs from any directory with --project . If the skill folder itself is read-only (shared install, sandboxed session), the CLI tells you exactly which command to run instead. Platforms Best on 小云雀 and MiniMax Design — this skill is tuned for their cut, first/last-frame and AI-edit features. Other platforms work too: anything that accepts an uploaded asset plus a per-segment prompt can run the package; with --platform generic you get a canvas-agnostic playbook instead of a platform-specific one. 最佳平台是 小云雀 与 MiniMax Design —— 本技能专门适配了它们的切割、首尾帧与 AI 剪辑能力。 其他平台同样可以挂载运行:任何支持「上传素材 + 逐条提示词」的画布都能跑, --platform generic 会给出与画布无关的通用操作单。 | | 小云雀 | MiniMax Design | |---|---|---| | cut | 智能分镜 / 时间轴切割 | AI 剪辑(自然语言)——实测「裁掉最后 2 秒」通过 | | first frame | 首尾帧模式 | 尾帧作为首帧参考;或 3D 导演台先摆姿势 | | identity lock | 角色库 / 局部重改 | 资产中心(人物锚) | | rhythm | 逐条提交 | Agent 先反问确认再动手 | 分工是:音乐由本技能切,画面由平台裁。 完整落地手册、各自的坑、以及每条结论的来源与 可信度,见 references/platform-playbook.md。 分工是:音乐由本技能切,画面由平台裁。 完整落地手册、各自的坑、以及每条结论的来源与 可信度,见 references/platform-playbook.md。 安装 bash bash install-to-dsh.sh ~/my-project # symlink into /.dsh/skills/2d-limited-mv-studio 使用 DeepSeek Harness 构建 这是一个 DeepSeek Harness(DSH)智能体技能,任何 DSH agent 都能挂载; 因为它就是 SKILL.md + 零依赖 Python,在 Claude Code / Codex / Cursor 里同样可用。 这是一个 DeepSeek Harness(DSH)智能体技能,任何 DSH agent 都能挂载; 因为它就是 SKILL.md + 零依赖 Python,在 Claude Code / Codex / Cursor 里同样可用。 社区标签: deepseek-harness dsh agent-skill ai-video minimax-h3 music-video prompt-engineering 2d-animation lyrics art-direction xiaoyunque 环境要求 - Python ≥ 3.7,仅使用标准库。整条流水线以零第三方依赖运行 (已在 3.9.6 系统 Python 上测试)。 - 可选项,每一项都严格为增量增强: - ffmpeg 或 macOS afconvert —— 切割非 WAV 音频 - macOS AVFoundation(内置)—— 提取精确的尾帧 - numpy / librosa —— 更精准的 BPM 与频谱分析 - 艺术风格库(147 个流派,带分层提示词)—— 路径可配置;没有它时 本技能会降级为内置媒体调色板,并如实说明 测试 bash python3 -m unittest discover -s tests -t tests Ran 173 tests … OK 173 个测试,零依赖,包括一次端到端运行(合成素材 → all → 草稿 必须拒绝渲染 → 填充 → 渲染 → 校验 → 打包)以及一个隐私守卫:一旦项目专属名称、 私有提示词集或硬编码本地路径进入包中,构建即失败。 仓库结构 2d-limited-mv-studio/ ├── SKILL.md 技能本体 —— 工作流、硬性关卡、DoD ├── config/defaults.yaml 可调参数(导演判断不在这里) ├── scripts/ │ ├── mvstudio.py 单一入口,15 个子命令 │ └── lib/ │ ├── beats.py 节拍网格 · 小节对齐 · 14.5 秒分段 · H3 时长契约 │ ├── slicer.py 实际切割音频(ffmpeg → afconvert → wave) │ ├── h3render.py 六段式渲染器(mv / ref / i2va / t2va) │ ├── chain.py 跨分段的尾帧链接 │ ├── frames.py 帧捕获(ffmpeg → AVFoundation → 平台导出) │ ├── endings.py 八种可导演的结局 │ ├── motion.py 魔性动作:viral level · beat-driven repeat schedule · hook │ ├── camera.py 六层镜头语汇(角度、取景、2D 运动) │ ├── styleroutes.py 穿越艺术史的六条融合路线 │ ├── threeview.py 角色三视图 │ ├── confirm.py 逐步确认台账 │ ├── platforms.py 小云雀 / MiniMax Design 适配器 │ ├── gates.py 机器可校验的门禁 │ ├── director.py 草稿 + 工作表 │ ├── materials.py 素材与时长门禁 │ ├── canon.py 角色设定脚手架 │ ├── pack.py 上传包 │ ├── music.py 音频分析(librosa → numpy → stdlib) │ ├── audioprobe.py ffprobe → afinfo → 纯 Python │ ├── imgprobe.py 图像探测与调色板,纯 Python │ ├── lyricsrc.py 歌词来源(embedded / lrc / srt / vtt / txt / ASR) │ ├── artbridge.py 通往艺术风格库的桥接 │ ├── miniyaml.py 微型 YAML 读取器(无 PyYAML) │ └── common.py 路径、配置、日志、降级 ├── references/ 方法、语汇、官方 H3 指南 └── tests/ 173 项测试,零依赖 设计说明 一些并不显而易见的决定,以及它们背后的理由: 角色设定存放在官方槽位,而非正文中。 一种来源方法坚持每个提示词都要重述完整的角色设定;另一种则坚持绝不能在正文中描述外貌, 因为文本与参考图会相互冲突,导致模型漂移。 两者都对,只是适用于不同的位置。H3 的全参考模式有 subject_definitions 和 retention_analysis —— 正是格式为此预留的槽位。设定放在那里;正文保持干净。 大声降级,绝不悄悄降级。 没有 ffmpeg?你会得到一份毫秒级精确的剪辑表,并被告知自行剪辑 —— 而不是一个 悄无声息的错误结果。没有帧提取器?报错,并给出通往平台自带导出的路径。 每一次回退都会连同其影响一并记录。 色彩不是装饰。 艺术运动的选取由歌词索引,每一个背景元素都必须能追溯到它所处的那一行歌词。 随意的装饰是校验失败,而非风格。 许可证 MIT —— 见 LICENSE。 One body. Many worlds. The same face at the last frame.* 一具身体,许多世界,最后一帧上还是同一张脸。