anime-reel
输入:一个脚本 + 每句对应的 MP3 语音(用户一起提供)。输出:一个 9:16 竖版和一个 16:9 横版视频,均保留原始音频,外加一个低于 20 MB 的 720p 副本用于 WhatsApp。
硬性规则(每次运行必须遵守)
- 所有画面均用代码绘制:HTML Canvas,在 headless Chrome 中逐帧渲染,使用 ffmpeg 编码。不使用素材片段,不使用图像生成器。以
engine/为基础;扩展它,不要替换它,以保持每次运行时外观一致。 - 使用强制对齐(torchaudio MMS_FA,通过
scripts/align.py)为每个单词计时。绝不猜测时间。如果某句对齐失败,则停止并告知用户原因;不要回退到均匀间隔。 - 在完全渲染前生成一份静态帧样张并等待用户批准。
- 覆盖任何已有文件前必须询问。
encode.sh拒绝覆盖并退出码 2;请将此信息告知用户。 - 最终 MP4 中保持原始音频不变(语音线仅放在时间线上,绝不重新处理)。除非用户要求,否则不添加背景音乐。
方法
- 环境检查。 运行
bash scripts/check_setup.sh(检查 ffmpeg、Node、puppeteer、torch/torchaudio、uroman)。修复任何缺失的项目后再继续。运行bash scripts/sfx.sh <project>/sfx用 ffmpeg 合成打击/呼啸/冲击/弹跳音效。 - 将脚本拆分为镜头。 每句语音对应一个镜头。为每个镜头编写:
id(标识)、speaker(说话者)、text(MP3 中说的准确文本)、audio(音频路径)、place(地点:屋顶、办公室、街道、卧室、天空,或新增drawPlace分支)、camera(static|push|pull|pan+amount数值)、cast(角色)、slots(左/中/右位置)、以及fx(特效)。保存为shots.json(模式定义在scripts/build_timeline.py中)。显示镜头列表,如果存在歧义让用户修正。 - 角色。 在
characters中定义每个角色(name 名称、skin 肤色、hair 发色、hairStyle 发型 spiky|bob|long|short、eye 眼色、outfit 服装、accent 口音、color该角色字幕颜色)。角色必须是原创,绝不能复制现有动漫。动漫风格:大眼睛带高光、粗而清晰的轮廓、平涂着色加恰好一层阴影。渲染角色表并将 JSON 作为唯一数据源,确保角色在不同镜头间不变:node scripts/render_frames.mjs sheet timeline.json landscape out/character_sheet.png - 对齐与口型同步。
python3 scripts/build_timeline.py shots.json timeline.json work对每句运行 MMS_FA(单词级时序)并根据该语音线的响度构建每个角色的嘴张曲线(mouth.py)。眨眼和待机动作已内置于引擎中。对于非英语台词,align.py使用 uroman 进行罗马化,同时在屏幕上保留原始拼写。 - 关键句动漫特效(添加到
fx,时间单位为从镜头开始起的秒数):在揭示和决心场景添加speedlines(速度线),在最重要台词添加impact(白/黑闪帧,带sfx: "impact"音效),在打击场景添加shake(震动),在喜剧反应场景添加chibi(Q 版化,带who角色和sfx: "pop"音效)。谨慎使用:大约每 2-3 个镜头使用一个特效,这样才能保持冲击力。 - 字幕与声音。 引擎已处理 2-3 词字幕,其中说话者的词用其角色颜色显示,其余词为白色。音效与视觉冲击的 cue 点同步(通过
fx[].sfx)。使用python3 scripts/build_audio.py timeline.json work/audio.wav混音。 - 静态帧样张,然后批准。 挑选大约 12 个时间点分布在整段视频中,必须包含每个特效:
node scripts/render_frames.mjs stills timeline.json portrait work/stills 0.5,2.0,...bash scripts/contact_sheet.sh work/stills out/contact_sheet.png显示out/contact_sheet.png并停止。在用户批准前不要渲染完整视频。 - 批准后渲染,针对每个方向(
portrait竖版 = 1080x1920,landscape横版 = 1920x1080,30 fps):node scripts/render_frames.mjs video timeline.json portrait work/reel_silent.mp4bash scripts/encode.sh work/reel_silent.mp4 work/audio.wav out/<名称>_9x16对横版重复,使用out/<名称>_16x9。encode.sh混入 AAC 256k 音频并写入_720p.mp4副本(目标约 17 MB,始终低于 20 MB)。使用ls -lh检查文件大小并报告。
渲染设置
- 9:16:1080x1920,30 fps,H.264 yuv420p,CRF 16,AAC 256k,faststart。16:9:1920x1080,相同设置。
- WhatsApp 副本:720p(720x1280 或 1280x720),码率根据时长计算以保持低于 20 MB。
- 字幕位置:9:16 中约在画面 68% 高度(避开顶部 250 px 和底部 420 px 应用 UI),16:9 中约在 86% 高度。
技能包含的文件
engine/engine.js、engine/index.html:Canvas 引擎(角色、地点、速度线、冲击帧、震动、Q 版、字幕、徽章)。scripts/:check_setup.sh、sfx.sh、align.py、mouth.py、build_timeline.py、build_audio.py、render_frames.mjs、contact_sheet.sh、encode.sh。