尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Unity实时口型同步插件 AudioToFace:音素分类驱动虚拟角色开口说话

Unity实时口型同步插件 AudioToFace:音素分类驱动虚拟角色开口说话 做数字人和虚拟主播的应该都体会过这种痛苦模型捏得再好看一开口说话嘴型和音频对不上整个角色就像在念经瞬间掉价。口型同步这件事看着只是一个小环节实际做起来坑特别多。我们当时在做一个虚拟形象直播项目试了一圈市面上已有的方案不是延迟太大、需要传云端处理就是本地跑出来的效果生硬嘴巴要么张不开要么乱动。折腾了两个月团队决定自己写一个 UnityEngine 的实时口型同步插件也就是 AudioToFace-For-Unity前后迭代了三个版本最终效果基本达到了“真实出声”的水准。这个项目从第一天起就定了一个基调必须开源。主要原因很实际——我们踩过的那些坑音素分类不准、混合形状命名不匹配、动画平滑参数调不好翻遍了官方文档和社区帖子都找不齐满意的答案所以很清楚这个领域缺一份能直接跑起来、还能按自己需求改的参考实现。现在仓库里代码完全开放使用 MIT 协议不管你是做独立游戏、虚拟主播、还是想做数字人客服都可以直接拉下来用或者基于它做二次开发。这篇文章就把整个插件的设计思路、核心算法、集成步骤、以及踩坑记录全部摊开讲一遍。适合三种人看一是只想快速给角色加上口型同步的 Unity 开发者二是做语音驱动动画方向、想参考技术方案的研究者三是打算给开源项目贡献代码的朋友。内容会尽量把“为什么这样做”讲清楚而不只是丢一堆 API 出来。1. 项目背景为什么现有的口型同步方案总让人不满意口型同步Lipsync本质上是个跨模态任务输入一段音频输出一组面部动画参数。听起来不复杂但真的把它拆开每一步都有讲究而且每一步都可能成为最终效果翻车的源头。1.1 常见实现路线的优缺点对比在决定自研之前我们认真对比了市面上主流的几条技术路线。这里挑典型方案说不针对任何具体产品只谈技术选型上的普适问题。基于音频能量/音高映射这是最朴素的一种根据音量大小或音高频率去驱动嘴巴的张合幅度。实现非常简单几行代码就能跑通适合做那种“嘴巴在动就行”的低保真需求。但问题也很明显它只能区分声音大小完全无法区分你是在说“啊”还是“咿”所以口型永远是同一个形状来回缩放看起来非常机械。这个方案的缺陷在于根本没有建模“内容”只是建模了“响度”。基于云端 AI 的口型生成近年很多大厂方案走这条路上传音频到云端服务端用神经网络推理出带表情的口型数据再返回客户端播放。效果确实好能精确到音素级别甚至能自动配表情。但致命伤是依赖网络一来一回就有可见延迟对于实时直播、本地渲染的场景非常不友好另外有些方案按调用次数收费用得越多成本越高还有音频数据上云的隐私顾虑不适合做商业产品落地。基于音素的本地实时分类这是我们认为最合理的路线。在本地用轻量模型把音频分类成音素比如元音、辅音再把音素映射到角色的混合形状Blend Shapes权重上直接驱动模型。它兼顾了实时性、可控性和隐私性不需要把数据传出去效果的上限取决于音素分类器的准确率和后面那套平滑策略。AudioToFace-For-Unity 就是走这条路线。对比完之后答案就清楚了我们需要的是一个能离线实时跑、准确率还行、还能自己调整映射关系的方案。市面上的方案各有取舍但要么闭源没法改要么依赖太重的运行时环境很难直接嵌入到一个面向多平台的 Unity 项目里。1.2 从需求到立项我们要解决哪些具体问题立项时我们就把需要解决的问题拆成了四个部分第一音素识别要准。角色说“a、o、e”的时候嘴型得有区别不能都糊成同一个形状。这对模型在噪声环境下的鲁棒性要求比较高尤其是用麦克风输入时房间回声、键盘声都可能干扰识别。第二动画要平滑不抽搐。音素切换得非常快尤其是语速快的人如果直接把每一帧的音素结果赋值给混合形状角色嘴巴就会像抽搐一样疯狂抖动。必须要有合理的平滑策略让口型变化有“连读”的感觉而不是一个字一个字崩出来。第三延迟要可感知、可补偿。音频采集、特征提取、模型推理、动画播放这条链路每一步都会引入延迟累积下来可能达到一两百毫秒。观众看到的结果就是“声音已经出来了嘴还没动”。抵消这种不可接受的延迟感要么靠优化链路减少延迟要么精确测量总延迟并做时间补偿。第四跨 Unity 项目要容易接入。每个项目的模型、混合形状命名、资产结构都不一样插件如果绑死某一个特定模型那就没有通用性。我们必须提供一套可配置的映射机制让使用者可以快速把插件适配到自己的角色上。这四个问题每一个单拿出来都不算特别难但组合在一起又要在 Unity 的生态里高效跑起来就值得从零写一套了。开源的意义也在于此——我们把解决方案完整暴露出来其他人不用再把这条路重新走一遍。2. 核心思路拆解音频到口型的完整链路插件的技术架构可以分成四条链路分别对应“听得见、听得懂、说得准、演得好”四个环节。音频输入、特征提取、音素分类、口型驱动每一环都在前一层的基础上加工并且每一环都有独立的可替换接口。2.1 音频采集与预处理给模型“干净”的输入音频输入支持两种主流方式一是直接监听麦克风设备二是播放一个 AudioSource 的音频片段。前者适用于虚拟主播、实时音视频通话场景后者适用于剧情对话、过场动画等离线生成场景。采集到的是 PCM 音频流常见采样率 44100Hz 或 48000Hz。但我们发现直接把这么高采样的数据送入音素分类模型不但计算量大而且低频段的音素特征并不会因为高采样率而变得更容易区分。所以在特征提取之前我们会先把音频降采样到 22050Hz这个频率已经能完整覆盖语音信号的有效频段语音能量主要集中在 300Hz-3400Hz 之间又能省掉一半以上的计算量。接下来是分帧。音频流被切成一小帧一小帧每帧默认长度 480 个采样点对应 22050Hz 采样率下大概 21.7 毫秒。同时设置帧移hop size为 160 个采样点即相邻两帧有 2/3 的重叠。为什么要做重叠因为语音是连续信号某个音素的声学特征会跨越多帧如果不重叠、直接切块就会把一些过渡音切断分类器很难学到稳定的上下文特征。预处理完毕后提取梅尔频谱特征作为分类模型的输入。梅尔频谱把声学频率映射到人耳感知的等距尺度上在语音识别领域已经被验证是非常有效的特征表示。默认用 40 个梅尔滤波器组配合预加重、窗函数处理最终每帧得到一个 1x40 的特征向量序列。这里有个很关键的调优点不同语言、不同性别的发音习惯差异很大。中文普通话有 23 个声母、24 个韵母和英文的元音辅音体系不完全对应。如果模型只针对英文训练拿来识别中文准确率会明显下降。所以我们内置了两套音素表一套以英语音素基于 CMU 音素集为主一套是面向中文普通话的简化音素映射。两条路线共用同一个特征提取流程只是分类模型的输出空间不同。使用者可以根据项目语言选择对应的模型文件。2.2 音素分类轻量模型如何在本地快速推理音素分类是整条链路里技术含量最高的部分也是影响口型最终效果的决定性因素。我们评估过几种方案包括传统隐马尔可夫模型、循环神经网络 LSTM、以及一维卷积网络最后选了 CNN 架构主要原因是它在语音短序列分类任务上准确率高、推理速度快、部署简单。模型结构并不复杂输入是上一步提取的梅尔频谱特征经过几层一维卷积提取局部时频特征再接一个全局池化层最后经过两个全连接层输出一个概率分布向量向量的每个维度对应一个音素类别。全部参数加上模型权重量化后大约只有 2-3MB在移动端 CPU 上推理一次只需要 4-8 毫秒完全满足实时性需求。训练数据来自几个开源语音数据集的开源子集加上我们自己录制的普通话和英语语音共约 20 小时。训练时做了速度扰动0.9x、1.0x、1.1x和噪声注入混入白噪声、咖啡馆噪声让模型对语速变化和嘈杂环境有更好的容忍度。验证集上的音素分类准确率大约是 86%单看数字不算惊艳但考虑到口型同步并不需要 100% 精确识别每一个音素——人眼对口型的容忍度其实蛮高只要大的元音口型能对上辅音略有偏差不影响主观体验。这个权衡很重要。如果一开始就追求 95% 以上准确率模型复杂度会急剧上升推理延迟会翻好几倍反而得不偿失。语音交互产品追求准确实时翻译但口型同步更看重“视觉上足够自然”两者对精度的要求其实是两个量级。2.3 音素到口型姿态的映射与平滑策略拿到音素分类结果之后下一步不是直接驱动模型而是做映射和平滑。我们参考视觉设计里“少即是多”的原则把口型姿态限制在有限的几个关键形状内而不是为每一个音素都生成完全不同的嘴型。插件内置的映射表把音素分成 7 组基础口型姿态A张嘴、I咧唇、U收圆、E扁唇、O圆唇开口、M双唇闭合、F上齿咬下唇。这张表在PhonemeMapping类里以 JSON 格式存储使用者可以随时增删或调整。中英文音素最终都会落到这 7 个姿态上只是映射权重不同。比如中文韵母“a”对应 A 姿态权重 0.9、O 姿态权重 0.1英文音素 “ey” 对应 E 姿态权重 0.6、I 姿态权重 0.4。直接按分类结果逐帧赋值会产生口型剧烈跳变的问题。我们用了指数移动平均EMA做平滑公式是currentWeight alpha * targetWeight (1 - alpha) * currentWeightalpha 的默认值是 0.35你可以在 Inspector 面板实时调整。alpha 越大口型反应越快但抖动越明显alpha 越小口型过渡越柔和但会显得“嘴懒”。实际项目里alpha 取 0.3-0.4 之间视觉上比较均衡。另外我们还加了一个“最小变化阈值”只有当某个口型姿态的权重变化超过 0.02 时才真正触发混合形状更新进一步过滤掉微小的随机抖动避免角色嘴巴出现高频颤振。延迟补偿也是在这一层做的。插件会持续统计从音频输入到口型驱动之间的总延迟一旦发现口型输出落后于音频播放超过一个阈值默认 3 帧视频时间约 50ms就自动把分类结果的时间戳往后对齐让口型和声音在视觉观察上“同时”发生。这个能力在直播场景中尤其重要因为音频采集链路本身就有固定延迟不做补偿的话无论你怎么调平滑参数看起来都是“慢半拍”。3. 实操把 AudioToFace-For-Unity 集成到你的 Unity 项目理论说完了进入真正能动手的部分。这一节会带你从零开始把一个普通 Unity 角色变成能实时对口型说话的虚拟形象。整个集成过程大概需要 30 分钟其中大部分时间花在配置混合形状的映射上。3.1 安装与前置条件插件支持 Unity 2021.3 及以上版本建议使用 Unity 2022 LTS内置的配置文件管理、序列化机制更稳定。安装方式推荐直接用 Unity Package Manager 从 Git URL 拉取仓库地址在项目的 README 里写得很清楚。也可以直接把整个Assets/AudioToFace目录拷进你的项目两种方式效果一样。前置条件有三个角色模型必须带有面部混合形状Blend Shapes也就是 SkinnedMeshRenderer 的 BlendShape 通道项目里至少要有一个音频输入源麦克风设备或 AudioSource角色的面部材质建议支持 PBR 或卡通渲染均可这个不影响口型逻辑。这里提醒一下如果模型是用 DAZ、CC3 这类工具导出的通常已经带了一套命名标准的面部混合形状如果是从引擎商店买的低模角色可能根本没有任何口型相关的 Blendshape。遇到这种情况你需要在建模软件里先补上面部变形目标或者在角色上换一个带面部 Blendshape 的模型光靠插件是没办法凭空生成嘴型的。3.2 快速集成驱动第一个角色口型集成流程分五步跟着走就能跑通。第一步创建音频输入模块。在场景里新建一个空物体AudioManager挂上MicrophoneAudioInput或AudioSourceInput脚本。前者会启动麦克风录制后者需要你在 Inspector 里指定一个 AudioSource 并将音频片段拖进去。如果不想让声音“外放”到场景里可以把 AudioSource 的outputAudioMixerGroup设为静音或者直接勾选ignoreListenerVolume。第二步添加口型同步核心组件。在角色模型所在的物体上挂载LipsyncManager。这个组件是插件的大脑负责拉取音频特征、推理音素、计算口型权重。第三步配置混合形状。LipsyncManager 的 Inspector 面板里有一张映射表字段是 7 个口型姿态A、I、U、E、O、M、F每个字段可以填入对应的 Blendshape 名称或索引。你的模型里如果没有完全对应的就填最接近的那个比如没有“F上齿咬下唇”可以留空不填插件会自动忽略。第四步绑定数据源。在 Inspector 里把audioInput字段拖入第一步创建的音频输入模块点击 Play说话测试。这时角色应该已经能跟着你的声音动嘴了。如果没反应检查控制台日志插件会输出当前识别到的音素类别方便定位问题。第五步微调参数。主要调节两个量smoothingAlpha决定口型反应速度和顺滑度voicePitchShift用于处理变声器输入很多虚拟主播会用变声器如果不调整基频分类器容易把声音识别得乱七八糟。实测下来变声程度越大越需要把voicePitchShift调高同时把 alpha 往小调一点否则口型会有一种“含了口水”的黏腻感。核心代码就一小段把整体流程串起来看会非常直观// 初始化音频输入与推理引擎 _lipsync GetComponentLipsyncManager(); _audioInput GetComponentMicrophoneAudioInput(); _audioInput.Initialize(); _lipsync.Initialize(_audioInput.AudioConfig); // Update 中持续驱动口型 void Update() { if (_audioInput null || _lipsync null) return; _audioInput.ProcessFrame(); float[] features _audioInput.GetLatestFeatures(); if (features ! null) { var phonemeDist _lipsync.ClassifyPhonemes(features); _lipsync.ApplyVisemes(phonemeDist); } }3.3 高级参数与性能调优插件暴露的参数不多但每一个都值得认真调。下面这张表是我们在两个典型平台上实测得到的最佳参数组合可以直接参考参数含义PC 端推荐值移动端推荐值sampleRate降采样后的音频采样率22050 Hz22050 HzframeLength单帧采样点数480480hopSize帧移160160smoothingAlphaEMA 平滑系数0.350.25minChangeThreshold最小权重变化阈值0.020.03delayCompensation延迟补偿毫秒50ms80msinferenceTarget推理后端CPU/GPUCPUCPU移动端推荐更高的minChangeThreshold因为手机 CPU 在省电模式下性能波动大如果模型推理偶尔慢了半拍小权重变化反映到画面上就是抖动明显提高阈值能把这部分“毛刺”过滤掉。性能方面插件整体开销很低。在华为 Mate 50 这类设备上整个音频处理链路含特征提取和模型推理大约占用 10%-12% 的单核 CPU内存占用约 80MB主要是模型加载和 Unity 的音频缓冲。在桌面上几乎可以忽略不计i5-12400 上跑 4K 渲染同时开着摄像头口型驱动CPU 占用峰值也没超过 5%。如果你希望优化启动速度可以启用模型的懒加载模式。插件默认在Start()时加载全部模型文件如果你使用多个语言模型可以在首次需要时才加载具体模型把冷启动时间从 1.5 秒压到 0.3 秒左右。打开LipsyncConfig里的lazyModelLoad开关即可。4. 代码结构解析与二次开发指南开源项目的价值不只在于“能用”更在于“能改”。这一节带你读懂代码结构知道哪些地方可以接自己的逻辑。4.1 核心模块与数据流插件代码全部在Assets/AudioToFace/目录下包含四个核心模块AudioInput 模块管理音频设备的打开与关闭、音频数据读取、降采样与特征提取。接口是抽象的所以你可以不用麦克风改成读取网络音频流或者从本地文件批量读取。PhonemeInference 模块封装模型加载与推理。目前支持两种后端ONNX Runtime 和 Unity 自带的 Barracuda。ONNX 运行时在 PC 上性能更好Barracuda 的优势是可以充分利用 GPU且兼容性更好尤其在 WebGL 和移动端。你可以在配置里切换后端不用改任何上层代码。VisemeMapping 模块负责把音素概率分布转换为口型权重。这里是查表逻辑与平滑算法的所在也是大多数二次开发的落点。LipsyncManager对外统一 API把上面三个模块串起来。使用者通常只需要跟这个类打交道。数据流是这样的音频输入模块每帧产出梅尔频谱特征 → 推理模块把特征转换为音素概率向量比如{a: 0.6, i: 0.1, u: 0.2, ...}→ 映射模块把这个向量和当前权重做混合得到每个口型姿态的最终权重 → 驱动 SkinnedMeshRenderer 上的对应混合形状。4.2 如何替换音素分类模型模型文件放在Plugins/Models/目录下文件名后缀区分语言种类。如果你想换成自己训练的模型只需要保证你的模型输入、输出格式和现有约定一致输入是[1, frameCount, 40]的梅尔频谱张量输出是[1, numPhonemes]的概率分布。如果你的模型输出的是 39 个英语音素的概率那映射表会自动匹配到对应的口型姿态。替换方法很简单把你的 ONNX 模型文件放进模型目录然后在PhonemeInferenceConfig里把modelPath指过去再把numPhonemes改成你的模型类别数插件会自动做索引对应。如果你用了完全不同的输入特征比如 MFCC 而非梅尔频谱就需要改一下AudioFeatureExtractor它的接口是独立的一个类不影响其他模块。这里强烈建议如果你用自己训练的模型先在离线测试集上跑一遍确认准确率不低于现有默认模型的水平再上真机。因为音素分类的错误会在后续映射中被放大——一个高置信度的错误分类比十个低置信度的正确分类对观感的影响更大。4.3 自定义口型映射规则映射表是一个 JSON 文件结构非常清晰{ phonemeGroups: { A: [aa, ae, ah, a], I: [ih, iy, i], U: [uh, uw, u], E: [eh, er, e], O: [ao, ow, o], M: [b, p, m], F: [f, v, th] }, weights: { aa: {A: 0.9, O: 0.1}, ih: {I: 0.7, E: 0.3} } }phonemeGroups定义了音素到口型的粗分类weights定义了精确到每个音素的权重分配。这样做的好处是默认情况下插件用粗分类就能工作而当某个音素需要特别精细的口型控制时你可以为它单独特化权重。比如中文的“鱼”ü这个音它在普通话里是“撮口呼”的典型代表口型介于 U 和 I 之间默认映射表给它分配的是 U:0.6、I:0.4如果你觉得不够像可以改成 U:0.4、I:0.6效果立刻就能在测试中看到。直接编辑 JSON 文件是最灵活的方式但如果你不想碰配置文件也可以在代码里重写OnVisemeMappingCustomize回调自己在运行时动态调整权重适合做诸如情绪影响口型的进阶效果。5. 常见问题与排查技巧实录开发过程中收集了不少使用者反馈整理出几个高频问题每个都是真实的坑值得认真看。5.1 口型对不上声音已经出来了嘴还没动绝大多数情况是延迟补偿没配置好。先检查delayCompensation的设置如果当前音频链路的延迟超过了默认的 50ms就需要调大。怎么测这个延迟在麦克风前面拍一下手同时看插件的调试日志里“time offset”字段的数值。如果你用的是 USB 麦克风或蓝牙耳机这个值通常会比板载声卡高一截需要手动往上调整。另一种可能音频输入模块没有正确同步渲染管线。LipsyncManager 的UpdateMode有Update、LateUpdate和Manual三种如果你在代码里用协程控制面部动画建议改成Manual模式手动在协程里调用ApplyVisemes避免驱动顺序混乱。5.2 口型抖动像在快速念绕口令口型抖动几乎都是平滑参数设置不当。先看minChangeThreshold是不是太小它过滤的是微小的权重变化默认 0.02 已经比较激进了如果再小任何一点噪声都能触发动画变化。把它调到 0.04 试一下。如果还抖再调smoothingAlpha往 0.2 方向降低。这个参数直接决定口型的“收缩速度”越小越稳定但注意也别调太低低于 0.15 时嘴巴会明显跟不上语速看起来像在慢放。最后确认你的角色模型的混合形状驱动区域没有叠加额外的动画层。很多模型带有人物走路、说话待机动画如果这些动画也驱动了同一批混合形状和插件的权重互相叠加就会出现严重的抖动和冲突。解决办法是把待机动画中涉及面部的通道全部在动画资产里清空或者用 Animator 层的优先级把插件的权重设为最高。5.3 混合形状设置了却没反应先检查命名匹配再做索引匹配调试。插件支持名称和索引两种匹配方式如果填名称没反应试试直接填混合形状的索引。有些模型的混合形状名称包含特殊字符或者多语言前缀编辑器面板直接显示的名称和代码里实际的索引可能对不上这时候用索引最省事。检查完毕仍然没反应大概率是驱动的对象不对。SkinnedMeshRenderer 组件可能有多个确认你挂载的lipsyncManager指向的是包含口型 Blendshape 的那个 Renderer而不是格子的发型或者衣服。一句话总结如果你能看到模型动但嘴巴不动那 90% 是 Renderer 引用错误。5.4 模型加载时报错或推理卡顿报错通常有三种。一是模型文件损坏或分辨率不匹配从 GitHub 重新克隆最新代码即可二是推理后端没选对PC 上如果 ONNX Runtime 初始化失败切到 Barracuda 后端再用三是移动端内存不足ONNX 模型默认全部加载进内存可以打开量化选项把模型压缩到原来的三分之一左右。卡顿问题优先排查是否是主线程阻塞。默认推理在异步线程中执行但如果你手动设置了inferenceOnMainThread true就会在主线程做模型推理PC 端还好移动端一旦模型推理耗时超过 16ms帧率直接掉穿。建议保持异步模式如果推理线程 CPU 占用太高可以考虑在移动端使用更小的模型配置。5.5 常见问题速查表症状可能原因快速解法口型明显延迟延迟补偿不够调大 delayCompensation 至 80-120ms口型抖动频繁平滑参数太小或待机动画冲突调大 minChangeThreshold清理动画通道部分口型形状不变化Blendshape 名称/索引匹配错误改用索引匹配核对 Renderer 引用完全没有口型音频输入未正确初始化检查日志确认设备/音频源已启动移动端卡顿推理在主线程执行保持异步模式启用模型量化变声以后口型乱基频偏移导致分类不准调整 voicePitchShift 参数配合降噪6. 开源计划的背后为什么愿意把代码开源出来项目开源的决定不是拍脑袋做出的。我们本身也是开源社区的深度受益者团队日常用的 Unity 生态工具、C# 库、数据集标注脚本很多都来自别人的无偿分享。七年前我刚接触 Unity 时好多疑问都是靠搜帖子、翻仓库解决的连基础的口型同步都是抱着某个老外写的小插件一点点啃下来的。现在自己有了能力也该把成品回馈给社区。更重要的是这条路远没有到终点。音素分类的准确率还有很大的提升空间尤其在不同口音、多语种混合对话场景下模型经常会有力不从心的时候。形变权重映射目前主要依赖手工经验我们正在尝试让它自动适配不同面部拓扑结构。还有表情联动——口型同步和情感表达结合才能让虚拟角色真正“活”起来这需要更多真实数据的支撑。单个团队的力量有限但开源之后大家一起来踩坑、来补充这个项目才能长成我们期待的样子。7. 参与方式与后续路线图如果你觉得这个项目有价值参与方式有很多种门槛都不高。提交 Issue 是最简单的参与方式使用过程中遇到任何问题把复现步骤、Unity 版本、平台信息、日志片段贴到仓库 Issues 区即可。对开源项目来说一个好的 bug 报告和一段修复代码同等重要它不仅帮助维护者定位问题也为后来遇到同样问题的人留下了检索痕迹。提交 Pull Request 贡献代码仓库的贡献指南文件里写了推荐的代码风格和提交流程。对于新手贡献者建议先挑“good first issue”清单里的任务练手这些任务通常范围明确、不需要动核心架构比如补充某段代码的 XML 注释、增加单元测试覆盖某个边界参数、或者优化某个模型的后处理逻辑。独立完成一个 PR 并在讨论中被合并是一个很有成就感的起点。模型与测试数据的贡献同样急需我们特别欢迎不同语言的录音样本尤其是小语种和带口音的普通话样本。语音领域有一个无法回避的问题——高质量数据永远是稀缺的。如果你手头有合法授权的对话数据愿意脱敏后共享出来这比写一段代码的贡献还要大。后续路线图主要围绕三个方向第一音素分类模型从静态压缩包升级为动态可微调结构让使用者可以用自己的数据在本地继续训练第二增加对骨骼驱动口型的支持不依赖 Blendshape不少卡通角色用的是一套控制器驱动骨骼网架第三提供 Blender 建模插件自动为任意角色网格生成规范的混合形状从源头解决“模型没有可用 Blendshape”的卡脖子问题。如果对某个方向感兴趣欢迎直接在仓库里发起讨论或者在社区群里和我们联系。开源项目的生命力就来自于参与者的每一次提问、每一条 PR、每一份数据。如果这个仓库能让你在开发虚拟角色时少掉几根头发那就够了。最后分享一个使用上的个人体会口型同步这类效果集成最容易忽略的不是技术参数而是和动画系统的配合。哪怕是插件调试得非常完美只要 Animator 上挂了任何带面部通道的动画层它都能给你整出奇怪的效果。我们自己在多个项目里踩过这个坑所以真心建议大家在集成前先花十分钟把角色身上的动画资产清理一遍——这比多调一个小时参数管用得多。
返回列表