如果最近刷到过一条标题为《【AIRI】第一次跳mmj…有当偶像的潜质吗》的视频你大概率会被评论区的一句话击中“这个角色也太有生命力了吧。”在很多观众眼里这是一个虚拟偶像的预备役但在开发者眼里这其实是 3D 建模、骨骼绑定、动作生成、歌声合成、实时渲染、音视频后期一整条技术流水线的一次集中亮相。先把“mmj”具体指哪段舞蹈放在一边也先不讨论 AIRI 背后是一个团队还是个人创作者。这条视频真正值得程序员思考的问题只有一个一个看起来并不复杂的虚拟偶像舞蹈视频到底是怎么做出来的个人开发者要复刻类似效果成本高不高卡点又在哪里我有一个比较明确的判断这类视频真正降低的是“让 3D 角色动起来”的创作门槛但它并没有消除动作质量、表情细节和版权管理这些仍然需要人来把关的环节。换句话说你能用开源工具在几天内跑通一条“AI 角色跳舞”的流水线但要让输出结果像 AIRI 那样有“偶像感”考验的仍然是工程调试和审美修正能力。本文就以这支 MMJ 风格舞蹈视频为讨论样本拆解完整技术链路并给出一个个人开发者可以上手的落地流程。1. 这篇文章真正要解决的问题表面上观众关心的是“这个虚拟形象能不能出道”实际上技术人要关心的是“它凭什么能跳得这么自然”。很多人以为虚拟偶像跳舞视频就是“拿模型套一段动捕数据然后渲染出来”真正动手后才发现从一段演唱、一支舞蹈到一条成品视频中间至少隔着五个问题角色模型从哪里来格式是否标准骨骼能不能直接复用主流动捕数据舞蹈动作从哪里来是花钱买动捕数据还是用 AI 从参考视频里提取歌曲或演唱部分怎么处理是直接用原曲还是要合成一套歌声动作数据如何映射到模型骨骼上也就是动画重定向怎么做离线渲染和实时渲染怎么选音画不同步怎么解决这篇文章要解决的问题就是把这五个问题按顺序拆开告诉你每个环节的常见工具、选择依据和容易踩的坑。如果你是对 3D 角色动画、AI 生成内容、虚拟偶像应用感兴趣的开发者或者想低成本给自己的角色制作一支舞蹈视频这篇文章会直接给你一条可执行路径。需要提前说明的是我没有必要把 AIRI 的身份考证当作重点。在技术讨论中它就是一个“虚拟偶像角色样本”。真正有价值的是它背后那一套可复用的技术骨架这才是本文要展开的部分。2. 虚拟偶像视频的技术全景一条从形象到成片的流水线如果把一支虚拟偶像舞蹈视频拆开看它其实不是一个单一技术而是七个子系统的组合环节作用常见工具/格式复杂度角色设计定义外形、服装、二次元/三次元风格VRoid Studio、Blender、绘画软件中3D 建模制作模型网格、贴图、材质Blender、Maya、C4D高骨骼绑定让网格能随骨骼运动表情能随控制点变化VRM、FBX、GLB、Blender Humanoid中高动作数据提供舞蹈、手势、镜头运动动捕设备、BVH、FBX、AI 算法中语音/歌声提供台词、演唱、口型对应TTS、SVS、歌声合成工具中渲染引擎把模型、动作、灯光合成为画面Blender、Unity、Unreal、VSeeFace高视频合成剪辑、加字幕、压制成片ffmpeg、剪辑软件低从这张表能看出一个规律虚拟偶像视频的“偶像感”并不是某一项技术单独做到的。模型再精致如果没有动作数据角色就是一张立绘动作数据再流畅如果口型和歌声对不上观众同样会觉得“假”。为什么 AIRI 这类角色一跳起舞来会让很多人产生“有当偶像潜质”的直觉拆解下来无非是三个层面同时过关了动作自然、表情有情绪、节拍与音乐匹配。而这三个层面恰好对应了动作数据的质量、表情绑定系统的质量、以及音频与动画的同步精度。任何一层垮掉最终视频都会穿帮。所以与其追问“它到底是什么引擎做的”不如先把全景框架建立起来。下面按技术依赖关系从动作、绑定、声音、渲染四个方向逐一展开。3. 动作从哪来动捕、手 K 与 AI 舞蹈生成舞蹈动作是整个视频的灵魂也是 AIRI 这次“第一次跳 mmj”最核心的看点。动作数据主要有五种来源成本和效果差异很大3.1 专业动作捕捉光学动捕需要在场地里布置多台摄像头让真人穿着带有反光标记点的紧身衣跳舞然后通过软件重建三维骨骼轨迹。优点是精度最高缺点同样是明显的设备贵、场地要求高、后期清理数据繁琐。惯性动捕通过佩戴在身体各部位的惯性传感器计算骨骼姿态比光学动捕便宜且不限场地但会有传感器漂移问题使用前需要校准。这类方案常用于专业虚拟主播团队和游戏动画制作。3.2 手动关键帧动画动画师一帧一帧地调整角色骨骼姿态业内叫“手 K”。这是最原始也最可控的方式但目前效率很低一段一分钟的舞蹈可能需要数天工作量通常只用于关键表演片段或动捕数据无法实现的夸张动作。3.3 视频动作估计这是目前个人开发者最常用、性价比最高的路线。它的核心思路是从普通视频中识别出人体的骨骼关键点再把关键点轨迹转成动画数据。代表性开源方案包括 MediaPipe Pose、OpenPose、MMPose 等。以 MediaPipe 为例它能从一帧画面中提取出人体 33 个关键点坐标包括头部、肩膀、手肘、手腕、髋部、膝盖、脚踝等。把连续帧的关键点记录下来再进行时间轴平滑和数据转换也就得到了一个基础动作序列。这条路线的优点是门槛低只需要一段舞蹈参考视频和一台电脑缺点是深度信息有限容易出现肢体穿插、手部抖动、脚步滑动等问题通常需要后续修正。3.4 AI 舞蹈生成这是近年比较受关注的方向给定一段音乐由生成模型直接产出舞蹈动作。相关研究工作包括基于扩散模型的舞蹈生成、基于 Transformer 的跨模态动作生成等。OpenAI 的 Sora 在视频生成里也能展示跳舞动作但那是像素级生成还不是工业动画管线直接能用的骨骼动画。AI 舞蹈生成目前很适合做灵感草稿和批量概念验证但要让生成动作精确踩在音乐节拍上并符合虚拟偶像的人设风格仍然需要大量后处理。它比动捕便宜比视频估计更“自动化”但稳定性还需要积累。3.5 如何为“第一次跳 mmj”选择动作方案如果你要为一条类似 AIRI 那样的 MMJ 风格舞蹈视频选动作来源我给的建议是应用场景推荐路线理由短视频试水/个人练习视频动作估计 手动修正成本最低跑通流程最重要直播虚拟主播惯性动捕或摄像头驱动需要实时性精度其次高质量 CG 短片光学动捕/专业动作库精度和表现力优先批量生成舞蹈候选AI 舞蹈生成算法快速出方案再人工挑选选好动作来源后下一步并不是直接把动作“贴”到模型上而是要先解决一个基础问题模型的骨骼能不能接收这套数据这就是动画重定向。4. 让动作落到模型上骨骼绑定与动画重定向4.1 模型格式与骨骼结构一个 3D 角色想要动起来首先得有“骨架”。通俗地说模型网格表面上的顶点要跟随一组有层级关系的骨骼运动顶点被哪些骨骼影响、影响权重各是多少则叫“蒙皮信息”。在虚拟偶像领域VRM 格式是一种很适合标准化的模型格式。它脱胎于 VRoid Studio 生态统一了人体骨骼绑定、表情控制、视线控制等规范跨软件复用非常方便。FBX 则更通用也是游戏和影视工业中常见的动画交换格式。GLB/GLTF 是面向 Web 和实时渲染的轻量格式但表情支持要看具体实现。4.2 为什么动捕数据不能直接用从 MediaPipe 提取出来的“人体关键点坐标”和模型骨骼的“关节角度”是两种完全不同的数据。前者通常是三维空间里的点坐标后者是骨骼层级加旋转角度。要把参考视频里的动作搬到角色身上中间要做一次“重定向”。重定向本质上是这样两步建立参考骨骼与目标骨骼的对应关系。例如参考姿势的“右肩”对应模型骨架里的 UpperArm.R参考姿势的“右手腕”对应模型骨架里的 Hand.R。把参考骨骼的运动换算成目标骨骼的旋转再通过蒙皮让网格形变。听起来不复杂但一实践就会发现各种细节问题。最常见的坑是骨骼命名不一致Blender 里的骨骼叫 Mixamorig:RightArmVRM 模型里叫 RightUpperArmUnity 里又叫 UpperArm_R如果不做映射表数据就会错位模型会出现“瘫软”或“拧成麻花”的诡异姿态。4.3 表情系统与口型舞蹈视频不只是四肢运动表情非常关键。虚拟偶像的表情通常通过 Blendshape 实现也就是把一组表情状态预存为网格形变混合目标。VRM 和 ARKit 体系里有一套比较常用的表情分类比如“笑”“怒”“闭眼”“张嘴”“眉头上扬”等。制作流程中歌声的每个音节会与口型 Blendshape 对应词句的情绪会影响眉毛和眼神。这就是为什么有些虚拟偶像视频看起来情绪饱满而另一些只像“会动的蜡像”。要让舞蹈视频具备偶像感动作重定向只是入门表情映射才是真正的加分项。建议把表情和身体动作放在两个轨道上分别处理最后在渲染时同步避免在同一个节点上反复修改。5. 声音与歌声合成从 TTS 到 SVS 的角色分工舞蹈视频离不开音乐而“第一次跳 mmj”这类视频至少有两种声音处理方式一种是纯翻跳直接使用原曲另一种是角色演唱要用到歌声合成。5.1 TTS 与 SVS 的区别TTS文本转语音解决的是“把文字变成说话”SVS歌声合成解决的是“把乐谱和歌词变成歌声”。两者技术栈接近但歌声合成对音高、节奏、气息、颤音的控制要求更高。类型输入输出主要难点TTS文本朗读语音情感、韵律、稳定性SVS乐谱 歌词演唱歌声音高准确、节奏对齐、演唱表现力对于虚拟偶像舞蹈视频如果角色需要开口唱歌就要为角色建立歌声音色。主流商业工具有 VOCALOID、Synthesizer V、ACE Studio 等开源社区也有基于神经网络歌声合成的项目。每个工具的调教逻辑不同有的偏向音库参数编辑有的偏向直接导入 MIDI 和歌词。如果你只是给角色做一支“非演唱向”的舞蹈视频完全不需要碰歌声合成。用原曲做 BGM把角色处理成纯舞蹈展示这也是市场上大量虚拟偶像舞蹈视频的常见形式。5.2 让口型和歌词对上想要让观众觉得“角色在唱”必须做口型同步。通用的做法是把歌声或语音导出为音频并拿到每句歌词的时间轴。将歌词拆解成音素比如“a、i、u、e、o”。为每个音素分配对应的口型 Blendshape。根据时间轴驱动 Blendshape 的变化。音频驱动口型有一种常见效果叫“牙咬萝卜”嘴巴开合幅度过大看起来像在用力咀嚼。实际项目中通常会压小口型 Blendshape 的最大权重让嘴部动作更收敛反而更有二次元角色气质。5.3 版权提醒无论用原曲、翻唱还是 AI 歌声都要先确认授权范围。特别是 AI 歌声合成涉及声线模仿时版权和肖像权问题很容易被低估。个人练习没问题发布到公共平台就要严格检查素材授权。这是技术之外的硬边界不能靠技术手段绕过。6. 渲染与合成实时渲染、离线渲染怎么选动作和声音准备好之后就要把模型变成最终画面。渲染分为两大流派实时渲染与离线渲染。6.1 实时渲染实时渲染的典型工具是 Unity、Unreal、VSeeFace 等。它的特点是每一帧图像在几十毫秒内算出能支持摄像头驱动、鼠标操控、直播互动。虚拟主播直播用的基本都是实时方案因为它必须响应迅速。但实时渲染为了速度会在光照、阴影、抗锯齿等方面做妥协画面质感通常不如离线渲染。6.2 离线渲染离线渲染的代表是 Blender Cycles、Arnold、RenderMan。它可以逐帧慢慢计算支持全局光照、焦散、景深等复杂光学效果成片质感更强但渲染时间也按帧计算。比如一个 30 秒、每秒 30 帧的视频就是 900 帧如果单帧渲染需要 5 秒总耗时就是 75 分钟如果场景更复杂单帧半分钟也是常事。因此离线渲染适合制作短视频、MV和高精度 CG。6.3 选型建议需求推荐方案理由直播、实时互动Unity VSeeFace 或 Unreal低延迟驱动高质量短视频Blender Cycles 渲染质感优先快速预览效果Blender Eevee 或 Unity速度快团队协作 CG 项目Unreal 动捕设备高精度 生产管线成熟很多虚拟偶像舞蹈视频会选择“实时引擎做预览离线渲染出成品”的组合先用实时预览快速调整动作确认效果后再在离线渲染器里输出高质量帧序列。6.4 音画合成无论是实时录屏还是离线渲染最终都需要把画面和音频合成到一起。这一步最常用的工具是 ffmpeg。它可以无损裁剪、统一帧率、混音、压制输出是虚拟偶像视频后期不可缺少的一环。7. 最小可落地的制作流程与代码示例现在把前面所有概念落成一条个人开发者能跑通的最小流程。这个流程以“参考舞蹈视频 → 提取姿态 → 分离音频 → 渲染 → 合成”为主线不需要动捕设备不需要专业动画师完全基于开源工具。7.1 环境准备建议环境组合如下Python 3.9 或更高版本mediapipe、opencv-python、numpyffmpeg命令行工具Blender 3.0 以上以官方发布版本为准安装 Python 依赖pip install mediapipe opencv-python numpy如果你在安装 mediapipe 时遇到版本兼容问题优先查看官方发布说明而不是强行安装最新版。7.2 分离参考视频的音频先把舞蹈参考视频的音频导出来这样后面可以直接用音频作为节奏参考。ffmpeg -i reference_dance.mp4 -vn -acodec pcm_s16le reference_audio.wav这里-vn表示不处理视频只导出音频。输出为 WAV 是为了后续音画合成时更稳定。7.3 从视频中提取姿态关键点下面这段 Python 脚本会读取参考视频逐帧运行 MediaPipe Pose把每一帧的人体关键点坐标保存到 JSON 文件。这个 JSON 可以看作是“动作数据的中间产物”。# 文件路径extract_pose.py import cv2 import mediapipe as mp import json mp_pose mp.solutions.pose pose mp_pose.Pose( static_image_modeFalse, model_complexity2, min_detection_confidence0.5, min_tracking_confidence0.5, ) cap cv2.VideoCapture(reference_dance.mp4) frames [] frame_idx 0 while cap.isOpened(): success, frame cap.read() if not success: break frame_rgb cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) results pose.process(frame_rgb) if results.pose_landmarks: landmark_list [ [lm.x, lm.y, lm.z] for lm in results.pose_landmarks.landmark ] else: landmark_list [] frames.append({ frame: frame_idx, landmarks: landmark_list, }) frame_idx 1 cap.release() pose.close() with open(pose_keypoints.json, w, encodingutf-8) as f: json.dump(frames, f, indent2) print(姿态提取完成共处理, frame_idx, 帧)这段代码的核心逻辑已经说得很清楚了逐帧读取视频用 MediaPipe 检测人体姿态再把 33 个关键点坐标保存下来。值得注意的是model_complexity2表示使用精度最高的模型适合离线处理如果你在低性能设备上跑可以把它降到 1 或 0。提取出的 JSON 还不是标准动画格式。要让它真正驱动模型还需要把关键点轨迹转换成 BVH 或 FBX这一步可以借助社区里的转换脚本完成。第一次跑通时不必追求完美转换重点是验证“视频→关键点→骨骼动画”的整体链路。7.4 在 Blender 中导入模型与动作并渲染如果你已经有 BVH 动作文件和 VRM/FBX 模型可以在 Blender 里做动作重定向并渲染。下面是一个最简的 Blender 渲染脚本示例# 文件路径render_animation.py import bpy # 清空默认场景中的立方体 for obj in bpy.data.objects: bpy.data.objects.remove(obj, do_unlinkTrue) # 导入模型这里以 FBX 为例 bpy.ops.import_scene.fbx(filepathavatar.fbx) # 设置渲染帧范围 scene bpy.context.scene scene.frame_start 1 scene.frame_end 50 # 设置输出尺寸与格式 scene.render.resolution_x 1920 scene.render.resolution_y 1080 scene.render.image_settings.file_format PNG # 设置输出路径{frame} 会被自动替换为帧号 scene.render.filepath /tmp/avatar_render/frame_ # 渲染动画 bpy.ops.render.render(animationTrue)这是一个非常原始但有效的骨架清空场景、导入模型、设置帧范围、逐帧渲染 PNG 序列。真实项目中你还需要设置摄像机、灯光、材质和动作重定向节点但这些可以在 Blender 图形界面里提前调整好然后保存成.blend项目文件命令行只负责批量渲染。渲染命令可以写成blender -b avatar_project.blend -P render_animation.py-b表示后台模式适合在服务器上批量执行。如果你只是试跑可以先用更小的分辨率比如 1280×720节省等待时间。7.5 合成音画渲染完成后你会得到一组 PNG 帧序列。用 ffmpeg 先把帧序列转成视频再和之前导出的音频合成ffmpeg -framerate 30 -i /tmp/avatar_render/frame_%04d.png -c:v libx264 -pix_fmt yuv420p avatar_video.mp4ffmpeg -i avatar_video.mp4 -i reference_audio.wav -c:v copy -c:a aac -shortest final_dance.mp4第一条命令把帧序列编码为 H.264 视频第二条命令把音频合并进视频-shortest表示以音频和视频中较短的时长为准。看到final_dance.mp4生成后就代表最小流程已经成功跑通了。7.6 如何判断这个流程是否成功判断标准很简单打开final_dance.mp4看三件事。角色是否按照参考视频的主要动作在舞蹈而不是整个身体“乱漂”或“抽搐”。音频是否和画面节奏对得上角色的动作是否大体踩在音乐节拍上。画面中是否存在穿模、手脚抖动、脚底滑动等明显异常。如果前两点能接受就算流程跑通了。第三点属于后续精修范围不用要求一次到位。这里真正的经验是先把链路打通再谈质量千万不要第一步就追求完美动作。8. 常见问题与排查思路个人开发者跑通上述最小流程时几乎必然会遇到下列问题。把问题现象、原因、排查方式和解决方案整理成表方便实际项目对照问题现象可能原因排查方式解决方案姿态提取时角色动作乱抖视频分辨率低、肢体遮挡多、置信度阈值过低查看单帧关键点是否准确多帧之间是否有跳变提高视频清晰度减少遮挡增加关键点平滑滤波模型导入后骨骼错位骨骼命名不一致、模型非 Humanoid 标准检查 FBX/VRM 导入日志对比骨骼层级表建立骨骼映射关系或改用标准化 VRM 模型动作重定向后角色“漂移”关键点坐标包含根节点位移模型缩放比例不一致对比模型身高和动捕数据比例将动作数据根节点高度与模型脚底对齐锁定或修正位移离线渲染非常慢帧数多、分辨率高、光线复杂查看每帧渲染耗时先用低分辨率测试再按需提高也可换 Eevee 快速预览音画不同步帧率不一致、音频采样率不匹配、合成时未对齐检查视频实际帧率和音频采样率统一为 30fps用-vsync和-af参数重新编码角色表情僵硬缺少 Blendshape 数据、表情权重映射错误检查 VRM 表情列表是否完整在建模阶段补齐基础口型与情绪表情再单独调权重原曲版权不确定使用未授权歌曲或采样查看原曲授权说明优先使用明确允许二次创作的曲目或购买商用授权这些问题有一个共性看起来是某个环节出了问题实际上多数是“数据格式不统一”造成的。所以在动手之前先统一模型格式、骨骼命名、帧率和分辨率往往能避免一半以上的麻烦。9. 最佳实践、版权提醒与后续学习方向9.1 最佳实践如果你的目标不是只做一条测试视频而是稳定地产出虚拟偶像舞蹈内容建议从一开始就形成规范统一模型格式。优先使用 VRM 或标准 Humanoid FBX避免每接一个项目就要重新做骨骼匹配。分离资产与成品。原始模型、动作库、表情数据、渲染输出分别建目录不要混在一起。先做短视频验证。先用 5 秒到 15 秒的动作片段跑通全流程确认没有问题后再扩展成长视频。记录版本。模型版本、动作文件版本、Blender 项目版本都要记录方便回溯。善用预览渲染。先用低分辨率预览验证动作和表情确定 OK 后再开高分辨率正式渲染。不要只依赖 AI 生成动作。AI 和视频估计的结果可以作为起点但最好经过关键帧修正尤其是手部和脚部细节。9.2 版权与合规提醒这一点必须放在重要位置。模型、歌曲、舞蹈参考视频都可能涉及版权使用前需要确认授权。发布到公共平台时至少做到以下几条模型来源优先使用自己建模、官方允许二次创作或标注了 CC0/开放授权的模型。歌曲来源优先使用原创、开放版权、或作者明确允许二次创作的曲目。舞蹈参考如果动作提取来自他人舞蹈视频可能涉及表演者权益最好只做技术练习不公开发布或取得对方授权。歌手声线AI 歌声合成如果高度模仿真人歌手存在明显的肖像权和声音权益风险。技术能降低制作门槛但解决不了授权问题。这是每个虚拟偶像创作者都必须自己承担的判断责任。9.3 后续学习方向跑通这条最小流程之后如果有余力可以从四个方向继续深入实时方向学习 VSeeFace、VMCP 协议和摄像头动捕把自己的虚拟形象部署成可直播的虚拟主播。动作质量方向学习 Blender 动画、手 K 修正、IK 与 FK 切换提升角色动作的细腻度。声音方向学习开源歌声合成与 TTS 模型的使用和微调让虚拟角色拥有稳定的演唱音色。自动化方向把姿态提取、动作转换、渲染、合成封装成一套脚本形成批量生成虚拟偶像舞蹈视频的流水线。回头再看 AIRI 那条“第一次跳 mmj”的视频你会发现它表面上是一场唱跳展示本质上是一次技术整合能力的展示。虚拟偶像的“偶像潜质”来自模型设计也来自动作、表情、声音、渲染每一个环节的协调。对开发者而言好消息是这条链路已经从过去的七八位数预算压缩到一台能跑 Blender 的电脑就能启动。先别追求一步到位先用最小成本把链路跑通再把每个环节打磨到观众“看不出技术存在”的程度那才是真正有能力做出一个“有偶像潜质”的虚拟角色的时刻。