MetaHuman Animator (offline facial performance → animation)
MetaHuman Animator turns a recorded face performance — depth footage from an iPhone or
stereo head-mounted camera, plain monocular video, or just an audio file — into a
UAnimSequence of MetaHuman face-board control curves that plays on any MetaHuman. All of
it lives in the MetaHuman Animator plugin (Engine/Plugins/MetaHuman/MetaHumanAnimator/,
MetaHuman.uplugin); every processing module is Type: Editor, so nothing here runs in a
cooked game. Ingest lives in the Capture Manager plugins
(Engine/Plugins/VirtualProduction/CaptureManager*/) and the capture-data asset types in
Engine/Plugins/VirtualProduction/CaptureData/.
When to use this skill
- Converting dialogue
USoundWaveassets into face animation (single or batch) without any camera — the audio-only route. - Ingesting Live Link Face (iPhone) takes or webcam/DSLR video into
UFootageCaptureDataand processing them into animation. - Creating a
UMetaHumanIdentityfrom footage or a mesh (Mesh to MetaHuman), auto-rigging it, and preparing it for performance processing, or pushing it into a MetaHuman Character. - Writing editor C++ or Python that drives
UMetaHumanPerformance, exportsUAnimSequence/ULevelSequence, and wires the result onto an assembled MetaHuman. - Diagnosing "Process" being greyed out,
StartPipelinereturningDisabled, missing curves on export, or depth/frame-rate/timecode mismatches.
Mental model
Capture (device/file) ──ingest──▶ UFootageCaptureData ──┐ ├─▶ UMetaHumanPerformance ──process──▶ FFrameAnimationData[] UMetaHumanIdentity (face rig, "prepared") ──────────────┤ │ USoundWave (audio only) ────────────────────────────────┘ └──export──▶ UAnimSequence / ULevelSequence
Four asset types carry the pipeline:
| Asset | Class | Role |
|---|---|---|
| Capture Data (Footage) | UFootageCaptureData (CaptureData.h:214) | Image sequences, depth sequences, audio tracks, camera calibrations, metadata (frame rate, device class), excluded frames |
| Capture Data (Mesh) | UMeshCaptureData (CaptureData.h:90) | A static/skeletal mesh scan used as an Identity pose |
| MetaHuman Identity | UMetaHumanIdentity (MetaHumanIdentity.h:66) | The performer's digital double: a conformed template mesh + auto-rigged face skeletal mesh + trained predictive solvers |
| MetaHuman Performance | UMetaHumanPerformance (MetaHumanPerformance.h:81) | One take: input type, sources, solver settings, processing range, per-frame results, export |
The three input routes
EDataInputType (MetaHumanPerformance.h:35) selects the solver stack and which
properties are relevant. Everything else on the Performance is gated by EditConditions on
this enum.
| Route | InputType | Needs | Produces |
|---|---|---|---|
| iPhone (Live Link Face, MetaHuman Animator capture mode) or stereo HMC | DepthFootage | FootageCaptureData with ImageSequences + DepthSequences (or ≥2 RGB views for stereo depth generation) + calibration, and an Identity that is auto-rigged and prepared | Highest fidelity face + head pose + tongue |
| Webcam / DSLR / phone video, no depth | MonoFootage | FootageCaptureData with ImageSequences only; no Identity | Face via NNE realtime models, optional body tracking, head pose |
| Audio only | Audio | a USoundWave; no footage, no Identity | Speech2Face lip/face animation, optional blinks and head motion, mood control |
Two facts the editor hides from you:
- Depth generation is stereo-only.
UMetaHumanDepthGenerator::Processrefuses footage with fewer than two image sequences and requires a two-cameraUCameraCalibration(MetaHumanDepthGenerator.cpp:686-711). A single webcam video can never becomeDepthFootage; process it asMonoFootage. - Processing is asynchronous unless you ask otherwise.
StartPipelinereturns immediately and the pipeline runs withPushAsyncNodes;SetBlockingProcessing(true)switches it toPushSyncNodesand blocks the game thread until done (MetaHumanPerformance.cpp:2086-2104). Scripts must block or bindOnProcessingFinishedDynamic(MetaHumanPerformance.h:107).
What CanProcess() checks (MetaHumanPerformance.cpp:2464)
In order: not already processing; no other Performance is processing (only one at a
time — CurrentlyProcessedPerformance, MetaHumanPerformance.h:710); then per route:
Audio:GetAudioForProcessing()non-null. Nothing else — audio runs on the CPU ORT runtime and skips the RHI check.MonoFootage: footage initialised for image sequences; at least one ofbFaceTrackingor (bBodyTracking+ body tracker modular feature present).DepthFootage: face tracker modular feature present; footage initialised forImageSequences | Metadata; calibration present (or ≥2 RGB views, no depth → stereo depth generation); depth present or ≥2 RGB views;Identitynon-null with aUMetaHumanIdentityFacewhoseRigComponentis set,bIsAutoRiggedis true and no predictive-solver training is running;DefaultTracker/DefaultSolvercan process.- Footage routes additionally require
FMetaHumanSupportedRHI::IsSupported()(D3D12 on Windows, Vulkan on Linux, Metal on Mac —MetaHumanSupportedRHI.cpp:31-35) and the MetaHuman authoring content to be present (FMetaHumanAuthoringObjects::ArePresent). - Finally the processing limit range must be non-empty.
GetCannotProcessTooltipText() (MetaHumanPerformance.h:608) mirrors the same ladder and
is the fastest way to learn why processing is disabled.
Core workflow
A. Audio only (no camera)
- Create a
UMetaHumanPerformanceasset (Python:AssetTools.create_asset(..., unreal.MetaHumanPerformance, unreal.MetaHumanPerformanceFactoryNew()); C++:IAssetTools::CreateAssetwith a null factory, orNewObjectfor a transient one). SetInputType(EDataInputType::Audio)thenSetAudio(SoundWave)(MetaHumanPerformance.h:503, 507). Use the setters — they reset stale state and recompute the frame range; raw property writes do not.- Optional:
AudioDrivenAnimationSolveOverrides.Mood/MoodIntensity(:425),AudioDrivenAnimationOutputControlsFullFace/MouthOnly (:376),bGenerateBlinks(:373),bDownmixChannels/AudioChannelIndex(:365,:369),HeadMovementMode(:247),VisualizationObject(:234) for a preview mesh or MetaHuman BP. SetBlockingProcessing(true); checkCanProcess();StartPipeline()must returnEStartPipelineErrorType::None(:65:None,NoFrames,Disabled).- Export with
UMetaHumanPerformanceExportUtils::ExportAnimationSequence(Perf, Settings)(MetaHumanPerformanceExportUtils.h:310) withbShowExportDialog = false.
B. iPhone Live Link Face take (depth footage)
- Record in the Live Link Face app's MetaHuman Animator capture mode. Those takes carry
depth_data.bin+depth_metadata.mhaicalnext to the.mov,frame_log.csv,audio_metadata.jsonandtake.json(LiveLinkFaceMetadata.cpp:47-58, 224-232). ARKit-mode takes have blendshape CSVs instead of depth (:234) and can only be processed asMonoFootage. - Ingest with Capture Manager: a
ULiveLinkFaceDevicein Live Link Hub (IP + port 14785,LiveLinkFaceDevice.h:39-42) pulls takes off the phone throughILiveLinkDeviceCapability_Ingest(UpdateTakeList,GetTakeIdentifiers,GetTakeInformation,CreateIngestProcess/RunIngestProcess), or from script callUCaptureManagerIngestBlueprintLibrary::IngestLiveLinkFaceSync(TakeDir, Params, OutError)/IngestTakeArchiveSyncfor.cptakearchives (CaptureManagerIngestBlueprintLibrary.h:242, 119). Assets land underUCaptureManagerEditorSettings::ImportDirectory. - Build or reuse a
UMetaHumanIdentityof the same performer (section D) and make sure it is auto-rigged and prepared for performance. - Performance:
SetInputType(DepthFootage),SetFootageCaptureData(CD),SetIdentity(Id); setCameraif the footage has several views; leaveTimecodeAlignment = Relativeunless you have real timecode. OptionallySetProcessingRange(Start, End)(:520, end exclusive). Process and export as in A.
C. Monocular video (webcam / DSLR)
IngestMonoVideoSync(VideoPath, OptionalAudioPath, Slate, TakeNumber, Params, OutError)(CaptureManagerIngestBlueprintLibrary.h:153) →UFootageCaptureDatawith one image sequence (+ audio)..mp4/.movonly.- Performance:
SetInputType(MonoFootage),SetFootageCaptureData(CD). No Identity. TunebFaceTracking(:314),bBodyTracking(:324, needs the body tracker plugin),HeadAllowedRotationLeftRight/UpDown+HeadRotationHandler(:399-413),bHeadStabilization,MonoSmoothingParams, and optionallyEstimateFocalLength()(:629) whenFocalLengthis -1. - Process and export as in A. Mono uses the NNE models in
MonocularAnimationPipelineModels(:384);NNEBackendisNNERuntimeORTDmlon Windows GPUs (HyprsenseNode.cpp:257).
D. Identity (Mesh to MetaHuman)
- Create
UMetaHumanIdentity;GetOrCreatePartOfClass(UMetaHumanIdentityFace)(MetaHumanIdentity.h:98). Optional parts:UMetaHumanIdentityBody(Height,BodyTypeIndex), Hands, Outfit, Prop (MetaHumanIdentityParts.h:550-643). - Add a Neutral pose:
NewObject<UMetaHumanIdentityPose>(Face),Face->AddPoseOfType(EIdentityPoseType::Neutral, Pose),Pose->SetCaptureData(CD)(MetaHumanIdentityPose.h:20, 56;MetaHumanIdentityParts.h:238). A Teeth pose is optional and improves the teeth fit. - Promote a frame:
Pose->LoadDefaultTracker(),Pose->AddNewPromotedFrame(Index)→UMetaHumanIdentityFootageFrame(FrameNumber,bIsFrontView,MetaHumanIdentityPromotedFrames.h:197-204, 109). Track it withUPromotedFrameUtils::InitializeContourDataForFootageFrameandUMetaHumanIdentity::StartFrameTrackingPipeline(...)underSetBlockingProcessing(true)(PromotedFrameUtils.h:31;MetaHumanIdentity.h:135, 139). Face->Conform()→EIdentityErrorCode;UMetaHumanIdentity::HandleError(Code, bLogOnly)returns true when it is not an error (MetaHumanIdentityParts.h:138;MetaHumanIdentity.h:188).- Auto-rig (cloud):
IsLoggedInToService()/LogInToAutoRigService(), bindOnAutoRigServiceFinishedDynamicDelegate, callCreateDNAForIdentity(bLogOnly)(MetaHumanIdentity.h:145-155, 87). Offline alternative:ImportDNAFile(DnaPath, EDNADataLayer::All, BrowsJsonPath)(:123);ExportDNADataToFileswrites them back out (:127). - Prepare for Performance =
Face->RunPredictiveSolverTraining()(MetaHumanIdentityParts.h:184; async variant:190). Without it the Identity cannot be used by aDepthFootagePerformance. - To seed a MetaHuman Character from the Identity:
UMetaHumanCharacterEditorSubsystem::ImportFromIdentity(Character, Identity, FImportFromIdentityParams)→EImportErrorCode(IdentityNotConformedif step 4 was skipped), insideTryAddObjectToEdit/RemoveObjectToEdit(MetaHumanCharacterEditorSubsystem.h:1437, 392, 38, 529, 541).
UMetaHumanPerformance API cheat sheet
| Member | Line | Notes |
|---|---|---|
InputType, FootageCaptureData, Audio, Identity | 180, 185, 189, 214 | All have BlueprintSetters — use SetInputType/SetFootageCaptureData/SetAudio/SetIdentity (499-511) |
Camera, TimecodeAlignment | 206, 210 | View name in multi-camera footage; ETimecodeAlignment None/Absolute/Relative (CaptureData.h:193) |
ControlRigAssetReference, VisualizationObject | 226, 234 | Face board rig used for preview/baking (defaults to Face_ControlBoard_CtrlRig); preview skel mesh or MetaHuman BP |
HeadMovementMode | 247 | EPerformanceHeadMovementMode TransformTrack / ControlRig / Disabled (:52) |
StartFrameToProcess, EndFrameToProcess, SetProcessingRange | 287, 291, 520 | End is exclusive; negatives clamp to 0; held until source data loads |
bSkipDiagnostics, MinimumDepthMapFaceCoverage, MinimumDepthMapFaceWidth | 450-458 | Depth diagnostics; results in DepthMapDiagnosticResults (538), DiagnosticsIndicatesProcessingIssue (121) |
UserExcludedFrames, ProcessingExcludedFrames | 470, 474 | Ranges skipped / flagged bad |
StartPipeline(bIsScriptedProcessing=true), CancelPipeline, IsProcessing, CanProcess | 486-495 | |
SetBlockingProcessing, SetDepthDistanceRange, SetBodyTracking | 531, 528, 534 | |
OnProcessingFinishedDynamic | 107 | BlueprintAssignable; fire-and-forget scripts bind this |
ContainsAnimationDataType, GetAnimationData(Start, End), GetNumberOfProcessedFrames | 555-563 | FFrameAnimationData per frame (FrameAnimationData.h:44): Pose head transform, AnimationData control→value map, BodyAnimationData |
GetAnimationCurveNames, GetHeadMesh, GetExportFrameRange | 605, 584, 568 |
C++ pattern — audio → AnimSequence (editor module)
Build.cs: PrivateDependencyModuleNames.AddRange(new[] { "MetaHumanPerformance", "MetaHumanSpeech2Face", "CaptureDataCore", "AssetTools", "UnrealEd" }); — editor target only.
cpp#include "MetaHumanPerformance.h" #include "MetaHumanPerformanceExportUtils.h" #include "AssetToolsModule.h" UAnimSequence* SolveSpeechToAnim(USoundWave* Wave, const FString& PackagePath, USkeleton* FaceSkeleton) { IAssetTools& AssetTools = FModuleManager::LoadModuleChecked<FAssetToolsModule>("AssetTools").Get(); // Null factory is allowed: CreateAsset falls back to NewObject<AssetClass>. UMetaHumanPerformance* Perf = Cast<UMetaHumanPerformance>( AssetTools.CreateAsset(TEXT("MHP_") + Wave->GetName(), PackagePath, UMetaHumanPerformance::StaticClass(), nullptr)); if (!Perf) { return nullptr; } Perf->SetInputType(EDataInputType::Audio); // BlueprintSetter: resets state, recomputes range Perf->SetAudio(Wave); Perf->AudioDrivenAnimationSolveOverrides.Mood = EAudioDrivenAnimationMood::AutoDetect; Perf->AudioDrivenAnimationSolveOverrides.MoodIntensity = 1.0f; Perf->AudioDrivenAnimationOutputControls = EAudioDrivenAnimationOutputControls::FullFace; Perf->HeadMovementMode = EPerformanceHeadMovementMode::ControlRig; Perf->SetBlockingProcessing(true); // run synchronously on this thread if (!Perf->CanProcess()) { UE_LOG(LogTemp, Error, TEXT("%s"), *Perf->GetCannotProcessTooltipText().ToString()); return nullptr; } if (Perf->StartPipeline(/*bIsScriptedProcessing*/ true) != EStartPipelineErrorType::None) { return nullptr; } UMetaHumanPerformanceExportAnimationSettings* Settings = UMetaHumanPerformanceExportUtils::GetExportAnimationSequenceSettings(Perf); // sensible defaults Settings->bShowExportDialog = false; Settings->PackagePath = PackagePath; Settings->AssetName = TEXT("AS_") + Wave->GetName(); Settings->TargetSkeletonOrSkeletalMesh = FaceSkeleton; // Face_Archetype_Skeleton or a MetaHuman face mesh Settings->ExportRange = EPerformanceExportRange::ProcessingRange; Settings->bEnableHeadMovement = true; // HeadYaw/Pitch/Roll + HeadTranslationX/Y/Z curves return UMetaHumanPerformanceExportUtils::ExportAnimationSequence(Perf, Settings); }
GetExportAnimationSequenceSettings returns the mutable CDO pre-filled with the
performance's folder, AS_<name>, ProcessingRange, head movement if available, and a
Face_Archetype_Skeleton found under the Content Browser's current save path
(MetaHumanPerformanceExportUtils.cpp:797-842) — always set TargetSkeletonOrSkeletalMesh
explicitly in scripts.
Worked example — scripted audio-only batch (Python, editor)
Every call below is BlueprintCallable or a reflected UPROPERTY in the headers cited
(MetaHumanPerformance.h:486-531, 365-425; MetaHumanPerformanceExportUtils.h:66-135,
302-310). Epic ships the same shape in
Engine/Plugins/MetaHuman/MetaHumanAnimator/Content/Python/process_audio_performance.py,
process_performance.py and export_performance.py.
pythonimport unreal FACE_SKELETON = "/Game/MetaHumans/Common/Face/Face_Archetype_Skeleton.Face_Archetype_Skeleton" def audio_to_anim(sound_wave_path: str, out_path: str, mood=unreal.AudioDrivenAnimationMood.AUTO_DETECT, intensity: float = 1.0) -> unreal.AnimSequence | None: wave = unreal.load_asset(sound_wave_path) tools = unreal.AssetToolsHelpers.get_asset_tools() perf = tools.create_asset(asset_name=f"MHP_{wave.get_name()}", package_path=out_path, asset_class=unreal.MetaHumanPerformance, factory=unreal.MetaHumanPerformanceFactoryNew()) # set_editor_property goes through the BlueprintSetters (SetInputType / SetAudio), # which reset state and recompute the processing range. Order matters: type first. perf.set_editor_property("input_type", unreal.DataInputType.AUDIO) perf.set_editor_property("audio", wave) overrides = unreal.AudioDrivenAnimationSolveOverrides() overrides.mood = mood # enumerators follow the C++ names: NEUTRAL, HAPPINESS, SADNESS, ANGER ... overrides.mood_intensity = intensity # clamped 0..1 perf.set_editor_property("audio_driven_animation_solve_overrides", overrides) perf.set_editor_property("audio_driven_animation_output_controls", unreal.AudioDrivenAnimationOutputControls.FULL_FACE) perf.set_editor_property("generate_blinks", True) perf.set_editor_property("head_movement_mode", unreal.PerformanceHeadMovementMode.CONTROL_RIG) perf.set_blocking_processing(True) # otherwise start_pipeline returns before any frame is solved if not perf.can_process(): unreal.log_error(f"{perf.get_name()}: cannot process (audio missing or another performance is running)") return None err = perf.start_pipeline() # bIsScriptedProcessing defaults to True if err != unreal.StartPipelineErrorType.NONE: unreal.log_error(f"{perf.get_name()}: start_pipeline -> {err}") return None unreal.log(f"{perf.get_name()}: solved {perf.get_number_of_processed_frames()} frames") settings = unreal.MetaHumanPerformanceExportAnimationSettings() settings.show_export_dialog = False # headless: no path picker settings.package_path = out_path settings.asset_name = f"AS_{wave.get_name()}" settings.target_skeleton_or_skeletal_mesh = unreal.load_asset(FACE_SKELETON) settings.export_range = unreal.PerformanceExportRange.PROCESSING_RANGE settings.enable_head_movement = True settings.auto_save_anim_sequence = True anim = unreal.MetaHumanPerformanceExportUtils.export_animation_sequence(perf, settings) if anim is None: unreal.log_error("export_animation_sequence returned None (skeleton missing CTRL_expressions_ curves?)") return anim for path in unreal.EditorAssetLibrary.list_assets("/Game/Audio/Dialogue", recursive=True): data = unreal.EditorAssetLibrary.find_asset_data(path) if data.asset_class_path.asset_name == "SoundWave": audio_to_anim(path, "/Game/Animation/Faces")
Run it with UnrealEditor-Cmd.exe <Project>.uproject -run=pythonscript -script=... or from
the editor Python console. Level Sequence export (export_level_sequence) needs a live
editor; Epic's scripts note it is not supported in headless -run=pythonscript mode.
For many files from C++ use UMetaHumanBatchOperation::RunProcess(FMetaHumanBatchOperationContext&)
(MetaHumanBatchOperation.h:83, 31): fill AssetsToProcess with USoundWaves, OR the
EBatchOperationStepsFlags (SoundWaveToPerformance | ProcessPerformance | ExportAnimSequence),
set TargetSkeletonOrSkeletalMesh, mood/output controls and naming rules. The
UMetaHumanSpeechTo*Settings objects (MetaHumanSpeechProcessingSettings.h:101-168) are
the detail-panel payloads behind the Content Browser "Speech to Anim/Level Sequence" actions.
Applying the result to a MetaHuman
- The exported
UAnimSequenceholds curves, not bone tracks (face only): one curve per face-board control (CTRL_expressions_*, plusCTRL_*GUI controls) and, when head movement is enabled,HeadYaw,HeadPitch,HeadRoll,HeadTranslationX/Y/Z(MetaHumanPerformanceExportUtils.cpp:100-105). Its skeleton is whatever you passed asTargetSkeletonOrSkeletalMesh— the MetaHumanFace_Archetype_Skeletonor the Face skeletal mesh of an assembled character. - On an assembled MetaHuman the Face component's post-process AnimBP
(
ABP_Face_PostProcess,MetaHumanCharacterEditorActor.cpp:74) runs RigLogic, which reads those curves and drives the face joints and blend shapes. So any way of playing the sequence works: a Sequencer Animation track bound to the Face component, a Play Animation node or a Slot in the face AnimBP, orUSkeletalMeshComponent::PlayAnimation. - For a Sequencer-editable result export a Level Sequence instead
(
ExportLevelSequence,MetaHumanPerformanceExportUtils.h:314) withTargetMetaHumanClassset to the MetaHuman Blueprint (:271); the Performance bakes aFace_ControlBoard_CtrlRigControl Rig track and toggles the head control switch (SetHeadControlSwitchEnabled,:323). - Check curve compatibility first:
Settings->IsTargetSkeletonCompatible(Perf->GetAnimationCurveNames(), Missing)(:158). MissingCTRL_expressions_curves mean the skeleton is not a MetaHuman face skeleton.
Gotchas & edge cases
- "Prepared for performance" is a real state. A
DepthFootagePerformance needs an Identity whose face hasRigComponent,bIsAutoRigged == trueand trained predictive solvers (MetaHumanPerformance.cpp:2535-2552;MetaHumanIdentityParts.h:348-356, 184). Auto-rigging is a cloud call (CreateDNAForIdentity) that needs an Epic login (LogInToAutoRigService) and finishes asynchronously onOnAutoRigServiceFinishedDynamicDelegate; runRunPredictiveSolverTraining()after it. - Async by default. Without
SetBlockingProcessing(true)the pipeline runs on worker threads andStartPipelinereturns at once; your script's next line sees zero frames. In blocking mode depth-footage processing also loads trackers synchronously (MetaHumanPerformance.cpp:1280-1286). - Only one Performance processes at a time (
CurrentlyProcessedPerformance); a secondCanProcess()returns false until the first finishes or is cancelled. - GPU/RHI. Footage routes require D3D12/Vulkan/Metal and the NNE runtimes the plugin
depends on (
NNERuntimeORT, listed inMetaHuman.uplugin); mono inference usesNNERuntimeORTDml, speech-to-face usesNNERuntimeORTCpu(Speech2FaceInternal.cpp:60). A-nullrhicommandlet cannot process footage; audio-only can. - Depth range.
MinDistance/MaxDistance(cm, default 10–25) clip depth for stereo generation and HMC ingest (MetaHumanPerformance.h:429-433,MetaHumanGenerateDepthWindowOptions.h:51-61). A performer 40 cm from an HMC rig loses depth entirely; iPhone depth is already metric and ignores these. - Frame rate and timecode.
SetFootageCaptureDatarejects footage whose frame rate is invalid (:497). Image and depth tracks at different but compatible rates are rate-matched by dropping frames (MetaHumanPerformance.cpp:1108-1129).TimecodeAlignmentRelative aligns tracks by their first frame; Absolute uses embedded timecode and will produce an empty range when sources have no timecode. Audio-only performances run at 30 fps when there is no footage (MetaHumanPerformance.cpp:1010); Speech2Face solves at 50 fps and resamples nearest-neighbour (Speech2Face.h:72). - Live Link Face capture mode matters. Only MetaHuman Animator mode records depth;
ARKit mode gives video + blendshape CSVs and can only go the
MonoFootageroute. Since 5.6 the app writes.cptakearchives;IngestLiveLinkFaceSyncaccepts both formats. - Mono head rotation limits. Frames past
HeadAllowedRotationLeftRight(45°) /UpDown(30°) are unsolved;HeadRotationHandlerchooses gap vs neutral pose (MetaHumanPerformance.h:399-413). Changing them requires reprocessing. - Export defaults depend on editor state. The default target skeleton is looked up
relative to the Content Browser's initial save path; headless runs must set
TargetSkeletonOrSkeletalMesh.bShowExportDialogdefaults to true — set it false. - Mood enumerators.
EAudioDrivenAnimationMoodnames areHappiness,Sadness,Anger,Confidence, ... with display names "Happy", "Sad" (SpeechAnimationSolverTypes.h:13-27); Python exposes the C++ names (HAPPINESS, notHAPPY). Checkdir(unreal.AudioDrivenAnimationMood). - Deprecated ingest classes.
UMetaHumanCaptureSource,UMetaHumanCaptureSourceSync,FMetaHumanTakeInfo/FMetaHumanTakeareUE_DEPRECATED(5.7); the shippedcreate_capture_data.pystill uses them. New code goes through Capture Manager.
Version notes
- 5.7:
MetaHumanCaptureSourcemodule deprecated in favour ofCaptureManager/CaptureManagerDevices; Capture Manager moved into Live Link Hub devices. - 5.8:
ContainsAnimationData()→ContainsAnimationDataType(EFrameAnimationDataType);VisualizationMesh→VisualizationObject(accepts a MetaHuman BP);ControlRigClass→ControlRigAssetReference(FControlRigAssetStrongReference);UCaptureData::EInitializedCheck→ globalECaptureDataInitializedCheckflags; body tracking (bBodyTracking,EPerformanceExportSkeleton,BodyRetargeter) added to mono processing and export.
References & source material
Engine source (UE 5.8 — all paths under Engine/Plugins/MetaHuman/MetaHumanAnimator/Source/):
MetaHumanPerformance/Public/MetaHumanPerformance.h:35 —EDataInputType.MetaHumanPerformance/Public/MetaHumanPerformance.h:52 —EPerformanceHeadMovementMode.MetaHumanPerformance/Public/MetaHumanPerformance.h:65 —EStartPipelineErrorType.MetaHumanPerformance/Public/MetaHumanPerformance.h:81 —UMetaHumanPerformance.MetaHumanPerformance/Public/MetaHumanPerformance.h:107 —OnProcessingFinishedDynamic.MetaHumanPerformance/Public/MetaHumanPerformance.h:180 —InputType,FootageCaptureData,Audio,Identity(180-214).MetaHumanPerformance/Public/MetaHumanPerformance.h:486 —StartPipeline,CancelPipeline,IsProcessing,CanProcess(486-495).MetaHumanPerformance/Public/MetaHumanPerformance.h:499 —SetFootageCaptureData,SetInputType,SetAudio,SetIdentity,SetProcessingRange,SetBlockingProcessing(499-531).MetaHumanPerformance/Public/MetaHumanPerformance.h:560 —GetAnimationData,GetNumberOfProcessedFrames.MetaHumanPerformance/Public/MetaHumanPerformanceExportUtils.h:20 —EPerformanceExportRange,EPerformanceExportSkeleton.MetaHumanPerformance/Public/MetaHumanPerformanceExportUtils.h:48 —UMetaHumanPerformanceExportAnimationSettings.MetaHumanPerformance/Public/MetaHumanPerformanceExportUtils.h:173 —UMetaHumanPerformanceExportLevelSequenceSettings.MetaHumanPerformance/Public/MetaHumanPerformanceExportUtils.h:293 —UMetaHumanPerformanceExportUtils,ExportAnimationSequence(310),ExportLevelSequence(314).MetaHumanPerformance/Private/MetaHumanPerformance.cpp:1075 —StartPipelineimplementation;CanProcess(2464).MetaHumanPerformance/Private/MetaHumanPerformanceExportUtils.cpp:100 — head movement curve names;GetExportAnimationSequenceSettings(797).MetaHumanPerformance/Private/MetaHumanPerformanceFactoryNew.h:14 —UMetaHumanPerformanceFactoryNew.MetaHumanIdentity/Public/MetaHumanIdentity.h:66 —UMetaHumanIdentity; auto-rig API (145-155);ImportDNAFile(123);StartFrameTrackingPipeline(135).MetaHumanIdentity/Public/MetaHumanIdentityParts.h:106 —UMetaHumanIdentityFace;Conform(138);RunPredictiveSolverTraining(184);bIsAutoRigged(356).MetaHumanIdentity/Public/MetaHumanIdentityPose.h:20 —EIdentityPoseType;UMetaHumanIdentityPose(38).MetaHumanIdentity/Public/MetaHumanIdentityPromotedFrames.h:18 —UMetaHumanIdentityPromotedFrame;UMetaHumanIdentityFootageFrame(197).MetaHumanIdentity/Public/PromotedFrameUtils.h:22 —UPromotedFrameUtils.MetaHumanSpeech2Face/Public/AudioDrivenAnimationConfig.h:13 —FAudioDrivenAnimationModels,EAudioDrivenAnimationOutputControls(29),FAudioDrivenAnimationSolveOverrides(36).MetaHumanSpeech2Face/Public/Speech2Face.h:20 —FSpeech2Face.MetaHumanSpeech2Face/Private/Speech2FaceInternal.cpp:54 —NNERuntimeORT/NNERuntimeORTCpurequirement.MetaHumanBatchProcessor/Public/MetaHumanBatchOperation.h:19 —EBatchOperationStepsFlags,FMetaHumanBatchOperationContext(31),UMetaHumanBatchOperation(76).MetaHumanBatchProcessor/Public/MetaHumanSpeechProcessingSettings.h:101 —UMetaHumanSpeechToPerformance,UMetaHumanSpeechToAnimSequenceProcessingSettings(132),UMetaHumanSpeechToLevelSequenceSettings(158).MetaHumanDepthGenerator/Private/MetaHumanDepthGenerator.h:15 —UMetaHumanDepthGenerator.MetaHumanDepthGenerator/Private/Widgets/MetaHumanGenerateDepthWindowOptions.h:13 —UMetaHumanGenerateDepthWindowOptions.MetaHumanDepthGenerator/Private/MetaHumanDepthGenerator.cpp:686 — two-image-sequence and calibration requirements.MetaHumanCaptureSource/Public/MetaHumanCaptureSource.h:97 —UMetaHumanCaptureSource(deprecated 5.7).MetaHumanCaptureSource/Public/MetaHumanCaptureSourceSync.h:18 —UMetaHumanCaptureSourceSync(deprecated 5.7).MetaHumanCaptureSource/Public/MetaHumanTakeData.h:27 —FMetaHumanTakeInfo,FMetaHumanTake(115).MetaHumanPipeline/Public/Nodes/SpeechToAnimNode.h:15 —FSpeechToAnimNode.MetaHumanPipeline/Private/Nodes/HyprsenseNode.cpp:257 —NNERuntimeORTDmlGPU backend for mono tracking.MetaHumanCore/Public/MetaHumanSupportedRHI.h:11 —FMetaHumanSupportedRHI;MetaHumanCore/Private/MetaHumanSupportedRHI.cpp:31.MetaHumanCore/Public/MetaHumanAuthoringObjects.h:12 —FMetaHumanAuthoringObjects::ArePresent.MetaHumanFaceAnimationSolver/Public/MetaHumanFaceAnimationSolver.h:33 —UMetaHumanFaceAnimationSolver.MetaHumanFaceContourTracker/Public/MetaHumanFaceContourTrackerAsset.h:23 —UMetaHumanFaceContourTrackerAsset.MetaHumanConfig/Public/MetaHumanConfig.h—UMetaHumanConfig,EMetaHumanConfigType.
Engine source (UE 5.8 — all paths under Engine/Plugins/MetaHuman/MetaHumanCoreTechLib/Source/):
MetaHumanCoreTech/Public/FrameAnimationData.h:44 —FFrameAnimationData;EFrameAnimationDataType(33).MetaHumanCoreTech/Public/MetaHumanCommonDataUtils.h:48 —GetAnimatorPluginFaceControlRigPath,GetDefaultControlRigFromRegistry(34).MetaHumanPipelineCore/Public/Nodes/HyprsenseRealtimeNode.h:42 —EFaceUnsolvedFrameBehavior;FMonocularAnimationPipelineModels(59).
Engine source (UE 5.8 — all paths under Engine/Plugins/MetaHuman/MetaHumanCharacter/Source/):
MetaHumanCharacterEditor/Public/MetaHumanCharacterEditorSubsystem.h:38 —EImportErrorCode;FImportFromIdentityParams(392);UMetaHumanCharacterEditorSubsystem(491);TryAddObjectToEdit(529);ImportFromIdentity(1437).MetaHumanCharacterEditor/Private/MetaHumanCharacterEditorActor.cpp:74 — face post-process AnimBP (ABP_Face_PostProcess).
Engine source (UE 5.8 — all paths under Engine/Plugins/VirtualProduction/):
CaptureData/Source/CaptureDataCore/Public/CaptureData.h:40 —UCaptureData;UMeshCaptureData(90);EFootageDeviceClass(111);FFootageCaptureMetadata(123);ETimecodeAlignment(193);UFootageCaptureData(214).CaptureData/Source/CaptureDataEditor/Public/CaptureDataFactory.h:30 —UFootageCaptureDataFactory.CaptureData/Source/CaptureDataUtils/Public/ImageSequenceTimecodeUtils.h:13 —UImageSequenceTimecodeUtils.CaptureManager/CaptureManagerEditor/Source/CaptureManagerIngestBlueprint/Private/CaptureManagerIngestBlueprintLibrary.h:105 —UCaptureManagerIngestBlueprintLibrary;IngestMonoVideoSync(153);IngestLiveLinkFaceSync(242);IngestTakeArchiveSync(119).CaptureManager/CaptureManagerEditor/Source/CaptureManagerEditorSettings/Public/Settings/CaptureManagerEditorSettings.h:23 —UCaptureManagerEditorSettings;ImportDirectory(82).CaptureManager/CaptureManagerDevices/Source/CPSLiveLinkDevice/Public/LiveLinkFaceDevice.h:50 —ULiveLinkFaceDevice;ULiveLinkFaceDeviceSettings(27).CaptureManager/CaptureManagerApp/Source/LiveLinkCapabilities/Public/Ingest/LiveLinkDeviceCapability_Ingest.h:38 —ILiveLinkDeviceCapability_Ingest.CaptureManager/CaptureManagerCore/Source/CaptureMetadataExtraction/Internal/LiveLinkFaceMetadata.cpp:47 — Live Link Face take file names; MHA vs ARKit file sets (224, 234).
Other engine source (UE 5.8):
Engine/Plugins/Animation/AudioDrivenAnimation/StreamingADA/Source/SpeechAnimationSolver/Public/SpeechAnimationSolverTypes.h:13 —EAudioDrivenAnimationMood.Engine/Source/Developer/AssetTools/Public/IAssetTools.h:349 —CreateAsset(null factory allowed).
Shipped Python examples (UE 5.8): Engine/Plugins/MetaHuman/MetaHumanAnimator/Content/Python/
(process_audio_performance.py, process_performance.py, process_monocular_performance.py,
create_identity_for_performance.py, export_performance.py, create_capture_data.py) and
Engine/Plugins/MetaHuman/MetaHumanAnimator/Content/DepthGenerator/depth_generator_example.py.
Deep-dive references in this skill:
- references/capture-data-and-ingest.md —
UFootageCaptureDataanatomy, Capture Manager ingest (Live Link Face, mono/stereo video, take archives), legacy capture sources, stereo depth generation, timecode. - references/identity-mesh-to-metahuman.md — Identity parts, poses, promoted frames, conforming, auto-rig service, DNA import/export, Prepare for Performance, Identity → MetaHuman Character.
- references/performance-processing-and-export.md — every
UMetaHumanPerformanceproperty by route, pipeline stages, diagnostics,FFrameAnimationData, AnimSequence/LevelSequence export settings, applying to MetaHumans. - references/audio-driven-animation.md — Speech2Face internals, moods, output controls, realtime vs offline audio solve, batch processor, speech-to-animation settings objects.
Related skills: ue-control-rig-and-ik, ue-animation-system, ue-sequencer-and-cinematics.


