用代码做一支歌词 MV:6 步工作流

做 MV 和做解说视频是两种活。解说视频靠信息密度和节奏推进,MV 靠情绪和动作推进——一句歌词对应一个画面,抽象的歌词要拆成观众看得懂的动作。

这套流程同样分 6 步,同样每步一个提示词、一个产物文件,用的工具也是 HyperFrames:

song.mp3 → song.md → 样图 → character.js → storyboard.md → storyboard.png → 成片.mp4

第 1/6 步 · 理解音乐

第一步是把歌拆成结构:歌词时间轴、情绪基调、BPM、段落。这一步的产物 song.md 后面每一步都要用。

<role>你是 MV 的音乐分析师。 </role>
<task>分析文件夹中的 song.mp3:
1. 使用 Whisper 将歌词转写为带时间轴的字幕 lyrics.srt;文件夹中已有 lyrics.srt 则直接使用
2. 使用 WebSearch 检索这首歌的歌词解读、乐评和听众评论,归纳出 3-5 种主流理解,逐条附上来源链接
3. 综合上述理解,概括歌曲的主题与情绪走向
4. 使用 librosa 测出 BPM 与节拍点,标注前奏、主歌、副歌、停顿以及最后一个重音的时间点
结果整理为 song.md。 </task>
<check>将识别置信度低、可能有误的歌词单独列出,等我确认。 </check>

要换成你自己的:song.mp3 换成你的歌。

第 2 步值得留意——让 AI 去搜这首歌的歌词解读和听众评论,把 3-5 种主流理解带来源列出来。这解决了 MV 最大的争议点:一首歌可以有多种读法,你得知道大家是怎么读的,而不是自己拍脑袋定一个。

第 1/6 步 · 理解音乐

第 2/6 步 · 定画风

出 3 张样图让你挑。这里给了 3 个现成的画风方向,都是纯代码能画出来的。

<role>你是 MV 美术指导。 </role>
<task>基于 song.md 中的主题与情绪基调,用代码以下列 3 种画风分别绘制同一个开场画面,各输出一张 1920×1080 样图:
1. 像素游戏风:使用 Canvas 2D 在 320×180 画布上逐格绘制,全片限定 16-32 色,渐变用抖动点阵,整数倍放大并关闭平滑;动画时角色逐帧换画、不做补间
2. 纸艺拼贴绘本:每个元素带剪纸白边或撕纸毛边和投影,层层叠放,底纹用旧报纸或牛皮纸;动画时画面每秒更新 8-12 次,每次随机抖动 1-2 像素
3. 蜡笔手绘绘本:使用 p5.js 和 p5.brush 的笔刷绘制,保留笔触和纸张纹理
每张附一句适配理由。完成后暂停,等我选择。 </task>
<avoid>使用图像生成模型;深色背景配霓虹光;紫色渐变;画面堆满文字。 </avoid>

要换成你自己的:换成你想要的风格;只写风格名也行,画法让它自己定。

三套画风都刻意避开了图像生成模型——全片用代码画,风格才能被精确复刻到每一个镜头,而不是每个镜头重新掷骰子。

第 2/6 步 · 定画风

第 3/6 步 · 画角色

MV 里的角色必须前后一致。这一步的解法是把角色封装成独立模块。

<role>你是角色设计师。 </role>
<task>以选定画风设计这支 MV 的主角:一只橘色的小螃蟹。
1. 将角色封装为独立模块 character.js,提供统一的绘制接口,参数包括朝向、表情、动作
2. 表情至少包括开心、害羞、难过;动作至少包括走、跳、拥抱、手持道具
3. 输出一张角色设定图:正面、侧面、背面三视图加表情表,等我确认
后续所有镜头都通过 character.js 绘制角色,保证造型前后一致。
</task>
<avoid>每个镜头重新绘制角色;手持道具与手部分离;道具遮挡面部。 </avoid>

要换成你自己的:

character.js 是整套流程的关键设计:后面每个镜头都从这个文件里面取角色,所以造型不会在镜头之间漂移。<avoid> 里的三条(每镜头重画、道具与手分离、道具挡脸)是角色一致性问题的三种典型翻车方式。

第 3/6 步 · 画角色

第 4/6 步 · 剧本和分镜

按歌词时间轴切镜头,一步一个镜头,画面直接表现这句歌词的含义。

<role>你是 MV 导演。 </role>
<task>使用 HyperFrames 制作这支 MV,先按它的分镜流程输出 storyboard.md:
1. 以 lyrics.srt 的时间轴为准,每句歌词对应一个镜头,画面直接表现这句歌词的含义
2. 抽象的歌词拆解为观众看得懂的连续动作
3. 每个镜头标注起止时间、场景、角色动作与运镜方式,镜头切换对齐 song.md 中的节拍点
4. 以下抽象歌词按我的理解表现:(写在这里)
整体叙事要有情感起伏,结尾留有余味。完成后暂停,等我确认。 </task>
<avoid>单句歌词安排多个动作;无信息量的过场;观众无法理解的情节。 </avoid>

