如何使用该插件
本指南将引导您完成为MetaHuman角色设置Runtime MetaHuman Lip Sync的过程。
注意: Runtime MetaHuman Lip Sync同时支持MetaHuman和自定义角色。该插件兼容多种角色类型,包括:
- 热门商业角色(Daz Genesis 8/9、Reallusion CC3/CC4、Mixamo、ReadyPlayerMe等)
- 具有FACS基础混合变形的角色
- 使用ARKit混合变形标准的模型
- 采用Preston Blair音素集的角色
- 3ds Max音素系统
- 任何带有自定义面部表情变形目标的角色
有关设置自定义角色的详细说明,包括上述所有标准的视位映射参考,请参阅自定义角色设置指南。
先决条件
开始之前,请确保:
- 项目中已启用MetaHuman插件(注意:从UE 5.6开始,此步骤不再需要,因为MetaHuman功能已直接集成到引擎中)
- 您至少下载了一个MetaHuman角色并在项目中可用
- 已安装Runtime MetaHuman Lip Sync插件
标准模型扩展插件
如果您计划使用标准(更快)模型,则需要安装扩展插件:
- 从Google Drive下载标准唇形同步扩展插件
- 将下载的压缩包中的文件夹 解压到项目的
Plugins
文件夹中(如果该文件夹不存在,请创建) - 确保您的项目设置为C++项目(即使您没有任何C++代码)
- 重新构建项目
- 此扩展仅在您想使用标准模型时需要。如果只需要真实模型,可以跳过此步骤。
- 有关如何手动构建插件的更多信息,请参阅构建插件教程
其他插件
- 如果您计划使用音频捕获(例如麦克风输入),请安装 Runtime Audio Importer 插件。
- 如果您计划将文本转语音功能与我的插件配合使用(您可能有自己的自定义TTS或其他音频输入),那么除了 Runtime Audio Importer 插件外,还需安装:
- 对于本地TTS,安装 Runtime Text To Speech 插件。
- 对于外部TTS提供商(ElevenLabs、OpenAI),安装 Runtime AI Chatbot Integrator 插件。
平台特定配置
Android / Meta Quest 配置
如果您针对Android或Meta Quest平台,并在使用此插件时遇到构建错误,您需要在项目设置中禁用x86_64(x64)Android架构:
- 转到 编辑 > 项目设置
- 导航至 平台 > Android
- 在 平台 - Android 下的 构建 部分,找到 支持 x86_64 [即 x64] 并确保其已禁用,如下所示
这是因为该插 件目前仅支持Android / Meta Quest平台的arm64-v8a和armeabi-v7a架构。
设置流程
步骤1:定位并修改面部动画Blueprint
- UE 5.5及更早版本(或UE 5.6+中的传统MetaHumans)
- UE 5.6+ MetaHuman Creator角色
您需要修改一个将用于MetaHuman角色面部动画的动画Blueprint。默认的MetaHuman面部动画Blueprint位于:
Content/MetaHumans/Common/Face/Face_AnimBP
您有以下几种实现唇形同步功能的选择:
- 直接编辑默认资产(最简单选项)
- 创建副本
- 使用自定义动画Blueprint
直接打开默认的Face_AnimBP
并进行修改。任何更改都会影响所有使用此动画Blueprint的MetaHuman角色。
注意: 这种方法虽然方便,但会影响所有使用默认动画Blueprint的角色。
- 复制
Face_AnimBP
并为其指定一个描述性名称 - 找到您角色的Blueprint类(例如,对于角色"Bryan",路径为
Content/MetaHumans/Bryan/BP_Bryan
) - 打开角色Blueprint并找到Face组件
- 将Anim Class属性更改为您新复制的动画Blueprint
注意: 这种方法允许您为特定角色自定义唇形同步,同时保持其他角色不变。
您可以在任何能够访问所需面部骨骼的动画Blueprint中实现唇形同步混合:
- 创建或使用现有的自定义动画Blueprint
- 确保您的动画Blueprint使用的骨架包含与默认MetaHuman的
Face_Archetype_Skeleton
相同的面部骨骼(这是所有MetaHuman角色使用的标准骨架)
注意: 这种方法为您提供了与自定义动画系统集成的最大灵活性。
从UE 5.6开始,引入了新的MetaHuman Creator系统,该系统创建的角色不再使用传统的Face_AnimBP
资产。对于这些角色,插件提供了一个面部动画Blueprint,位于:
Content/LipSyncData/LipSync_Face_AnimBP
:::警告 重要提示 此动画Blueprint位于插件的内容文件夹中,每次插件更新时会被覆盖。为防止丢失自定义设置,强烈建议您:
- 将此资产复制到项目的Content文件夹中(例如复制到
YourProject/Content/MetaHumans/LipSync_Face_AnimBP
) - 在角色设置中使用您复制的版本
- 所有修改都在复制的版本上进行
这样可以确保您的唇形同步配置在插件更新后仍然保留。 :::
使用插件的面部动画Blueprint:
- 找到您的MetaHuman Creator角色Blueprint类
- 打开角色Blueprint并找到Face组件
- 将Anim Class属性更改为插件的
LipSync_Face_AnimBP
- 继续执行步骤2-4来配置Runtime MetaHuman Lip Sync功能
替代选项:
- 使用旧版说明: 如果您正在使用旧版MetaHumans或偏好传统工作流程,仍可按照上述UE 5.5的说明操作
- 创建自定义动画Blueprint: 创建您自己的动画Blueprint,与MetaHuman Creator的骨骼结构配合使用
注意: 如果您使用UE 5.6+但处理的是旧版MetaHumans(非通过MetaHuman Creator创建),请改用"UE 5.5及更早版本"标签页中的说明。
重要提示: Runtime MetaHuman Lip Sync混合可以在任何动画Blueprint资产中实现,只要该资产能够访问包含默认MetaHuman的Face_Archetype_Skeleton
中面部骨骼的姿势。您不仅限于上述选项——这些只是常见的实现方法。
步骤2:事件图表设置
打开您的面部动画Blueprint并切换到Event Graph
。您需要创建一个生成器来处理音频数据并生成唇形同步动画。
- 标准(更快)模型
- 真实(更高质量)模型
- 如果尚不存在,添加
Event Blueprint Begin Play
节点 - 添加
Create Runtime Viseme Generator
节点并将其连接到Begin Play事件 - 将输出保存为变量(例如"VisemeGenerator")以便在图表其他部分使用
- 如果尚不存在,添加
Event Blueprint Begin Play
节点 - 添加
Create Realistic MetaHuman Lip Sync Generator
节点并将其连接到Begin Play事件 - 将输出保存为变量(例如"RealisticLipSyncGenerator")以便在图表其他部分使用
- (可 选)使用Configuration参数配置生成器设置
- (可选)在Realistic MetaHuman Lip Sync Generator对象上设置Processing Chunk Size

