
1. 数字衣橱这件事主播比设计师更需要去年帮一个做虚拟形象直播的朋友收拾他那堆服装素材时我才真正意识到问题的严重性硬盘里躺着两百多张立绘文件名从final.png到final_真的final_改3.png谁也不知道哪张对应哪套衣服、哪套衣服配哪个发型、哪一版是观众投票通过的那一版。换个季度要上新造型等于把这堆文件重新翻一遍翻到最后往往还是让画师重画。这就是我接手Stable Yogi Leather-Dress-Collection这个项目的起点——它不是什么炫技的模型实验而是一套虚拟偶像服装设计的资产化方案目标很朴素为直播主播打造一个能查、能调、能换、能复用的专属数字衣橱。“Stable Yogi”是这个项目内部的代号皮革质感服装系列Leather-Dress-Collection是衣橱里的第一个品类。之所以挑皮革打头阵原因很实际皮革是虚拟服装里最容易出效果、也最容易翻车的材质把它啃下来棉麻、丝绸、针织这些后续品类基本就是降维打击。这套东西适合谁看三类人最对口。第一类是自己在做虚拟形象、预算有限又不愿意每套衣服都外包的独立主播第二类是给主播做视觉外包、手上同时跑着五六个形象的小团队第三类是想把 AI 出图真正沉淀成生产资料、而不是每次开盲盒的设计爱好者。如果你只是想生成几张好看的图发个动态那这篇里的很多工程细节对你来说是多余的但如果你要的是“下个月换季上新我能在一晚上把六套衣服的风格统一改一遍”那接下来这些内容应该能省你不少时间。我先把结论摆出来数字衣橱的核心不是生成能力而是约束能力。生成能力决定你能不能做出来约束能力决定你做出来的东西能不能被反复调用。后面所有章节本质上都在讲怎么把“随机出好图”变成“稳定出对图”。2. 衣橱条目的最小字段先定数据结构再谈出图2.1 为什么先做字段表而不是先做提示词绝大多数人做虚拟服装的第一步是打开生成工具写提示词写完发现效果不错存图收工。第二套衣服再来一遍写到第五套的时候你会突然发现前四套的领口高度不一样、皮面光泽强度不一样、人物肩宽不一样。这时候回头改成本比重新做还高。我踩过这个坑所以在这个项目里我把顺序彻底倒过来了先定一套字段再让生成流程去填这套字段。字段定下来之后每一套衣服都是一个结构化记录出图只是这个记录的一次渲染结果。这个思路跟做内容管理是一样的先有 schema 再有内容否则后期全是脏数据。字段不用多够用就行。我实际用下来这套是能撑住的字段名含义示例值是否必填outfit_id衣橱条目唯一编号ly-0042必填category品类皮革连衣裙 / 皮革外套必填silhouette版型关键词收腰、A字摆、及膝必填material_profile材质档案引用leather_matte_01必填palette主色与辅色#1B1B1F/#8A6A3B必填hardware五金件清单金属拉链、方形扣选填character_ref角色特征引用char_main_v3必填pose_set适配姿态集合idle/wave/sit必填approved是否通过验收true必填version版本号v1.3必填这里面最容易被忽略的是material_profile和character_ref两个引用字段。前者把“皮革”这个模糊的词拆成一组可复用的参数组合后者把角色面部特征单独抽出来。这两个引用是后面所有一致性工作的地基没有它们你每次都在重新描述同一件事而且每次描述得都不一样。2.2 一条衣橱记录长什么样落到文件上就是一条 JSON。我习惯一个条目一个文件放在按品类分的目录里主索引另外维护一份。这样做的原因是版本管理工具对单文件友好冲突少回滚也干净。{ outfit_id: ly-0042, category: leather_dress, version: v1.3, silhouette: [fitted_waist, a_line_hem, knee_length], material_profile: { base: matte_leather, sheen: 0.35, grain_scale: 0.6, fold_density: medium }, palette: { primary: #1B1B1F, secondary: #8A6A3B, accent: #C9C2B6 }, hardware: [metal_zipper_front, square_buckle_belt], character_ref: char_main_v3, pose_set: [idle, wave, sit], approved: false }sheen这个值我建议一开始就用 0 到 1 的归一化数值别用“很亮”“稍微亮一点”这种描述。原因很直白你需要在不同批次、不同工具、不同人接手的情况下保持同一个语义。数值不准确没关系重要的是它有一个稳定可比的刻度你能说“这次比上次高了 0.1”而不是“这次好像亮了一点”。2.3 主播视角的三个硬指标站在主播那一边数字衣橱好不好用其实就看三件事跟技术多先进关系不大。第一是换装速度。直播间里观众起哄要换造型你不可能说“等我二十分钟重新生成”。所以每一套通过的服装必须提前把常用姿态渲染好存成成品换装是切图不是生成。我一般的做法是每套衣服至少出 idle、挥手、坐姿三个姿态每个姿态两到三个表情变体一套下来十二到十八张够撑一场直播。第二是风格不能飘。主播的形象是有识别度的观众认的是那张脸和那个气质。衣橱里的衣服可以千变万化但角色的“骨相”必须钉死。这就引出后面第 5 章要讲的双轨控制。第三是成本可控。这句话包含两层意思算力成本和沟通成本。算力成本靠批量化和低分辨率草稿筛选来控制沟通成本靠字段表来控制——当主播说“我想要再酷一点”你能把它翻译成sheen 0.1、palette.primary调暗两档这样的具体动作而不是两个人对着屏幕互相猜。提示字段表不要一上来就设计得很全。我第一版加了十六个字段结果有十一个从来没填过。真正跑起来三个月后能稳定填写的才是有价值的字段剩下的都是自嗨。3. 皮革为什么是虚拟服装里最难驯服的材质3.1 把“皮革”拆成三个可描述的视觉层次新手写提示词最容易犯的错是把“皮革裙”当成一个整体去描述。模型收到的信息太粗它只能给你一个大概像皮革的东西而“大概像”在虚拟服装里等于不可用。我的做法是把皮革拆成三层来写表面反射层、形体折痕层、边缘结构层。表面反射层决定的是高光的形状。哑光皮革的高光是一大片模糊的漫反射亮面皮革的高光是窄而锐的条状漆皮则接近镜面反射、会映出环境。这三者的差别在提示词里必须用完全不同的词混着写就会得到塑料感。形体折痕层决定的是褶皱的走向和密度。皮革的褶皱跟布料完全不同布料是垂坠的、褶皱细密且随机皮革是硬挺的、褶皱少但深而且往往沿着关节和受力方向呈放射状。你如果按布料的逻辑写“飘逸的褶皱”出来的必然是一块软塌塌的皮子看着像雨衣。边缘结构层决定的是厚度感。真实皮革有厚度领口、袖口、下摆的边缘会翻出一点点侧面这个侧面是暗的。很多生成结果看着“薄得像贴图”问题就出在这儿——它没有边缘厚度。3.2 三类典型失真和它们的成因跑了几百张之后我把皮革的失败案例归成了三类每一类的成因和解法都不一样失真类型表面现象根本原因处理方向塑料化高光过锐、整体发亮、没有纹理反射描述过强材质纹理描述缺失降sheen补颗粒与纹理描述布化褶皱软塌、边缘飘、没有支撑感用了布料类词汇缺少硬挺约束换折痕词汇加强版型约束贴图化服装像平贴在身上没有体积缺少边缘和厚度描述光照单一补边缘描述加侧向光源塑料化是最常见的。很多人为了让皮革“看起来高级”拼命加 glossy、shiny、reflective结果模型理解成了塑料包装膜。实测下来哑光皮革的关键词强度应该远高于光泽词你要的是“看起来是皮的”而不是“看起来很亮”。布化这个坑更隐蔽因为它在缩略图里看不出来放大才发现下摆的褶皱完全不符合皮革的物理特性。解决办法是在描述里明确写支撑结构比如“有型的下摆”“硬挺的肩线”让模型知道这东西不服帖。贴图化通常跟光照有关。单一正面光会让所有材质都变成平涂加一个侧向的主光体积感立刻就出来了。这个改动成本极低收益极高。3.3 材质描述的分层写法落到实际的提示词结构上我一般不写一大段自然语言而是分成几个短块每块只负责一件事。这样调的时候可以精确定位是哪一块出了问题[主体] 虚拟形象角色全身立绘正面站姿 [服装] 哑光皮革连衣裙收腰A字下摆及膝 [材质] 细密皮革纹理低频深折痕边缘有厚度微弱漫反射高光 [五金] 前中金属拉链方形腰带扣做旧金属质感 [光照] 左前侧主光右后侧微弱补光柔和阴影 [画质] 高细节清晰边缘无噪点这种分块写法还有一个额外好处换品类的时候不用重写全部只要替换[材质]那一块。从皮革换到针织改三行就够了其余部分完全复用。这就是资产化的价值——你的经验沉淀在结构里而不是沉淀在某一段玄学提示词里。注意分块之间不要互相矛盾。我见过有人在[材质]里写“哑光”又在[光照]里写“强烈镜面反光”模型只能二选一结果就是半个身子哑光半个身子反光非常难看。4. 从一张图到一条产线四层分离的生成管线4.1 结构层先把版型钉死再谈材质这套管线的核心思想叫分层解耦把“版型”“材质”“装饰”“角色”四件事分开控制每次只动一层。听起来像废话但实际执行的人很少因为大部分人习惯了“一段提示词全搞定”。结构层负责的是轮廓。我在这一层用的是线稿或边缘约束输入一张手绘的版型草图让生成过程必须贴着这个轮廓走。为什么要草图而不是纯文字因为文字描述版型的精度太低。“收腰”到底是收到什么程度“A字摆”是三十度还是四十五度这些差异在文字里根本表达不出来但草图一笔就清楚了。草图的画法也有讲究。我一般画到“能看出剪裁线”的程度就够了不画细节。袖子是落肩还是装袖、腰线在哪、下摆开衩多高这些定了剩下交给后面的层。画太细反而限制模型出来的东西会很僵。这一层还要顺便把姿态定下来。姿态和版型是耦合的——同一件收腰裙站姿和坐姿的腰线位置看起来完全不一样。所以我的做法是一个姿态一套结构约束而不是一套衣服一个约束。这也是为什么字段表里pose_set是必填的。4.2 材质层把光照变量单独拎出来材质层是这套管线里最值钱的部分。做法是把“材质参数”和“光照参数”当成两个独立维度做成交叉组合。具体来说我先固定一组材质档案哑光皮革、半光皮革、漆皮、做旧皮革再固定一组光照方案正面柔光、左前侧主光、顶光、逆光轮廓。四乘四十六种组合先小分辨率批量跑一遍看哪些组合能出效果。跑完之后你会发现某些材质只在特定光照下成立——比如漆皮在正面柔光下会糊成一片必须有侧向光才有形状。这个批量测试的过程其实挺有意思它逼着你把模糊的审美判断变成可枚举的变量。跑完之后我整理了一张表记录每种材质的最优光照区间后来所有新衣服都直接查表省了大量试错。材质层还有一个细节纹理尺度要和出图分辨率匹配。你在 512 分辨率下能看到的皮革颗粒放大到 2048 之后会变成一片模糊的噪点。所以我的流程是先低分辨率定稿再分块放大放大过程中用纹理约束保证颗粒尺度跟着一起放大而不是被抹平。4.3 装饰层五金件必须局部重绘拉链、扣子、铆钉这类五金件是整张图里最容易糊的地方。原因很简单它们面积小、细节密度高、又需要明确的高光和阴影模型在全局生成时给不到足够的注意力。我的处理方式是全局出图 局部重绘。先用整图流程出一个大关系正确的版本然后框出五金件区域做局部重绘提示词里单独描述材质做旧金属、拉丝金属、抛光金属和形状方形扣、D 形环、齿状拉链。区域边缘要留出足够的羽化否则接缝会有一条明显的硬边。这一步的投入产出比很高。同样一张图五金件重绘过的和没重绘的放一起精致度差一个档次。而且五金件是风格锚点——同样是黑色皮革裙配做旧黄铜扣和配亮银拉链气质完全是两回事。4.4 管线参数与耗时参考把四层跑通之后一套衣服从草图到成品出图我这边的实测数据大概是这样的阶段主要动作单套耗时备注结构层画版型草图 姿态约束30-45 分钟手绘时间为主材质层材质光照矩阵测试20-30 分钟首次做矩阵后续复用全局出图多批次筛选40-60 分钟小分辨率量大装饰层五金件局部重绘30-40 分钟每张 3-5 处放大精修分块放大 细节补40 分钟视分辨率而定多姿态铺开其余姿态批量出图60-90 分钟结构约束复用一套下来三到四个小时听着不短但这是首次制作的耗时。第二套同类服装如果只是改配色和五金能压到一小时以内如果是同版型换材质半小时就能出。5. 一致性钉死骨相放开皮相5.1 哪些必须固定哪些必须放开做虚拟偶像服装设计最怕的不是某张图不好看而是十张图放在一起不像同一个人。这个问题我在项目初期吃了大亏前三套衣服出来效果都挺好第四套换了材质描述之后角色的脸型、眼距、下颌线全变了观众一眼就看出“这不是她”。后来我把一致性问题拆成两个独立的轨道角色轨道和服装轨道。角色轨道里必须固定的东西脸型轮廓、五官比例、发型基础形、肤色、身高比例、惯用姿态的重心。这些东西一旦确定任何一套服装都不能改。服装轨道里必须放开的东西材质、配色、剪裁、装饰、层次。这些是每套衣服的差异来源必须允许大幅变化。关键在于很多人把这两条轨道混在一起处理——用同一段提示词同时描述角色和服装结果就是改服装的时候把角色也改了。分开处理之后改服装只动服装层角色层完全不动一致性自然就稳了。5.2 训练轻量模块时的数据配比经验角色一致性最实用的手段是用一小批高质量素材训练一个轻量适配模块。这部分的经验我踩过不少坑说几个反直觉的素材不是越多越好。我第一版用了九十多张结果模型把各种姿态、各种光照、各种背景全学进去了反而削弱了对核心特征的捕捉。后来压到三十张左右效果明显更稳。这个数量级的经验是二十到四十张覆盖三到五个角度两到三种光照就够。素材质量比多样性重要。如果素材里有一张脸是歪的、或者光打得很怪模型会把这个“怪”当成特征学进去。所以筛选素材的时候宁可少几张也不要有瑕疵的。我的标准是每张素材单独看必须是你愿意拿出去当头像的水平。背景干净是硬要求。杂乱的背景会被模型当成角色的一部分尤其是深色背景配浅色服装这种高对比组合学完之后生成什么都会带一块黑影。学习率别调太高。我一般从 1e-4 起步出问题就往下调。调高了会过拟合生成的角色每张都长得一模一样连表情都僵住反而失去了表现力。迭代轮次要看着效果停不要看着数字停。我习惯每跑一段就出一批测试图看到“像但还留有余地”就停手这时候模型既能稳定还原角色又保留了接受新服装描述的空间。5.3 一致性验收的打分表光靠眼睛看“像不像”不靠谱尤其是连着看二十张之后眼睛会疲劳。我做了一张简单的打分表每套衣服出图后按项打分低于阈值就重做检查项判定标准权重阈值脸型轮廓与基准图叠合后偏差是否可接受高必须通过五官比例眼距、鼻长、唇角位置高必须通过发型基础形发际线、发量分布、发梢走向中≥ 4/5身高比例头身比与基准一致中≥ 4/5材质吻合与material_profile描述一致高必须通过版型吻合与结构草图轮廓一致高必须通过五金清晰度装饰件边缘可辨、高光合理低≥ 3/5整体协调无穿模、无诡异接缝高必须通过这套表最大的价值不是打分本身而是把主观判断变成可沟通的语言。当主播说“这套感觉不对”你能追问“是版型不对还是材质不对”然后对照表里的具体项去定位而不是两个人干瞪眼。提示验收时把图缩小到手机屏幕大小看一眼。直播观众看到的就是那个尺寸大图上看出来的细节问题在小尺寸下可能根本不存在反过来小尺寸下显得糊的大图再精致也没用。6. 从图片到直播画面落地环节那些没人提的细节6.1 分辨率、裁切与画面安全区出图和上播是两件事。我见过不少做得挺精致的虚拟服装一进直播间就出问题最常见的是裁切事故头被切了一半或者手伸到画面外。根源在于出图分辨率和上播画幅不匹配。出图时你习惯用竖构图人物从头到脚完整上播时画面是横的还要留出字幕区、礼物区、弹幕遮挡区。这两个画幅的差异必须提前算。我的做法是先定安全区在最终画幅上画出人物必须完整呈现的范围然后按这个范围反推需要出图的比例。一般我会把这个范围往外扩一圈作为出血区避免边缘裁切时出现硬边。另外人物在画面里的位置也要统一。每套衣服的立绘如果人物中心点不一样切换的时候人会“跳”。所以出图之后还要做一步对齐把所有姿态的脚底位置和身体中心线统一到同一个坐标系里。6.2 让静态图动起来的三条路径静态立绘在直播里会显得很死加一点动态是必须的。我试过三条路径各有适用场景第一条是分层绑定。把立绘拆成头部、身体、四肢、服装部件若干图层分别绑定骨骼做简单的呼吸、眨眼、发梢摆动。优点是资源小、实时性好、可控性强缺点是要手动拆图一套衣服拆下来大半天。第二条是短循环视频。用生成能力做几秒钟的循环动画直接当动态背景用。优点是效果自然、细节丰富缺点是文件大、循环接缝难处理、不好做交互响应。第三条是混合方案。主体用分层绑定保证响应性局部比如皮革的高光流动、发梢用短循环叠加。这是我目前用得最多的代价是合成流程复杂一点。不管走哪条路有一条原则是不变的先把静态图做到位再谈动态。静态不过关的图动起来只会把问题放大。6.3 素材命名与切换逻辑这一块听起来最没技术含量但它是数字衣橱能不能真正用起来的关键。我的命名规范是这样的{outfit_id}_{pose}_{expression}_{variant}.{ext} 示例 ly-0042_idle_neutral_a.png ly-0042_idle_smile_a.png ly-0042_wave_neutral_a.png ly-0042_sit_neutral_a.png规则很简单从左到右从稳定到易变。outfit_id最稳定放最前面variant最容易改放最后面。这样文件管理器里按名称排序同一套衣服的所有素材自动聚在一起找起来不用想。切换逻辑上我建议做一张切换表把“什么场景切什么图”写死。比如开场用idle_smile唱歌用idle_neutral互动用wave_smile休息用sit_neutral。写死的好处是直播时不用临场想手忙脚乱的时候不会点错。还有一个小细节切图要有过渡。硬切会显得很突兀加一个 0.2 到 0.3 秒的淡入淡出观感立刻不一样。这个在推流软件里加个转场就能实现成本几乎为零。7. 踩过的坑三次完整的排查记录7.1 皮革变成了塑料雨衣现象一批皮革裙出图整体发亮高光是一整片完全没有皮革的颗粒感看着像雨衣。排查链路第一步先怀疑提示词。把[材质]那段单独拎出来看发现我为了强调质感把光泽相关的词堆了三四个而且强度描述用了比较绝对的表达。这是最直接的可疑点。第二步做对照实验。保持其他所有条件不变只把光泽词删到只剩一个重跑十张。结果亮度明显下降但还是偏塑料。第三步怀疑材质档案的参数。查material_profile发现sheen被我设成了 0.7。这个值是之前调漆皮时留下的复制过来忘了改。降回 0.35。第四步补纹理描述。加了“细密颗粒”“低频深折痕”两个描述重跑。结果三步叠加之后塑料感消失。回头看主因是sheen参数错误提示词堆叠是次因纹理缺失是放大因素。三件事同时出问题所以一开始怎么调都不对。教训复制材质档案的时候一定要逐项检查数值不要整块复制。我后来养成了习惯新建条目时把material_profile逐字段念一遍。7.2 换装之后脸变了现象新做的一套皮革外套版型和材质都达到了预期但角色的脸明显比基准图窄眼距也变了。单看这张图没问题跟其他衣服放一起就露馅。排查链路第一步排除随机性。同一个配置跑二十张看脸的变化范围。结果发现二十张里有一半偏窄一半正常。说明不是固定偏移是约束不足。第二步检查角色适配模块的强度。发现这次为了突出服装细节我把角色模块的权重调低了。调回去重跑正常率上升到八成但还有两成偏。第三步怀疑素材本身。翻出训练素材看发现最近补进去的几张里有两张是侧四分之三角度、带轻微仰拍的。这个角度下人脸本来就显窄模型把它当成了特征。第四步把那两张素材剔除重新训练模块。结果重训之后二十张里十九张正常。教训素材库不是只进不出的。每次补素材都要重新审视整个库的一致性角度分布和拍摄参数要统一否则新素材会污染已有特征。7.3 拉链糊成一坨金属块现象前中拉链在整图里完全看不出齿状结构就是一条亮线放大之后是一团模糊的高光。排查链路第一步确认是分辨率问题还是描述问题。单独裁出拉链区域重绘描述里写清楚“齿状拉链、金属拉丝、每齿有独立高光”重绘后明显改善。说明是注意力分配问题不是能力问题。第二步确定重绘区域大小。一开始框得太小只框住拉链本身结果重绘后和周围接不上有一圈色差。扩大范围把拉链两侧各留出一段衣身接缝就自然了。第三步调整羽化。羽化太小有硬边太大又会把周围原本正常的细节糊掉。试了几档最后定在一个居中的值。结果拉链清晰可辨接缝无痕。教训局部重绘的区域边界永远要包含“问题的边缘之外的正常区域”。只框问题本身等于逼着模型在边界上做无缝拼接它做不到。7.4 三个坑的共同点回头看这三次表面上问题各不相同底层逻辑其实是同一个当你同时改动多个变量时你失去了定位能力。塑料化那次是参数、提示词、纹理三个变量同时错脸变形那次是权重和素材两个变量拉链那次是区域和羽化两个变量。所以我后来给自己定了一条规矩任何调整一次只动一个变量动完必须跑对照批次。这条规矩听着笨但它把“玄学调参”变成了“可复现的实验”。数字衣橱这种东西能复现比能出彩重要得多——出彩靠运气复现靠工程。8. 我个人跑下来最值钱的几条经验做这套皮革系列前后折腾了小半年最后沉淀下来的东西其实不多但每一条都是花时间换的。第一条先建表再出图。哪怕你现在只有三套衣服也先把字段表建起来。等到有三十套的时候再回头补你会发现前二十七套的数据全是残缺的补起来比重做还累。第二条材质和光照必须当成两个维度。把它们混在一起描述你永远不知道是哪一项在起作用。分开之后你会发现自己对材质的理解其实比想象中浅——很多你以为的“材质问题”其实是光照问题。第三条多用小图筛少用大图赌。一次跑二十张小图筛出三张比一次跑三张大图然后全废要划算得多。小图看的是大关系大关系不对细节再精致也救不回来。第四条一致性靠约束不靠运气。如果你发现某套衣服“刚好”角色很稳不要高兴太早去查一下是不是哪项约束偶然起了作用。找到那个约束把它写进流程下次主动用。第五条验收标准要写在纸上。脑子里的标准会随着疲劳漂移看第十张和看第一张的判断完全不是一回事。写下来逐项打勾能省掉大量返工。最后分享一个小技巧每套衣服定稿之后我会额外存一张“全家福”——把这套衣服的所有姿态和表情拼在一张图上。这张图有两个用处一是快速检查一致性二是给主播看的时候一目了然。做这张图花不了五分钟但它比任何文字说明都管用主播看一眼就知道这套衣服适不适合自己讨论效率高很多。至于衣橱接下来往哪扩我个人的想法是先把皮革这个品类的材质档案做厚——哑光、半光、做旧、漆皮四档跑通之后再往针织和丝绸上迁那时候结构层和角色层基本是全复用的只需要重做材质矩阵。这条路走起来会比现在轻松不少毕竟最难的已经被前面这几个月啃完了。