要换成你自己的:第 4 条写你对抽象歌词的理解,比如「拨开阴霾:先是你帮我,后来我学会自己做」;没有就删掉第 4 条。

有些歌词是比较抽象的(比如「拨开阴霾」),AI 写出来的画面往往过于字面。第 4 条就是给这些句子一个你认可的具体化方式。

第 4/6 步 · 剧本和分镜

第 5 步 · 先出草图

分镜是文字,出成片之前先出一张分镜总览图。

<task>分镜已确认。暂不渲染成片:为每个镜头绘制一张关键帧草图,拼接为一张分镜总览图 storyboard.png 供我检查,确认后再制作完整视频。 </task>

第 5 步 · 先出草图

第 5 步 · 做整片

草图确认后才渲染成片。这一步的 <specs> 写死了渲染方式:背景、角色、道具在同一画布里统一绘制,而不是把背景图和单独渲染的角色视频分层叠加。

<task>草图已确认,开始制作完整 MV。 </task>
<specs>每个镜头的背景、角色、道具在同一画布中统一绘制,随镜头推拉同步运动,不将背景图与单独渲染的角色视频分层叠加。歌词读取 lyrics.srt,置于最上层,按时间轴显示在画面下方,不随镜头运动。配上 song.mp3,按分镜设定的画幅与帧率导出 MP4。 </specs>
<check>使用 ffmpeg 抽帧,核对每句歌词的出现时间与演唱对齐;使用 ffmpeg 测量导出音轨与原曲的响度(LUFS),两者保持一致。 </check>

「不将背景图与单独渲染的角色视频分层叠加」这条容易被忽略——分层叠加是后期合成的做法,但在代码渲染里会导致角色和背景的光影、透视对不上,看起来像贴纸。统一画布绘制慢一些,但画面是连贯的。

第 5 步 · 做整片

第 6/6 步 · 看成片、改

成片出来之后对着清单查。这张清单覆盖了代码做 MV 最常见的 5 个毛病:

毛病症状怎么改
像幻灯片画面动态不足,像幻灯片先用 ffmpeg 每 0.5 秒抽帧、计算相邻帧差,找出静止段落,再让角色持续有动作、镜头保持缓慢运动,每句歌词安排一个清晰的主要动作,以中近景呈现
运镜晃镜头运动过于频繁每个镜头只保留一种缓慢运动:慢推、慢移或跟随角色
表现力不够情绪表现不足情绪最强的段落改用近景,光线与色调随情绪变化
道具不对手持道具位置异常道具须贴合手部,且不得遮挡面部
歌词没演出来「(这句歌词)」的画面未能表达歌词含义请换一种更直观的表现方式

「像幻灯片」这一条给了具体排查方法:先用 ffmpeg 抽帧算相邻帧差,找出静止段落。这是把主观的「感觉不动」变成可测量的数字——先定位问题段落,再改。

第 6/6 步 · 看成片、改

附:学一支参考视频的风格

如果你已经有一支喜欢的视频,想让成片接近它的风格,用这一段。

<role>你是视觉风格分析师。 </role>
<task>分析文件夹中的 reference.mp4,提炼其视觉风格:使用 ffmpeg 每 0.5 秒抽取一帧逐张分析,使用 librosa 测出音乐的 BPM 与节拍点,整理为 style.md:
1. 一句话概括风格
2. 配色方案(附 HEX 色值)
3. 角色与背景的绘制手法
4. 画面切换频率,以及镜头内的运镜方式
5. 转场方式
6. 画面文字的字体、颜色与出现时机
只记录可迁移到新作品中的风格规律。 </task>
<avoid>套用现成的风格模板;仅分析开头几秒。 </avoid>
<check>新视频完成后,与参考视频同一段落各抽数帧对比,列出节奏与构图上的差距并逐条修改。 </check>

要换成你自己的:reference.mp4 换成你录下来的那支视频的文件名。

「只记录可迁移到新作品中的风格规律」和「仅分析开头几秒」这两条是关键——风格分析容易滑向复刻原作,而这两条把范围限定在可迁移的规律上。

学一支视频的风格

这套流程的四个设计要点

抽象歌词要人工干预。 MV 的难度全在第 4 步:一句「拨开阴霾」,代码能画出云和太阳,但画不出「先是你帮我,后来我学会自己做」的转折。这种地方必须由人给一句具体的解释。

角色靠模块化解决一致性。 MV 里最容易崩的就是同一个角色在不同镜头长得不一样。character.js 把角色变成一个带参数的函数,造型只定义一次。

先草图,后成片。 storyboard.png 是一次全片关键帧的总览。它比逐个镜头检查快得多——总览一眼就能看出节奏对不对、情绪走向对不对。

返工清单是流程的一部分。 第 6 步不是「检查一下」,是一张带修复方法的表。代码做视频的返工成本很低(改一行重渲一次),但前提是你知道该改什么。

和解说视频流程的区别

知识解说视频走的是 把一篇文章做成视频:6 步工作流,那条线不需要角色,也不需要 character.js,重点在信息密度和排版。

两条线共用 HyperFrames,也共用「每步一个提示词 + 一个产物文件 + 一个人工确认点」的骨架。