注意: Realistic Model 专门针对 MetaHuman 角色进行了优化,不兼容自定义角色类型。
配置选项
Create Realistic MetaHuman Lip Sync Generator
节点接受一个可选的 Configuration 参数,允许您自定义生成器的行为:
模型类型
Model Type 设置决定使用哪个版本的写实模型:
模型类型 | 性能 | 视觉质量 | 噪音处理 | 推荐使用场景 |
---|---|---|---|---|
Highly Optimized (默认) | 最高性能,最低CPU占用 | 良好质量 | 可能在背景噪音或非语音声音下显示明显的嘴部动作 | 纯净音频环境,性能关键场景 |
Optimized | 良好性能,中等CPU占用 | 高质量 | 对噪音音频有更好的稳定性 | 平衡性能与质量,混合音频条件 |
Original Unoptimized | 适合在现代CPU上实时使用 | 最高质量 | 对背景噪音和非语音声音最稳定 | 高质量制作,嘈杂音频环境,需要最大精度时 |
性能设置
Intra Op Threads: 控制用于内部模型处理操作的线程数。
- 0 (默认/自动): 使用自动检测(通常为可用CPU核心数的1/4,最多4个)
- 1-16: 手动指定线程数。在多核系统上较高值可能提升性能但会增加CPU占用
Inter Op Threads: 控制用于并行执行不同模型操作的线程数。
- 0 (默认/自动): 使用自动检测(通常为可用CPU核心数的1/8,最多2个)
- 1-8: 手动指定线程数。实时处理时通常保持较低值
使用配置
配置生成器的步骤:
- 在
Create Realistic MetaHuman Lip Sync Generator
节点中,展开 Configuration 参数 - 设置 Model Type 为您偏好的选项:
- 使用 Highly Optimized 获得最佳性能(推荐大多数用户使用)
- 使用 Optimized 获得平衡的性能与质量
- 仅当最高质量至关重要时使用 Original Unoptimized
- 根据需要调整 Intra Op Threads 和 Inter Op Threads(大多数情况下保持0自动检测) 性能推荐:
- 对于大多数具有清晰音频的项目,使用高度优化模型以获得最佳性能
- 如果处理的音频包含背景噪音、音乐或非人声,考虑使用优化或原始未优化模型以获得更好的稳定性
- 高度优化模型在处理非人声音频时可能显示细微的嘴部动作, 这是由于模型创建过程中应用的优化技术所致
- 原始未优化模型虽然需要更多CPU资源,但在现代硬件上仍适用于实时应用,并且在具有挑战性的音频条件下提供最准确的结果
- 仅在遇到性能问题或有特定优化需求时调整线程数
- 更高的线程数并不总是意味着更好的性能 - 最佳值取决于您的具体硬件和项目需求
处理块大小配置: 处理块大小决定了每个推理步骤中处理的样本数量。默认值为160个样本,对应于16kHz(内部处理采样率)下10ms的音频。您可以调整此值以平衡更新频率和CPU使用率:
- 较小的值提供更频繁的更新但会增加CPU使用率
- 较大的值减少CPU负载但可能降低唇形同步的响应速度
设置处理块大小:
- 访问您的
Realistic MetaHuman Lip Sync Generator
对象 - 找到
Processing Chunk Size
属性 - 设置您想要的值
建议使用160的倍数。这与模型的内部处理结构对齐。推荐值包括:
160
(默认,最小推荐值)320
480
640
- 等等
默认的160
样本处理块大小对应于16kHz下10ms的音频。使用160的倍数可以保持与这个基本单位的对齐,有助于优化处理效率并保持不同块大小下的一致行为。
为了确保真实模型的可靠和一致运行,必须在每次经过一段不活动期后想要输入新音频数据时重新创建Realistic MetaHuman Lip Sync Generator。这是由于ONNX运行时的行为可能导致在静默期后重用生成器时唇形同步停止工作。
示例场景: 如果您执行了TTS唇形同步然后停止,稍后想要用新音频再次执行唇形同步,应创建一个新的Realistic MetaHuman Lip Sync Generator而不是重用现有的。
步骤3:设置音频输入处理
您需要设置一个方法来处理音频输入。根据您的音频源有几种不同的方法可以实现。
- 麦克风 (实时)
- 麦克风 (回放)
- 文本转语音(本地)
- 文本转语音 (外部API)
- 从音频文件/缓冲区
- 流式音频缓冲区
该方法在对着麦克风说话时实时执行唇形同步:
- 标准 (更快) 模型
- 真实 (更高质量) 模型
- 使用 Runtime Audio Importer 创建一个 Capturable Sound Wave
- 在开始捕获音频前,绑定到
OnPopulateAudioData
委托 - 在绑定的函数中,调用 Runtime Viseme Generator 的
ProcessAudioData
- 开始从麦克风捕获音频
真实模型使用与标准模型相同的音频处理流程,但使用 RealisticLipSyncGenerator
变量而非 VisemeGenerator
。
在标准模型的所有示例中,只需替换:
VisemeGenerator
替 换为你的RealisticLipSyncGenerator
变量- 函数名称和参数在两种模型间保持完全一致
该方法从麦克风捕获音频,然后通过唇形同步进行回放:
- 标准 (更快) 模型
- Realistic (Higher Quality) Model
- 使用 Runtime Audio Importer 创建一个 Capturable Sound Wave
- 开始从麦克风捕获音频
- 在回放可捕获音波前,绑定到其
OnGeneratePCMData
委托 - 在绑定的函数中,调用 Runtime Viseme Generator 的
ProcessAudioData
真实感模型采用与标准模型相同的音频处理流程,但使用RealisticLipSyncGenerator
变量而非VisemeGenerator
。
在标准模型的所有示例中,只需替换以下内容:
- 将
VisemeGenerator
替换为您的RealisticLipSyncGenerator
变量 - 两种模型的函数名称和参数保持完全一致
注意: 若需处理更小音频块以实现更灵敏的口型同步,可调整SetNumSamplesPerChunk
函数中的计算。例如,将采样率除以150(约每6.67毫秒流式传输)而非100(每10毫秒流式传输),将提供更频繁的口型同步更新。
- 常规模式
- 流式处理
该方法通过文本合成语音并执行口型同步:
- 标准(更快)模型
- 真实感(更高质量)模型
- 使用Runtime文本转语音从文本生成语音
- 使用Runtime音频导入器导入合成音频
- 在播放导入的声波前,绑定到其
OnGeneratePCMData
委托 - 在绑定函数中调用Runtime口型生成器的
ProcessAudioData
由于ONNX运行时冲突,Runtime文本转语音插件提供的本地TTS目前不支持真实感模型。如需在真实感模型中使用文本转语音,建议使用外部TTS服务(如通过Runtime AI聊天机器人集成器接入OpenAI或ElevenLabs),或改用标准模型。
注意: 若 需处理更小音频块以实现更灵敏的口型同步,可调整SetNumSamplesPerChunk
函数中的计算。例如,将采样率除以150(约每6.67毫秒流式传输)而非100(每10毫秒流式传输),将提供更频繁的口型同步更新。
该方法使用流式文本转语音合成技术并配合实时唇形同步:
- 标准(更快)模型
- 真实(更高质量)模型
- 使用 Runtime Text To Speech 从文本生成流式语音
- 使用 Runtime Audio Importer 导入合成音频
- 在播放流式声波前,绑定到其
OnGeneratePCMData
委托 - 在绑定的函数中,调用 Runtime Viseme Generator 的
ProcessAudioData
方法
由于ONNX运行时冲突,Runtime Text To Speech插件提供的本地TTS目前不支持真实模型。如需在真实模型下使用文本转语音,请考虑使用外部TTS服务(如通过Runtime AI Chatbot Integrator接入的OpenAI或ElevenLabs),或改用标准模型。
注意: 如果想以更小的音频块进行处理以获得更灵敏的唇形同步,请调整 SetNumSamplesPerChunk
函数中的计算。例如,将采样率除以150(约每6.67毫秒流式传输一次)而不是100(每10毫秒流式传输一次),将提供更频繁的唇形同步更新。
- 常规模式
- 流式处理
该方法使用 Runtime AI Chatbot Integrator 插件从AI服务(OpenAI或ElevenLabs)生成合成语音并进行唇形同步:
- 标准(更快)模型
- Realistic (Higher Quality) Model
- 使用 Runtime AI Chatbot Integrator 通过外部API(OpenAI、ElevenLabs等)从文本生成语音
- 使用 Runtime Audio Importer 导入合成音频数据
- 在播放导入的声波前,绑定到其
OnGeneratePCMData
委托 - 在绑定的函数中,调用 Runtime Viseme Generator 的
ProcessAudioData
方法
写实模型采用与标准模型相同的音频处理流程,但使用RealisticLipSyncGenerator
变量替代VisemeGenerator
。
在标准模型的所有示例中,只需进行以下替换:
- 将
VisemeGenerator
替换为您的RealisticLipSyncGenerator
变量 - 两种模型间的函数名称和参数保持完全一致
注意: 若需处理更小音频 片段以实现更灵敏的口型同步,可调整SetNumSamplesPerChunk
函数中的计算值。例如将采样率除以150(约每6.67毫秒流式传输)而非100(每10毫秒流式传输),将提供更频繁的口型同步更新。
该方法使用Runtime AI Chatbot Integrator插件从AI服务(OpenAI或ElevenLabs)生成流式合成语音并执行口型同步:
- Standard (Faster) Model
- Realistic (Higher Quality) Model
- 使用Runtime AI Chatbot Integrator连接流式TTS API(如ElevenLabs流式API)
- 使用Runtime Audio Importer导入合成音频数据
- 在播放流式声波前,绑定到其
OnGeneratePCMData
委托 - 在绑定函数中调用Runtime Viseme Generator的
ProcessAudioData
写实模型采用与标准模型相同的音频处理流程,但使用RealisticLipSyncGenerator
变量替代VisemeGenerator
。
在标准模型的所有示例中,只需进行以下替换:
- 将
VisemeGenerator
替换为您的RealisticLipSyncGenerator
变量 - 两种模型间的函数名称和参数保持完全一致
注意: 如需处理更小块的音频数据以实现更灵敏的唇形同步,请调整SetNumSamplesPerChunk
函数中的计算。例如,将采样率除以150(约每6.67毫秒流式传输一次)而非100(每10毫秒流式传输一次),可提供更频繁的唇形同步更新。
此方法使用预录制的音频文件或音频缓冲区进行唇形同步:
- 标准(更快)模型
- 真实(更高质量)模型
- 使用Runtime Audio Importer来导入磁盘或内存中的音频文件
- 在播放导入的声波前,绑定到其
OnGeneratePCMData
委托 - 在绑定的函数中,调用Runtime Viseme Generator的
ProcessAudioData
- 播放导入的声波并观察唇形同步动画
真实模型使用与标准模型相同的音频处理流程,但使用RealisticLipSyncGenerator
变量而非VisemeGenerator
。
在标准模型所示的每个示例中,只需替换:
- 将
VisemeGenerator
替换为您的RealisticLipSyncGenerator
变量 - 函数名称和参数在两种模型间保持相同
注意: 如需处理更小块的音频数据以实现更灵敏的唇形同步,请调整SetNumSamplesPerChunk
函数中的计算。例如,将采样率除以150(约每6.67毫秒流式传输一次)而非100(每10毫秒流式传输一次),可提供更频繁的唇形同步更新。
要从缓冲区流式传输音频数据,您需要:
- 标准(更快)模型