diff --git a/Unreal/PS_AI_Agent/Content/ElevenLabsLipSyncPoseMap.uasset b/Unreal/PS_AI_Agent/Content/ElevenLabsLipSyncPoseMap.uasset new file mode 100644 index 0000000..2cf989a Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/ElevenLabsLipSyncPoseMap.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/AnimBP/A1D_MH_BEye.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/AnimBP/A1D_MH_BEye.uasset new file mode 100644 index 0000000..75b7786 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/AnimBP/A1D_MH_BEye.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/AnimBP/A2D_MH_EyeLook.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/AnimBP/A2D_MH_EyeLook.uasset new file mode 100644 index 0000000..649892d Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/AnimBP/A2D_MH_EyeLook.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/AnimBP/B1D_MH_Movement.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/AnimBP/B1D_MH_Movement.uasset new file mode 100644 index 0000000..9bb0d06 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/AnimBP/B1D_MH_Movement.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/AnimBP/B1D_MH_MovementV2.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/AnimBP/B1D_MH_MovementV2.uasset new file mode 100644 index 0000000..45053a1 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/AnimBP/B1D_MH_MovementV2.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/AnimBP/B2D_MH_HeadLook.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/AnimBP/B2D_MH_HeadLook.uasset new file mode 100644 index 0000000..b2c6979 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/AnimBP/B2D_MH_HeadLook.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/AnimBP/B2D_MH_HeadLookV2.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/AnimBP/B2D_MH_HeadLookV2.uasset new file mode 100644 index 0000000..8cf18aa Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/AnimBP/B2D_MH_HeadLookV2.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Convai_MetaHuman_BodyAnim.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Convai_MetaHuman_BodyAnim.uasset new file mode 100644 index 0000000..2cc9369 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Convai_MetaHuman_BodyAnim.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Convai_MetaHuman_FaceAnim.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Convai_MetaHuman_FaceAnim.uasset new file mode 100644 index 0000000..df4d844 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Convai_MetaHuman_FaceAnim.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Instruments/Enm/E_Emotions.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Instruments/Enm/E_Emotions.uasset new file mode 100644 index 0000000..e3a1119 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Instruments/Enm/E_Emotions.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Instruments/Enm/E_InConversation.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Instruments/Enm/E_InConversation.uasset new file mode 100644 index 0000000..4236773 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Instruments/Enm/E_InConversation.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Instruments/Enm/E_Lips.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Instruments/Enm/E_Lips.uasset new file mode 100644 index 0000000..3d519cc Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Instruments/Enm/E_Lips.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Instruments/Enm/E_Movement.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Instruments/Enm/E_Movement.uasset new file mode 100644 index 0000000..319601a Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Instruments/Enm/E_Movement.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Instruments/Enm/E_TurnDirection.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Instruments/Enm/E_TurnDirection.uasset new file mode 100644 index 0000000..2728e16 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Instruments/Enm/E_TurnDirection.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Instruments/Functions/F_AIUtilities.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Instruments/Functions/F_AIUtilities.uasset new file mode 100644 index 0000000..a15c374 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Instruments/Functions/F_AIUtilities.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Eyes/MHF_BEye_Close.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Eyes/MHF_BEye_Close.uasset new file mode 100644 index 0000000..8cc047a Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Eyes/MHF_BEye_Close.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Eyes/MHF_BEye_CloseExra.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Eyes/MHF_BEye_CloseExra.uasset new file mode 100644 index 0000000..8e5f834 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Eyes/MHF_BEye_CloseExra.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Eyes/MHF_BEye_Open.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Eyes/MHF_BEye_Open.uasset new file mode 100644 index 0000000..9e4fe28 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Eyes/MHF_BEye_Open.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Eyes/MHF_Base.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Eyes/MHF_Base.uasset new file mode 100644 index 0000000..384993f Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Eyes/MHF_Base.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Eyes/MHF_LooKEye_CC.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Eyes/MHF_LooKEye_CC.uasset new file mode 100644 index 0000000..6bf436a Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Eyes/MHF_LooKEye_CC.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Eyes/MHF_LooKEye_CD.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Eyes/MHF_LooKEye_CD.uasset new file mode 100644 index 0000000..9d9cbba Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Eyes/MHF_LooKEye_CD.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Eyes/MHF_LooKEye_CU.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Eyes/MHF_LooKEye_CU.uasset new file mode 100644 index 0000000..11e62c4 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Eyes/MHF_LooKEye_CU.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Eyes/MHF_LooKEye_LC.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Eyes/MHF_LooKEye_LC.uasset new file mode 100644 index 0000000..7376c14 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Eyes/MHF_LooKEye_LC.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Eyes/MHF_LooKEye_LD.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Eyes/MHF_LooKEye_LD.uasset new file mode 100644 index 0000000..f08f864 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Eyes/MHF_LooKEye_LD.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Eyes/MHF_LooKEye_LU.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Eyes/MHF_LooKEye_LU.uasset new file mode 100644 index 0000000..9891b15 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Eyes/MHF_LooKEye_LU.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Eyes/MHF_LooKEye_RC.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Eyes/MHF_LooKEye_RC.uasset new file mode 100644 index 0000000..a604989 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Eyes/MHF_LooKEye_RC.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Eyes/MHF_LooKEye_RD.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Eyes/MHF_LooKEye_RD.uasset new file mode 100644 index 0000000..448c534 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Eyes/MHF_LooKEye_RD.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Eyes/MHF_LooKEye_RU.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Eyes/MHF_LooKEye_RU.uasset new file mode 100644 index 0000000..33e5a18 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Eyes/MHF_LooKEye_RU.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/HeadLook/MHB_Base.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/HeadLook/MHB_Base.uasset new file mode 100644 index 0000000..ff473c2 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/HeadLook/MHB_Base.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/HeadLook/MHB_HeadLooK_CC.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/HeadLook/MHB_HeadLooK_CC.uasset new file mode 100644 index 0000000..e975fab Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/HeadLook/MHB_HeadLooK_CC.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/HeadLook/MHB_HeadLook_CD.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/HeadLook/MHB_HeadLook_CD.uasset new file mode 100644 index 0000000..e58c6e9 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/HeadLook/MHB_HeadLook_CD.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/HeadLook/MHB_HeadLook_CU.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/HeadLook/MHB_HeadLook_CU.uasset new file mode 100644 index 0000000..0175257 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/HeadLook/MHB_HeadLook_CU.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/HeadLook/MHB_HeadLook_LC.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/HeadLook/MHB_HeadLook_LC.uasset new file mode 100644 index 0000000..dbfb100 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/HeadLook/MHB_HeadLook_LC.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/HeadLook/MHB_HeadLook_LD.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/HeadLook/MHB_HeadLook_LD.uasset new file mode 100644 index 0000000..3ca66ac Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/HeadLook/MHB_HeadLook_LD.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/HeadLook/MHB_HeadLook_LU.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/HeadLook/MHB_HeadLook_LU.uasset new file mode 100644 index 0000000..d4decbd Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/HeadLook/MHB_HeadLook_LU.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/HeadLook/MHB_HeadLook_RC.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/HeadLook/MHB_HeadLook_RC.uasset new file mode 100644 index 0000000..0083cbf Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/HeadLook/MHB_HeadLook_RC.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/HeadLook/MHB_HeadLook_RD.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/HeadLook/MHB_HeadLook_RD.uasset new file mode 100644 index 0000000..c9705d0 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/HeadLook/MHB_HeadLook_RD.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/HeadLook/MHB_HeadLook_RU.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/HeadLook/MHB_HeadLook_RU.uasset new file mode 100644 index 0000000..fdc549c Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/HeadLook/MHB_HeadLook_RU.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Idle/MH_Idle01_UE.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Idle/MH_Idle01_UE.uasset new file mode 100644 index 0000000..c083393 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Idle/MH_Idle01_UE.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Idle/MH_Idle02_UE.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Idle/MH_Idle02_UE.uasset new file mode 100644 index 0000000..d3d23c4 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Idle/MH_Idle02_UE.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Idle/MH_Idle03_UE.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Idle/MH_Idle03_UE.uasset new file mode 100644 index 0000000..a83bd77 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Idle/MH_Idle03_UE.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_AA.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_AA.uasset new file mode 100644 index 0000000..fa4fdd1 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_AA.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_AAn.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_AAn.uasset new file mode 100644 index 0000000..c8099f7 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_AAn.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_CH.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_CH.uasset new file mode 100644 index 0000000..43ae861 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_CH.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_CHn.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_CHn.uasset new file mode 100644 index 0000000..747fcc5 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_CHn.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_EE.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_EE.uasset new file mode 100644 index 0000000..fc09ccd Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_EE.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_EEn.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_EEn.uasset new file mode 100644 index 0000000..e1e26e4 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_EEn.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_EEn2.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_EEn2.uasset new file mode 100644 index 0000000..efc21f0 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_EEn2.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_FV.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_FV.uasset new file mode 100644 index 0000000..a82c84d Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_FV.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_II.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_II.uasset new file mode 100644 index 0000000..24997f0 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_II.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_IIn.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_IIn.uasset new file mode 100644 index 0000000..72a2bdb Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_IIn.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_KG.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_KG.uasset new file mode 100644 index 0000000..e8fe4dc Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_KG.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_KGn.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_KGn.uasset new file mode 100644 index 0000000..10d9c20 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_KGn.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_KGn2.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_KGn2.uasset new file mode 100644 index 0000000..83f68cf Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_KGn2.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_NL.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_NL.uasset new file mode 100644 index 0000000..46d0b28 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_NL.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_NLn.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_NLn.uasset new file mode 100644 index 0000000..627c1af Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_NLn.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_None.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_None.uasset new file mode 100644 index 0000000..0bcaf0e Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_None.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_OH.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_OH.uasset new file mode 100644 index 0000000..8ca1496 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_OH.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_OHn.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_OHn.uasset new file mode 100644 index 0000000..1711843 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_OHn.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_OU.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_OU.uasset new file mode 100644 index 0000000..9d9d234 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_OU.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_PBM.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_PBM.uasset new file mode 100644 index 0000000..0485f27 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_PBM.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_PBMn.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_PBMn.uasset new file mode 100644 index 0000000..aaaeaa1 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_PBMn.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_RR.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_RR.uasset new file mode 100644 index 0000000..5aeb844 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_RR.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_SZ.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_SZ.uasset new file mode 100644 index 0000000..108d8ef Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_SZ.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_SZn.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_SZn.uasset new file mode 100644 index 0000000..c6458df Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_SZn.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_TD.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_TD.uasset new file mode 100644 index 0000000..ae607ff Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_TD.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_TH.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_TH.uasset new file mode 100644 index 0000000..1a0bd0b Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Lips/MHF_TH.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Movement/MM_Run_Fwd.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Movement/MM_Run_Fwd.uasset new file mode 100644 index 0000000..1904365 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Movement/MM_Run_Fwd.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Movement/MM_Walk_Fwd.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Movement/MM_Walk_Fwd.uasset new file mode 100644 index 0000000..ff8e37c Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Movement/MM_Walk_Fwd.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Movement/MM_Walk_InPlace.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Movement/MM_Walk_InPlace.uasset new file mode 100644 index 0000000..e9772e9 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Movement/MM_Walk_InPlace.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Talk/MH_Talk.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Talk/MH_Talk.uasset new file mode 100644 index 0000000..1e44fc3 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Talk/MH_Talk.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Talk/MH_Talk01.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Talk/MH_Talk01.uasset new file mode 100644 index 0000000..2683f46 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Talk/MH_Talk01.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Talk/MH_Talk02.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Talk/MH_Talk02.uasset new file mode 100644 index 0000000..72d7fc9 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Talk/MH_Talk02.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Talk/MH_Talk03.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Talk/MH_Talk03.uasset new file mode 100644 index 0000000..3a6c72a Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Talk/MH_Talk03.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Turn/MH_Turn_L180_UE.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Turn/MH_Turn_L180_UE.uasset new file mode 100644 index 0000000..14bf9b5 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Turn/MH_Turn_L180_UE.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Turn/MH_Turn_L180_UE_Montage.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Turn/MH_Turn_L180_UE_Montage.uasset new file mode 100644 index 0000000..0f367fa Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Turn/MH_Turn_L180_UE_Montage.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Turn/MH_Turn_L90_UE.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Turn/MH_Turn_L90_UE.uasset new file mode 100644 index 0000000..d63846e Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Turn/MH_Turn_L90_UE.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Turn/MH_Turn_L90_UE_Montage.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Turn/MH_Turn_L90_UE_Montage.uasset new file mode 100644 index 0000000..6b3c639 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Turn/MH_Turn_L90_UE_Montage.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Turn/MH_Turn_R180_UE.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Turn/MH_Turn_R180_UE.uasset new file mode 100644 index 0000000..e7476f4 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Turn/MH_Turn_R180_UE.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Turn/MH_Turn_R180_UE_Montage.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Turn/MH_Turn_R180_UE_Montage.uasset new file mode 100644 index 0000000..f5eebee Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Turn/MH_Turn_R180_UE_Montage.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Turn/MH_Turn_R90_UE.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Turn/MH_Turn_R90_UE.uasset new file mode 100644 index 0000000..a86fc02 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Turn/MH_Turn_R90_UE.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Turn/MH_Turn_R90_UE_Montage.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Turn/MH_Turn_R90_UE_Montage.uasset new file mode 100644 index 0000000..881b7f8 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions/Turn/MH_Turn_R90_UE_Montage.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_CC.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_CC.uasset new file mode 100644 index 0000000..4e264d2 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_CC.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_CD.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_CD.uasset new file mode 100644 index 0000000..40d307a Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_CD.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_CU.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_CU.uasset new file mode 100644 index 0000000..9d447c9 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_CU.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_LBC.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_LBC.uasset new file mode 100644 index 0000000..165fa1d Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_LBC.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_LBD.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_LBD.uasset new file mode 100644 index 0000000..79ed257 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_LBD.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_LBU.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_LBU.uasset new file mode 100644 index 0000000..8b23ebd Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_LBU.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_LC.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_LC.uasset new file mode 100644 index 0000000..ea95a32 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_LC.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_LD.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_LD.uasset new file mode 100644 index 0000000..649e0cc Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_LD.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_LU.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_LU.uasset new file mode 100644 index 0000000..894fa58 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_LU.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_RBC.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_RBC.uasset new file mode 100644 index 0000000..428f390 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_RBC.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_RBD.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_RBD.uasset new file mode 100644 index 0000000..568027c Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_RBD.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_RBU.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_RBU.uasset new file mode 100644 index 0000000..438fa7b Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_RBU.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_RC.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_RC.uasset new file mode 100644 index 0000000..7e24a41 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_RC.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_RD.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_RD.uasset new file mode 100644 index 0000000..534efb6 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_RD.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_RU.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_RU.uasset new file mode 100644 index 0000000..3c5f89f Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/FP_Idle_AO_RU.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/female_neck_01_neck_02_head_anim.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/female_neck_01_neck_02_head_anim.uasset new file mode 100644 index 0000000..0afb300 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/AO/female_neck_01_neck_02_head_anim.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Breaks/FP_Breaks_AdjustGlasses.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Breaks/FP_Breaks_AdjustGlasses.uasset new file mode 100644 index 0000000..756241d Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Breaks/FP_Breaks_AdjustGlasses.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Breaks/FP_Breaks_LookAround_RightToLeft.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Breaks/FP_Breaks_LookAround_RightToLeft.uasset new file mode 100644 index 0000000..5d47aa2 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Breaks/FP_Breaks_LookAround_RightToLeft.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/HandsClosed_MetaHuman.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/HandsClosed_MetaHuman.uasset new file mode 100644 index 0000000..24b08f8 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/HandsClosed_MetaHuman.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Idle/FP_IdleBase.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Idle/FP_IdleBase.uasset new file mode 100644 index 0000000..9771097 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Idle/FP_IdleBase.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Idle/FP_Idle_CrowdReact_Left.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Idle/FP_Idle_CrowdReact_Left.uasset new file mode 100644 index 0000000..7b79b80 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Idle/FP_Idle_CrowdReact_Left.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Idle/FP_Idle_CrowdReact_Right.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Idle/FP_Idle_CrowdReact_Right.uasset new file mode 100644 index 0000000..3987683 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Idle/FP_Idle_CrowdReact_Right.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_JogLean_B.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_JogLean_B.uasset new file mode 100644 index 0000000..c8a0391 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_JogLean_B.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_JogLean_C.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_JogLean_C.uasset new file mode 100644 index 0000000..2a15573 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_JogLean_C.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_JogLean_F.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_JogLean_F.uasset new file mode 100644 index 0000000..5d153dd Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_JogLean_F.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_JogLean_L.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_JogLean_L.uasset new file mode 100644 index 0000000..054fb4c Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_JogLean_L.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_JogLean_R.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_JogLean_R.uasset new file mode 100644 index 0000000..7e9fc7e Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_JogLean_R.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_JogStart_F_0_rf.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_JogStart_F_0_rf.uasset new file mode 100644 index 0000000..7e01ebc Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_JogStart_F_0_rf.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_JogStart_F_180L.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_JogStart_F_180L.uasset new file mode 100644 index 0000000..0f1946f Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_JogStart_F_180L.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_JogStart_F_180R.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_JogStart_F_180R.uasset new file mode 100644 index 0000000..743f47b Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_JogStart_F_180R.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_JogStart_F_90L.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_JogStart_F_90L.uasset new file mode 100644 index 0000000..4ba1cc8 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_JogStart_F_90L.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_JogStart_F_90R.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_JogStart_F_90R.uasset new file mode 100644 index 0000000..a107228 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_JogStart_F_90R.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_JogStop_Abrupt_rf.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_JogStop_Abrupt_rf.uasset new file mode 100644 index 0000000..744d7a8 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_JogStop_Abrupt_rf.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_JogStop_F_Lf.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_JogStop_F_Lf.uasset new file mode 100644 index 0000000..7234e86 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_JogStop_F_Lf.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_Jog_F.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_Jog_F.uasset new file mode 100644 index 0000000..c42ef74 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_Jog_F.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_Jog_F_StepDown_lf.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_Jog_F_StepDown_lf.uasset new file mode 100644 index 0000000..1a1f9db Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_Jog_F_StepDown_lf.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_Jog_F_StepDown_rf.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_Jog_F_StepDown_rf.uasset new file mode 100644 index 0000000..86a8345 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_Jog_F_StepDown_rf.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_Jog_F_StepUp_lf.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_Jog_F_StepUp_lf.uasset new file mode 100644 index 0000000..83aea5c Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_Jog_F_StepUp_lf.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_Jog_F_StepUp_rf.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_Jog_F_StepUp_rf.uasset new file mode 100644 index 0000000..af71576 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_Jog_F_StepUp_rf.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_Jog_F_to_Walk_F_lf.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_Jog_F_to_Walk_F_lf.uasset new file mode 100644 index 0000000..081d6d8 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_Jog_F_to_Walk_F_lf.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_Jog_F_to_Walk_F_rf.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_Jog_F_to_Walk_F_rf.uasset new file mode 100644 index 0000000..526a72d Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_Jog_F_to_Walk_F_rf.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_Walk_F_to_Jog_F_lf.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_Walk_F_to_Jog_F_lf.uasset new file mode 100644 index 0000000..f312fb7 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_Walk_F_to_Jog_F_lf.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_Walk_F_to_Jog_F_rf.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_Walk_F_to_Jog_F_rf.uasset new file mode 100644 index 0000000..a5f4bbf Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Jog/FP_Walk_F_to_Jog_F_rf.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Player_Female_thigh_l_anim.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Player_Female_thigh_l_anim.uasset new file mode 100644 index 0000000..64177ac Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Player_Female_thigh_l_anim.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Player_Female_thigh_r_anim.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Player_Female_thigh_r_anim.uasset new file mode 100644 index 0000000..ecb00b5 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Player_Female_thigh_r_anim.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_WalkLean_L.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_WalkLean_L.uasset new file mode 100644 index 0000000..42c56b0 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_WalkLean_L.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_WalkLean_R.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_WalkLean_R.uasset new file mode 100644 index 0000000..c6a4d98 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_WalkLean_R.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_WalkStart_F_0_rf.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_WalkStart_F_0_rf.uasset new file mode 100644 index 0000000..d5c4b2d Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_WalkStart_F_0_rf.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_WalkStart_F_180L.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_WalkStart_F_180L.uasset new file mode 100644 index 0000000..e6309de Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_WalkStart_F_180L.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_WalkStart_F_180R.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_WalkStart_F_180R.uasset new file mode 100644 index 0000000..66c4ea4 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_WalkStart_F_180R.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_WalkStart_F_90L.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_WalkStart_F_90L.uasset new file mode 100644 index 0000000..88a9c7b Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_WalkStart_F_90L.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_WalkStart_F_90R.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_WalkStart_F_90R.uasset new file mode 100644 index 0000000..fc668b0 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_WalkStart_F_90R.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_WalkStop_Abrupt_rf.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_WalkStop_Abrupt_rf.uasset new file mode 100644 index 0000000..5d065ac Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_WalkStop_Abrupt_rf.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_WalkStop_F_LowSpeed.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_WalkStop_F_LowSpeed.uasset new file mode 100644 index 0000000..319b675 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_WalkStop_F_LowSpeed.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_WalkStop_F_lf.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_WalkStop_F_lf.uasset new file mode 100644 index 0000000..e4f224f Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_WalkStop_F_lf.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_WalkStop_F_rf.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_WalkStop_F_rf.uasset new file mode 100644 index 0000000..f323240 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_WalkStop_F_rf.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_Walk_F.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_Walk_F.uasset new file mode 100644 index 0000000..a9b4674 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_Walk_F.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_Walk_F_StepDown_lf.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_Walk_F_StepDown_lf.uasset new file mode 100644 index 0000000..fd3b353 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_Walk_F_StepDown_lf.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_Walk_F_StepDown_rf.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_Walk_F_StepDown_rf.uasset new file mode 100644 index 0000000..bb76c21 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_Walk_F_StepDown_rf.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_Walk_F_StepUp_lf.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_Walk_F_StepUp_lf.uasset new file mode 100644 index 0000000..42bc405 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_Walk_F_StepUp_lf.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_Walk_F_StepUp_rf.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_Walk_F_StepUp_rf.uasset new file mode 100644 index 0000000..b114b97 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FP/Walk/FP_Walk_F_StepUp_rf.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTN_N_Idle_Base.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTN_N_Idle_Base.uasset new file mode 100644 index 0000000..83f01d8 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTN_N_Idle_Base.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTN_N_Idle_VarA.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTN_N_Idle_VarA.uasset new file mode 100644 index 0000000..5a0be87 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTN_N_Idle_VarA.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTN_N_Idle_VarB.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTN_N_Idle_VarB.uasset new file mode 100644 index 0000000..bead8fe Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTN_N_Idle_VarB.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTN_N_Idle_VarC.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTN_N_Idle_VarC.uasset new file mode 100644 index 0000000..6206201 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTN_N_Idle_VarC.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTN_N_Idle_VarD.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTN_N_Idle_VarD.uasset new file mode 100644 index 0000000..197c6fd Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTN_N_Idle_VarD.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTN_Purse_Hold.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTN_Purse_Hold.uasset new file mode 100644 index 0000000..9e82b77 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTN_Purse_Hold.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTO_N_Idle_Base.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTO_N_Idle_Base.uasset new file mode 100644 index 0000000..3e71123 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTO_N_Idle_Base.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTO_N_Idle_VarA.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTO_N_Idle_VarA.uasset new file mode 100644 index 0000000..e133baa Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTO_N_Idle_VarA.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTO_N_Idle_VarB.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTO_N_Idle_VarB.uasset new file mode 100644 index 0000000..2046b69 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTO_N_Idle_VarB.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTO_N_Idle_VarC.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTO_N_Idle_VarC.uasset new file mode 100644 index 0000000..0d181e8 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTO_N_Idle_VarC.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTO_N_Idle_VarD.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTO_N_Idle_VarD.uasset new file mode 100644 index 0000000..6cd6841 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTO_N_Idle_VarD.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTO_Purse_Hold.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTO_Purse_Hold.uasset new file mode 100644 index 0000000..073fef7 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTO_Purse_Hold.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTU_N_Idle_Base.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTU_N_Idle_Base.uasset new file mode 100644 index 0000000..e764b95 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTU_N_Idle_Base.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTU_N_Idle_VarA.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTU_N_Idle_VarA.uasset new file mode 100644 index 0000000..66f022f Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTU_N_Idle_VarA.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTU_N_Idle_VarB.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTU_N_Idle_VarB.uasset new file mode 100644 index 0000000..6c506a0 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTU_N_Idle_VarB.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTU_N_Idle_VarC.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTU_N_Idle_VarC.uasset new file mode 100644 index 0000000..7bee8bc Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTU_N_Idle_VarC.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTU_N_Idle_VarD.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTU_N_Idle_VarD.uasset new file mode 100644 index 0000000..b0f8e1e Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTU_N_Idle_VarD.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTU_Purse_Hold.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTU_Purse_Hold.uasset new file mode 100644 index 0000000..b0234a3 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Idle/FTU_Purse_Hold.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Walk/FTN_N_Walk_F.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Walk/FTN_N_Walk_F.uasset new file mode 100644 index 0000000..7e2748b Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Walk/FTN_N_Walk_F.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Walk/FTN_N_Walk_F_Quickly.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Walk/FTN_N_Walk_F_Quickly.uasset new file mode 100644 index 0000000..13382ff Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Walk/FTN_N_Walk_F_Quickly.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Walk/FTN_N_Walk_F_VarA.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Walk/FTN_N_Walk_F_VarA.uasset new file mode 100644 index 0000000..9aef66c Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Walk/FTN_N_Walk_F_VarA.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Walk/FTN_N_Walk_F_VarB.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Walk/FTN_N_Walk_F_VarB.uasset new file mode 100644 index 0000000..2c73610 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Walk/FTN_N_Walk_F_VarB.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Walk/FTO_N_Walk_F.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Walk/FTO_N_Walk_F.uasset new file mode 100644 index 0000000..70382a8 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Walk/FTO_N_Walk_F.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Walk/FTO_N_Walk_F_Quickly.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Walk/FTO_N_Walk_F_Quickly.uasset new file mode 100644 index 0000000..2440769 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Walk/FTO_N_Walk_F_Quickly.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Walk/FTO_N_Walk_F_VarA.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Walk/FTO_N_Walk_F_VarA.uasset new file mode 100644 index 0000000..f8799a8 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Walk/FTO_N_Walk_F_VarA.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Walk/FTO_N_Walk_F_VarB.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Walk/FTO_N_Walk_F_VarB.uasset new file mode 100644 index 0000000..498a6c3 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Walk/FTO_N_Walk_F_VarB.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Walk/FTU_N_Walk_F.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Walk/FTU_N_Walk_F.uasset new file mode 100644 index 0000000..2ac9a28 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Walk/FTU_N_Walk_F.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Walk/FTU_N_Walk_F_Quickly.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Walk/FTU_N_Walk_F_Quickly.uasset new file mode 100644 index 0000000..cfa443d Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Walk/FTU_N_Walk_F_Quickly.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Walk/FTU_N_Walk_F_VarA.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Walk/FTU_N_Walk_F_VarA.uasset new file mode 100644 index 0000000..ef3c7cb Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Walk/FTU_N_Walk_F_VarA.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Walk/FTU_N_Walk_F_VarB.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Walk/FTU_N_Walk_F_VarB.uasset new file mode 100644 index 0000000..c11ab99 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/FT/Walk/FTU_N_Walk_F_VarB.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Angry_E.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Angry_E.uasset new file mode 100644 index 0000000..eac289d Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Angry_E.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Angry_M.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Angry_M.uasset new file mode 100644 index 0000000..9b424a5 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Angry_M.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Angry_N.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Angry_N.uasset new file mode 100644 index 0000000..4811062 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Angry_N.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Concerned_E.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Concerned_E.uasset new file mode 100644 index 0000000..8ba319c Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Concerned_E.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Concerned_M.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Concerned_M.uasset new file mode 100644 index 0000000..18f53de Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Concerned_M.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Concerned_N.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Concerned_N.uasset new file mode 100644 index 0000000..81ef0e7 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Concerned_N.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Happy_E.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Happy_E.uasset new file mode 100644 index 0000000..563fd1a Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Happy_E.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Happy_M.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Happy_M.uasset new file mode 100644 index 0000000..04caed2 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Happy_M.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Happy_N.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Happy_N.uasset new file mode 100644 index 0000000..fff1fd7 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Happy_N.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Neutral_E.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Neutral_E.uasset new file mode 100644 index 0000000..f0430fd Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Neutral_E.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Neutral_M.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Neutral_M.uasset new file mode 100644 index 0000000..26e3a04 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Neutral_M.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Neutral_N.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Neutral_N.uasset new file mode 100644 index 0000000..7d52b50 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Neutral_N.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Reaction_N.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Reaction_N.uasset new file mode 100644 index 0000000..72a7e3b Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Reaction_N.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Stare_E.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Stare_E.uasset new file mode 100644 index 0000000..f6f7797 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Stare_E.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Stare_M.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Stare_M.uasset new file mode 100644 index 0000000..bf6b961 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Stare_M.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Stare_N.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Stare_N.uasset new file mode 100644 index 0000000..75ada43 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/Face/MHF_Stare_N.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/AO/MTN_N_AO_F.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/AO/MTN_N_AO_F.uasset new file mode 100644 index 0000000..45baff1 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/AO/MTN_N_AO_F.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/AO/MTN_N_AO_FD.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/AO/MTN_N_AO_FD.uasset new file mode 100644 index 0000000..f6f60a0 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/AO/MTN_N_AO_FD.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/AO/MTN_N_AO_FU.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/AO/MTN_N_AO_FU.uasset new file mode 100644 index 0000000..9d07c4e Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/AO/MTN_N_AO_FU.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/AO/MTN_N_AO_L.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/AO/MTN_N_AO_L.uasset new file mode 100644 index 0000000..bd78589 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/AO/MTN_N_AO_L.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/AO/MTN_N_AO_LD.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/AO/MTN_N_AO_LD.uasset new file mode 100644 index 0000000..7026c72 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/AO/MTN_N_AO_LD.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/AO/MTN_N_AO_LU.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/AO/MTN_N_AO_LU.uasset new file mode 100644 index 0000000..d48354f Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/AO/MTN_N_AO_LU.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/AO/MTN_N_AO_R.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/AO/MTN_N_AO_R.uasset new file mode 100644 index 0000000..40c4bee Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/AO/MTN_N_AO_R.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/AO/MTN_N_AO_RD.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/AO/MTN_N_AO_RD.uasset new file mode 100644 index 0000000..4faebe6 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/AO/MTN_N_AO_RD.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/AO/MTN_N_AO_RU.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/AO/MTN_N_AO_RU.uasset new file mode 100644 index 0000000..3ff5f4f Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/AO/MTN_N_AO_RU.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTN_Briefcase_Hold.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTN_Briefcase_Hold.uasset new file mode 100644 index 0000000..b009505 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTN_Briefcase_Hold.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTN_N_Idle.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTN_N_Idle.uasset new file mode 100644 index 0000000..f860b2e Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTN_N_Idle.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTN_N_Idle_B.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTN_N_Idle_B.uasset new file mode 100644 index 0000000..85811ef Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTN_N_Idle_B.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTN_N_Idle_C.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTN_N_Idle_C.uasset new file mode 100644 index 0000000..4c770e4 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTN_N_Idle_C.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTN_N_Idle_D.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTN_N_Idle_D.uasset new file mode 100644 index 0000000..e37ba21 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTN_N_Idle_D.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTN_N_Idle_E.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTN_N_Idle_E.uasset new file mode 100644 index 0000000..6f9f6bd Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTN_N_Idle_E.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTO_Briefcase_Hold.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTO_Briefcase_Hold.uasset new file mode 100644 index 0000000..01adc68 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTO_Briefcase_Hold.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTO_N_Idle.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTO_N_Idle.uasset new file mode 100644 index 0000000..c43e324 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTO_N_Idle.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTO_N_Idle_B.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTO_N_Idle_B.uasset new file mode 100644 index 0000000..e1047ec Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTO_N_Idle_B.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTO_N_Idle_C.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTO_N_Idle_C.uasset new file mode 100644 index 0000000..aa901ec Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTO_N_Idle_C.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTO_N_Idle_D.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTO_N_Idle_D.uasset new file mode 100644 index 0000000..533efbd Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTO_N_Idle_D.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTO_N_Idle_E.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTO_N_Idle_E.uasset new file mode 100644 index 0000000..75808e0 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTO_N_Idle_E.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTU_Briefcase_Hold.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTU_Briefcase_Hold.uasset new file mode 100644 index 0000000..44fdfab Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTU_Briefcase_Hold.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTU_N_Idle.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTU_N_Idle.uasset new file mode 100644 index 0000000..0e3fbd2 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTU_N_Idle.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTU_N_Idle_B.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTU_N_Idle_B.uasset new file mode 100644 index 0000000..1571508 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTU_N_Idle_B.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTU_N_Idle_C.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTU_N_Idle_C.uasset new file mode 100644 index 0000000..1a33aa2 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTU_N_Idle_C.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTU_N_Idle_D.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTU_N_Idle_D.uasset new file mode 100644 index 0000000..096f51a Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTU_N_Idle_D.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTU_N_Idle_E.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTU_N_Idle_E.uasset new file mode 100644 index 0000000..9e25d45 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Idle/MTU_N_Idle_E.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Walk/MTN_N_WalkInPlace.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Walk/MTN_N_WalkInPlace.uasset new file mode 100644 index 0000000..22ef5ed Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Walk/MTN_N_WalkInPlace.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Walk/MTO_N_Walk_F_VarB.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Walk/MTO_N_Walk_F_VarB.uasset new file mode 100644 index 0000000..af18b8e Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Walk/MTO_N_Walk_F_VarB.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Walk/MTU_N_Walk_F_VarB.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Walk/MTU_N_Walk_F_VarB.uasset new file mode 100644 index 0000000..1b24fdb Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Walk/MTU_N_Walk_F_VarB.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Walk/MTU_N_Walk_F_VarF.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Walk/MTU_N_Walk_F_VarF.uasset new file mode 100644 index 0000000..a616940 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/Motions2/MT/Walk/MTU_N_Walk_F_VarF.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/SK_Preview/Fbx_Default_Material_0.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/SK_Preview/Fbx_Default_Material_0.uasset new file mode 100644 index 0000000..c706173 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/SK_Preview/Fbx_Default_Material_0.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/SK_Preview/m_med_nrw_preview_FULL.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/SK_Preview/m_med_nrw_preview_FULL.uasset new file mode 100644 index 0000000..18385d7 Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/SK_Preview/m_med_nrw_preview_FULL.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/SK_Preview/m_med_nrw_preview_FULL_PhysicsAsset.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/SK_Preview/m_med_nrw_preview_FULL_PhysicsAsset.uasset new file mode 100644 index 0000000..010d5fe Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Animations/SK_Preview/m_med_nrw_preview_FULL_PhysicsAsset.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Emotions/Full_Emotion_NoMouth_spectrum.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Emotions/Full_Emotion_NoMouth_spectrum.uasset new file mode 100644 index 0000000..b1f646e Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Emotions/Full_Emotion_NoMouth_spectrum.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Emotions/Full_Emotion_spectrum.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Emotions/Full_Emotion_spectrum.uasset new file mode 100644 index 0000000..dd627af Binary files /dev/null and b/Unreal/PS_AI_Agent/Content/MetaHumans/Emotions/Full_Emotion_spectrum.uasset differ diff --git a/Unreal/PS_AI_Agent/Content/MetaHumans/Taro/BP_Taro.uasset b/Unreal/PS_AI_Agent/Content/MetaHumans/Taro/BP_Taro.uasset index af89517..5707f93 100644 Binary files a/Unreal/PS_AI_Agent/Content/MetaHumans/Taro/BP_Taro.uasset and b/Unreal/PS_AI_Agent/Content/MetaHumans/Taro/BP_Taro.uasset differ diff --git a/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Private/ElevenLabsLipSyncComponent.cpp b/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Private/ElevenLabsLipSyncComponent.cpp index 2d2b934..3a5f073 100644 --- a/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Private/ElevenLabsLipSyncComponent.cpp +++ b/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Private/ElevenLabsLipSyncComponent.cpp @@ -1,11 +1,14 @@ // Copyright ASTERION. All Rights Reserved. #include "ElevenLabsLipSyncComponent.h" +#include "ElevenLabsLipSyncPoseMap.h" #include "ElevenLabsConversationalAgentComponent.h" #include "ElevenLabsDefinitions.h" #include "Components/SkeletalMeshComponent.h" #include "Engine/SkeletalMesh.h" #include "Animation/MorphTarget.h" +#include "Animation/AnimSequence.h" +#include "Animation/AnimData/IAnimationDataModel.h" #include "GameFramework/Actor.h" DEFINE_LOG_CATEGORY_STATIC(LogElevenLabsLipSync, Log, All); @@ -383,6 +386,159 @@ void UElevenLabsLipSyncComponent::BeginPlay() TEXT("Found %d morph targets — using standard SetMorphTarget mode."), MorphCount); } } + + // Extract curve data from phoneme pose AnimSequences (if assigned). + // Must be called after TargetMesh / bUseCurveMode detection above. + InitializePoseMappings(); +} + +// ───────────────────────────────────────────────────────────────────────────── +// Phoneme pose curve extraction +// ───────────────────────────────────────────────────────────────────────────── + +void UElevenLabsLipSyncComponent::ExtractPoseCurves(const FName& VisemeName, UAnimSequence* AnimSeq) +{ + if (!AnimSeq) return; + + const IAnimationDataModel* DataModel = AnimSeq->GetDataModel(); + if (!DataModel) + { + UE_LOG(LogElevenLabsLipSync, Warning, + TEXT("Pose '%s' (%s): No DataModel available — skipping."), + *VisemeName.ToString(), *AnimSeq->GetName()); + return; + } + + TMap CurveValues; + const TArray& FloatCurves = DataModel->GetFloatCurves(); + + for (const FFloatCurve& Curve : FloatCurves) + { + const FName CurveName = Curve.GetName(); + const float Value = Curve.FloatCurve.Eval(0.0f); + + // Skip curves with near-zero values — not part of this pose's expression + if (FMath::Abs(Value) < 0.001f) continue; + + CurveValues.Add(CurveName, Value); + + // Auto-detect naming convention from the very first non-zero curve we encounter + if (!bPosesUseCTRLNaming && PoseExtractedCurveMap.Num() == 0 && CurveValues.Num() == 1) + { + bPosesUseCTRLNaming = CurveName.ToString().StartsWith(TEXT("CTRL_")); + UE_LOG(LogElevenLabsLipSync, Log, + TEXT("Pose curve naming detected: %s (from curve '%s')"), + bPosesUseCTRLNaming ? TEXT("CTRL_expressions_*") : TEXT("ARKit / other"), + *CurveName.ToString()); + } + } + + if (CurveValues.Num() > 0) + { + PoseExtractedCurveMap.Add(VisemeName, MoveTemp(CurveValues)); + UE_LOG(LogElevenLabsLipSync, Log, + TEXT("Pose '%s' (%s): Extracted %d non-zero curves."), + *VisemeName.ToString(), *AnimSeq->GetName(), + PoseExtractedCurveMap[VisemeName].Num()); + } + else + { + // Still add an empty map so we know this viseme was assigned (silence pose) + PoseExtractedCurveMap.Add(VisemeName, TMap()); + UE_LOG(LogElevenLabsLipSync, Log, + TEXT("Pose '%s' (%s): All curves are zero — neutral/silence pose."), + *VisemeName.ToString(), *AnimSeq->GetName()); + } +} + +void UElevenLabsLipSyncComponent::InitializePoseMappings() +{ + PoseExtractedCurveMap.Reset(); + bPosesUseCTRLNaming = false; + + if (!PoseMap) + { + UE_LOG(LogElevenLabsLipSync, Log, + TEXT("No PoseMap assigned — using hardcoded ARKit mapping.")); + return; + } + + UE_LOG(LogElevenLabsLipSync, Log, + TEXT("Loading pose map: %s"), *PoseMap->GetName()); + + // Map each PoseMap property to its corresponding OVR viseme name + struct FPoseMapping { FName VisemeName; UAnimSequence* AnimSeq; }; + const TArray Mappings = { + { FName("sil"), PoseMap->PoseSilence }, + { FName("PP"), PoseMap->PosePBM }, + { FName("FF"), PoseMap->PoseFV }, + { FName("TH"), PoseMap->PoseTH }, + { FName("DD"), PoseMap->PoseTD }, + { FName("kk"), PoseMap->PoseKG }, + { FName("CH"), PoseMap->PoseCH }, + { FName("SS"), PoseMap->PoseSZ }, + { FName("nn"), PoseMap->PoseNL }, + { FName("RR"), PoseMap->PoseRR }, + { FName("aa"), PoseMap->PoseAA }, + { FName("E"), PoseMap->PoseEE }, + { FName("ih"), PoseMap->PoseII }, + { FName("oh"), PoseMap->PoseOH }, + { FName("ou"), PoseMap->PoseOU }, + }; + + int32 AssignedCount = 0; + for (const FPoseMapping& M : Mappings) + { + if (M.AnimSeq) + { + ExtractPoseCurves(M.VisemeName, M.AnimSeq); + ++AssignedCount; + } + } + + if (AssignedCount > 0) + { + UE_LOG(LogElevenLabsLipSync, Log, + TEXT("=== Pose-based lip sync: %d/%d poses assigned, %d curve mappings extracted ==="), + AssignedCount, Mappings.Num(), PoseExtractedCurveMap.Num()); + UE_LOG(LogElevenLabsLipSync, Log, + TEXT("Curve naming: %s"), + bPosesUseCTRLNaming ? TEXT("CTRL_expressions_* (MetaHuman native)") : TEXT("ARKit / standard")); + + if (bPosesUseCTRLNaming) + { + UE_LOG(LogElevenLabsLipSync, Warning, + TEXT("IMPORTANT: Poses use CTRL_expressions_* curves. " + "Move the ElevenLabs Lip Sync AnimNode AFTER mh_arkit_mapping_pose " + "in the Face AnimBP for correct results.")); + } + + // Log sample curves from the first non-empty pose for debugging + for (const auto& PoseEntry : PoseExtractedCurveMap) + { + if (PoseEntry.Value.Num() > 0) + { + FString CurveList; + int32 Count = 0; + for (const auto& Pair : PoseEntry.Value) + { + if (Count > 0) CurveList += TEXT(", "); + CurveList += FString::Printf(TEXT("%s=%.3f"), + *Pair.Key.ToString(), Pair.Value); + if (++Count >= 8) { CurveList += TEXT(" ..."); break; } + } + UE_LOG(LogElevenLabsLipSync, Log, + TEXT(" Sample '%s': [%s]"), + *PoseEntry.Key.ToString(), *CurveList); + break; // Only log one sample + } + } + } + else + { + UE_LOG(LogElevenLabsLipSync, Log, + TEXT("No phoneme pose AnimSequences assigned — using hardcoded ARKit mapping.")); + } } void UElevenLabsLipSyncComponent::EndPlay(const EEndPlayReason::Type EndPlayReason) @@ -507,11 +663,17 @@ void UElevenLabsLipSyncComponent::TickComponent(float DeltaTime, ELevelTick Tick } // ── Asymmetric smoothing ───────────────────────────────────────────────── - // At SmoothingSpeed=15: AttackSpeed=15 → alpha=0.24/frame, ~4 frames to 70%. - // ReleaseSpeed=7.5 → alpha=0.12/frame, ~9 frames to 70%. Mouth opens quickly, + // At SmoothingSpeed=50: AttackSpeed=50 → alpha=0.83/frame, ~1-2 frames to target. + // ReleaseSpeed=32.5 → alpha=0.54/frame, ~3 frames to 70%. Mouth opens quickly, // closes more gradually for natural-looking speech. - const float AttackSpeed = SmoothingSpeed * 1.0f; - const float ReleaseSpeed = SmoothingSpeed * 0.65f; + // + // In pose mode, use gentler smoothing: the spectral analysis oscillates + // between frames and with 50+ simultaneous curves per viseme, rapid + // tracking amplifies noise into visible vibration. Slower smoothing + // absorbs the oscillation while keeping movements deliberate and clean. + const bool bPoseSmoothing = (PoseExtractedCurveMap.Num() > 0); + const float AttackSpeed = SmoothingSpeed * (bPoseSmoothing ? 0.7f : 1.0f); + const float ReleaseSpeed = SmoothingSpeed * (bPoseSmoothing ? 0.45f : 0.65f); bool bAnyNonZero = false; for (const FName& Name : VisemeNames) @@ -554,17 +716,25 @@ void UElevenLabsLipSyncComponent::TickComponent(float DeltaTime, ELevelTick Tick MapVisemesToBlendshapes(); // ── Additional blendshape-level smoothing ───────────────────────────── - // A second smoothing pass on the final ARKit blendshape values removes - // residual jitter from the OVR→ARKit mapping step. This is lighter than - // the viseme-level smoothing and provides a natural "soft" look. + // A second smoothing pass on the final blendshape values removes + // residual jitter from the OVR→blendshape mapping step. + // + // In pose mode, SKIP the Lerp pass — the viseme-level smoothing is + // sufficient and double-smoothing introduces lag that fights the viseme + // interpolation, causing visible vibration across 50+ coordinated + // pose curves. Only keep snap-to-zero for clean neutral pose return. { + const bool bSkipBSLerp = (PoseExtractedCurveMap.Num() > 0); const float BSmoothAlpha = FMath::Clamp(DeltaTime * SmoothingSpeed * 0.4f, 0.0f, 1.0f); for (auto& Pair : CurrentBlendshapes) { - const float* Prev = PreviousBlendshapes.Find(Pair.Key); - if (Prev) + if (!bSkipBSLerp) { - Pair.Value = FMath::Lerp(*Prev, Pair.Value, BSmoothAlpha); + const float* Prev = PreviousBlendshapes.Find(Pair.Key); + if (Prev) + { + Pair.Value = FMath::Lerp(*Prev, Pair.Value, BSmoothAlpha); + } } // Snap to zero to prevent the mouth from staying slightly open // after speech ends. Without this, the asymptotic Lerp decay @@ -681,16 +851,24 @@ void UElevenLabsLipSyncComponent::OnAudioChunkReceived(const TArray& PCMD FloatBuffer.Add(static_cast(Samples[i]) / 32768.0f); } - // ── STEP 1: ONE spectral analysis for the whole chunk (SHAPE) ───────── - // The FSpectrumAnalyzer's ring buffer returns nearly identical results for - // sequential 512-sample pushes. So we analyze the chunk as a whole to - // determine which mouth shape (viseme blend) to use. - SpectrumAnalyzer->PushAudio(FloatBuffer.GetData(), NumSamples); - SpectrumAnalyzer->PerformAnalysisIfPossible(true); - AnalyzeSpectrum(); // Sets TargetVisemes with shape-only weights (~1.0) + // ── STEP 1: Spectral analysis for mouth SHAPE (skip in pose mode) ──── + // In pose mode, text visemes provide the shape and spectral analysis is + // unnecessary — all frame shapes will be overwritten by text-driven + // visemes or pseudo-speech fallback anyway. Skipping it also removes + // a source of noise that amplifies vibration across 50+ pose curves. + const bool bPoseMode = (PoseExtractedCurveMap.Num() > 0); + TMap ChunkShape; - // Save the spectral shape for this chunk - TMap ChunkShape = TargetVisemes; + if (!bPoseMode) + { + // The FSpectrumAnalyzer's ring buffer returns nearly identical results for + // sequential 512-sample pushes. So we analyze the chunk as a whole to + // determine which mouth shape (viseme blend) to use. + SpectrumAnalyzer->PushAudio(FloatBuffer.GetData(), NumSamples); + SpectrumAnalyzer->PerformAnalysisIfPossible(true); + AnalyzeSpectrum(); // Sets TargetVisemes with shape-only weights (~1.0) + ChunkShape = TargetVisemes; + } // ── Late start fix: when queue was empty, delay playback to wait for text ── // Partial text usually arrives 50-100ms before audio, but sometimes audio @@ -698,16 +876,78 @@ void UElevenLabsLipSyncComponent::OnAudioChunkReceived(const TArray& PCMD // the first frames, preventing mute mouth at utterance start. const bool bQueueWasEmpty = (VisemeQueue.Num() == 0); - // ── STEP 2: Per-window amplitude + ZCR (DYNAMICS + VARIATION) ───────── + // ── STEP 2: Build per-window viseme queue frames ───────────────────── + constexpr int32 WindowSize = 512; + int32 WindowsQueued = 0; + float MinAmp = 1.0f, MaxAmp = 0.0f; // For debug logging + + if (bPoseMode) + { + // ── Pose mode: hybrid amplitude ────────────────────────────────── + // Two amplitude levels serve different purposes: + // + // 1. CHUNK-LEVEL RMS → shape intensity (smooth, no per-window jitter). + // All active frames use this amplitude so 50+ pose curves don't + // vibrate from 32ms-level amplitude oscillation. + // + // 2. PER-WINDOW RMS → silence detection only (binary: speech or pause). + // Detects intra-chunk silence windows that chunk-level averaging + // would miss. This makes audio pauses (commas, breathing) visible + // as the mouth properly closes during gaps. + // + float ChunkSumSq = 0.0f; + for (int32 i = 0; i < NumSamples; ++i) + ChunkSumSq += FloatBuffer[i] * FloatBuffer[i]; + const float ChunkRMS = FMath::Sqrt(ChunkSumSq / FMath::Max(1.0f, static_cast(NumSamples))); + float ChunkAmplitude = FMath::Clamp(ChunkRMS * 10.0f, 0.0f, 1.5f); + ChunkAmplitude = FMath::Clamp(FMath::Pow(ChunkAmplitude, 0.4f), 0.0f, 1.0f); + ChunkAmplitude *= AmplitudeScale; + + for (int32 Offset = 0; Offset + WindowSize <= NumSamples; Offset += WindowSize) + { + // Per-window amplitude for silence detection + float WindowSumSq = 0.0f; + const int32 WindowEnd = FMath::Min(Offset + WindowSize, NumSamples); + const int32 WindowLen = WindowEnd - Offset; + for (int32 s = Offset; s < WindowEnd; ++s) + WindowSumSq += FloatBuffer[s] * FloatBuffer[s]; + float WindowAmp = FMath::Sqrt(WindowSumSq / FMath::Max(1.0f, static_cast(WindowLen))); + WindowAmp = FMath::Clamp(WindowAmp * 10.0f, 0.0f, 1.5f); + WindowAmp = FMath::Clamp(FMath::Pow(WindowAmp, 0.4f), 0.0f, 1.0f); + WindowAmp *= AmplitudeScale; + + const bool bSilentWindow = (WindowAmp < 0.08f); + + TMap Frame; + for (const FName& Name : VisemeNames) + Frame.Add(Name, 0.0f); + + if (bSilentWindow) + { + Frame.FindOrAdd(FName("sil")) = 1.0f; + AmplitudeQueue.Add(0.0f); // Marked silent for ApplyTextVisemesToQueue + } + else + { + Frame.FindOrAdd(FName("aa")) = ChunkAmplitude; // Smooth chunk intensity + AmplitudeQueue.Add(ChunkAmplitude); + } + + VisemeQueue.Add(Frame); + MinAmp = FMath::Min(MinAmp, bSilentWindow ? 0.0f : ChunkAmplitude); + MaxAmp = FMath::Max(MaxAmp, ChunkAmplitude); + WindowsQueued++; + } + } + + if (!bPoseMode) + { + // ── Per-window amplitude + ZCR (DYNAMICS + VARIATION) ──────────────── // For each 512-sample window (~32ms), compute: // - RMS amplitude: captures syllable rhythm (natural opening/closing) // - Zero-crossing rate: detects sibilants/fricatives within the chunk // The shape (which visemes) stays constant per chunk, but the amplitude // (how much) varies per window, creating realistic speech dynamics. - constexpr int32 WindowSize = 512; - int32 WindowsQueued = 0; - float MinAmp = 1.0f, MaxAmp = 0.0f; // For debug logging - for (int32 Offset = 0; Offset + WindowSize <= NumSamples; Offset += WindowSize) { // RMS amplitude for this window @@ -799,6 +1039,7 @@ void UElevenLabsLipSyncComponent::OnAudioChunkReceived(const TArray& PCMD AmplitudeQueue.Add(Amplitude); WindowsQueued++; } + } // if (!bPoseMode) // ── Pseudo-speech fallback (no text available) ────────────────────── // When text visemes are not available (server doesn't send partial text, @@ -1015,7 +1256,7 @@ void UElevenLabsLipSyncComponent::OnTextResponseReceived(const FString& Response WaitElapsed * 1000.0); } - // Log the viseme sequence for debugging + // Log the viseme sequence for debugging (Log level so it's always visible) { FString VisSeq; int32 Count = 0; @@ -1023,9 +1264,10 @@ void UElevenLabsLipSyncComponent::OnTextResponseReceived(const FString& Response { if (Count > 0) VisSeq += TEXT(" "); VisSeq += V.ToString(); - if (++Count >= 30) { VisSeq += TEXT(" ..."); break; } + if (++Count >= 50) { VisSeq += TEXT(" ..."); break; } } - UE_LOG(LogElevenLabsLipSync, Verbose, TEXT("Viseme sequence: [%s]"), *VisSeq); + UE_LOG(LogElevenLabsLipSync, Log, TEXT("Viseme sequence (%d): [%s]"), + TextVisemeSequence.Num(), *VisSeq); } // NOTE: Do NOT reset bTextVisemesApplied here. It's reset in TickComponent @@ -1204,6 +1446,48 @@ void UElevenLabsLipSyncComponent::ConvertTextToVisemes(const FString& Text) TextVisemeSequence.Add(FName("SS")); i += 2; continue; } + if (C == 'c' && C1 == 'c') + { + // cc → /k/ (single: "accord", "accueil") + TextVisemeSequence.Add(FName("kk")); + i += 2; continue; + } + if (C == 'p' && C1 == 'p') + { + // pp → /p/ (single: "appeler", "frapper") + TextVisemeSequence.Add(FName("PP")); + i += 2; continue; + } + if (C == 'f' && C1 == 'f') + { + // ff → /f/ (single: "effort", "affaire") + TextVisemeSequence.Add(FName("FF")); + i += 2; continue; + } + if (C == 'r' && C1 == 'r') + { + // rr → /ʁ/ (single: "arriver", "terrasse") + TextVisemeSequence.Add(FName("RR")); + i += 2; continue; + } + if (C == 'b' && C1 == 'b') + { + // bb → /b/ (single: rare in French — "abbé") + TextVisemeSequence.Add(FName("PP")); + i += 2; continue; + } + if (C == 'g' && C1 == 'g') + { + // gg → /g/ (single: "aggraver") + TextVisemeSequence.Add(FName("kk")); + i += 2; continue; + } + if (C == 'd' && C1 == 'd') + { + // dd → /d/ (single: "addition") + TextVisemeSequence.Add(FName("DD")); + i += 2; continue; + } if (C == 'm' && C1 == 'm') { // mm → /m/ @@ -1238,8 +1522,12 @@ void UElevenLabsLipSyncComponent::ConvertTextToVisemes(const FString& Text) // ── French silent letters at end of word ────────────────────────── // In French, final s, t, d, x, z are typically silent. // Examples: "vous" → /vu/, "comment" → /kɔmɑ̃/, "allez" → /ale/ + // Note: a character before an apostrophe is NOT word-final — it's + // a liaison (d'accord → d is onset of "accord", s'il → s is onset). { - bool bIsWordFinal = (i + 1 >= Lower.Len()) || !FChar::IsAlpha(Lower[i + 1]); + const TCHAR NextChar = (i + 1 < Lower.Len()) ? Lower[i + 1] : 0; + bool bIsWordFinal = (i + 1 >= Lower.Len()) + || (!FChar::IsAlpha(NextChar) && NextChar != '\'' && NextChar != TCHAR(0x2019)); // Silent final consonants if (bIsWordFinal && (C == 's' || C == 't' || C == 'd' || C == 'x' || C == 'z')) @@ -1250,9 +1538,20 @@ void UElevenLabsLipSyncComponent::ConvertTextToVisemes(const FString& Text) // e muet (silent 'e') at end of word — not é, è, ê // Plain 'e' at end of a word is usually silent in French. // Accented variants (é=0xE9, è=0xE8, ê=0xEA) are always pronounced. + // Exception: short words (≤2 chars) like "je", "de", "le" — the 'e' + // is the only vowel and IS pronounced. if (C == 'e' && bIsWordFinal && i > 0 && FChar::IsAlpha(Lower[i - 1])) { - i++; continue; + // Find word start to check length + int32 WordStart = i; + while (WordStart > 0 && FChar::IsAlpha(Lower[WordStart - 1])) + WordStart--; + const int32 WordLen = i - WordStart + 1; + if (WordLen > 2) + { + i++; continue; // Skip e-muet in words longer than 2 characters + } + // Short words (je, de, le, me, se, ce, te, ne): fall through to vowel } } @@ -1313,11 +1612,16 @@ void UElevenLabsLipSyncComponent::ConvertTextToVisemes(const FString& Text) case 'z': TextVisemeSequence.Add(FName("SS")); break; - // Space / punctuation → silence - case ' ': case ',': case '.': case '!': case '?': case ';': case ':': - case '-': case '\n': case '\r': + // Punctuation → silence (brief pause in speech) + case ',': case '.': case '!': case '?': case ';': case ':': TextVisemeSequence.Add(FName("sil")); break; + // Word boundaries — NO viseme. In natural speech there's no pause + // between words; interpolation between adjacent visemes handles + // the transition. This drastically reduces viseme count. + case ' ': case '-': case '\n': case '\r': + break; + default: // Unknown character — skip break; @@ -1326,54 +1630,62 @@ void UElevenLabsLipSyncComponent::ConvertTextToVisemes(const FString& Text) i++; } - // ── Post-processing: merge consecutive silence entries ──────────────── - // "Bonjour, " generates two sil (comma + space). Collapse to one. + // ── Post-processing: syllable-core filter ───────────────────────────── + // Keep only visually meaningful mouth shapes: + // - Vowels (aa, E, ih, oh, ou) — syllable nuclei, the "beats" of speech + // - Lip-visible consonants (PP=P/B/M, FF=F/V, CH=CH/SH/J) — visible onsets + // - Skip invisible consonants (DD, kk, SS, nn, RR, TH) — tongue/throat + // - Skip sil — audio amplitude handles pauses naturally + // This produces ~1-2 visemes per syllable, matching natural speech rhythm + // and avoiding the "frantic mouth" look from articulating every phoneme. { - TArray Merged; - Merged.Reserve(TextVisemeSequence.Num()); + static const TSet VisibleVisemes = { + FName("aa"), FName("E"), FName("ih"), FName("oh"), FName("ou"), // vowels + FName("PP"), FName("FF"), FName("CH"), // lip-visible consonants + }; + + const int32 RawCount = TextVisemeSequence.Num(); + + TArray Filtered; + Filtered.Reserve(RawCount); for (const FName& V : TextVisemeSequence) { - if (V == FName("sil") && Merged.Num() > 0 && Merged.Last() == FName("sil")) - continue; // Skip duplicate sil - Merged.Add(V); + if (VisibleVisemes.Contains(V)) + { + // Also merge consecutive duplicates + if (Filtered.Num() == 0 || Filtered.Last() != V) + Filtered.Add(V); + } } - // Also strip leading/trailing sil - while (Merged.Num() > 0 && Merged[0] == FName("sil")) - Merged.RemoveAt(0); - while (Merged.Num() > 0 && Merged.Last() == FName("sil")) - Merged.RemoveAt(Merged.Num() - 1); - TextVisemeSequence = MoveTemp(Merged); + UE_LOG(LogElevenLabsLipSync, Log, + TEXT("Syllable filter: %d raw → %d visible (removed %d invisible consonants/sil)"), + RawCount, Filtered.Num(), RawCount - Filtered.Num()); + + TextVisemeSequence = MoveTemp(Filtered); } } -// Duration weights for viseme types. -// Vowels naturally last longer than consonants in speech. -// These weights control how many audio frames each viseme occupies. +// Duration weights for syllable-core viseme types. +// Only vowels and lip-visible consonants remain after filtering. +// Vowels are syllable nuclei (sustained, mouth held open). +// Visible consonants are quick transitions (lip closure/rounding). static float GetVisemeDurationWeight(const FName& Viseme) { - // Vowels — sustained, mouth held open: ~100-150ms + // Open vowels — sustained, mouth wide open: ~120-160ms if (Viseme == FName("aa") || Viseme == FName("oh") || Viseme == FName("E")) return 2.0f; + + // Close vowels — slightly shorter: ~100-130ms if (Viseme == FName("ih") || Viseme == FName("ou")) return 1.7f; - // Liquids / nasals — semi-sustained: ~60-100ms - if (Viseme == FName("RR") || Viseme == FName("nn")) - return 1.5f; - - // Fricatives — moderate duration: ~60-80ms - if (Viseme == FName("SS") || Viseme == FName("FF") || Viseme == FName("CH") || Viseme == FName("TH")) - return 1.2f; - - // Plosives — short closure: ~50-70ms (not too short to avoid frantic look) - if (Viseme == FName("PP") || Viseme == FName("DD") || Viseme == FName("kk")) + // Lip-visible consonants — quick closure/shape: ~50-80ms + // PP (P/B/M): lip closure, FF (F/V): lip-teeth, CH (CH/SH/J): lip rounding + if (Viseme == FName("PP") || Viseme == FName("FF") || Viseme == FName("CH")) return 0.8f; - // Silence — brief pause between words (keep short to avoid frozen look) - if (Viseme == FName("sil")) - return 1.0f; - + // Fallback for any other viseme (shouldn't happen with syllable filter) return 1.0f; } @@ -1381,7 +1693,9 @@ void UElevenLabsLipSyncComponent::ApplyTextVisemesToQueue() { if (TextVisemeSequence.Num() == 0 || VisemeQueue.Num() == 0) return; - // Count non-silent frames (amplitude > threshold) in the queue + // Count non-silent frames (amplitude > threshold) in the queue. + // Silent frames (detected per-window in OnAudioChunkReceived) are left + // untouched — the mouth closes naturally during audio pauses. int32 ActiveFrames = 0; for (int32 Idx = 0; Idx < AmplitudeQueue.Num(); ++Idx) { @@ -1391,29 +1705,30 @@ void UElevenLabsLipSyncComponent::ApplyTextVisemesToQueue() if (ActiveFrames == 0) return; - // ── Duration-weighted distribution ──────────────────────────────────── - // Vowels get more frames than consonants, creating natural timing where - // the mouth lingers on open vowels and quickly transitions through plosives. + const int32 SeqNum = TextVisemeSequence.Num(); + + // ── Duration-weighted distribution ──────────────────────────────────── + // The syllable-core filter in ConvertTextToVisemes already reduced the + // sequence to vowels + visible consonants (~1-2 per syllable). + // Here we distribute them across active audio frames with duration + // weighting: vowels linger, consonants transition quickly. - // Compute total weighted duration of the viseme sequence float TotalWeight = 0.0f; for (const FName& V : TextVisemeSequence) { TotalWeight += GetVisemeDurationWeight(V); } - // Build a cumulative weight array for mapping frame index → viseme index. - // CumulativeWeight[i] = sum of weights from viseme 0..i-1 + // Cumulative weight array for mapping frame index → viseme index. TArray CumulativeWeight; - CumulativeWeight.SetNum(TextVisemeSequence.Num() + 1); + CumulativeWeight.SetNum(SeqNum + 1); CumulativeWeight[0] = 0.0f; - for (int32 V = 0; V < TextVisemeSequence.Num(); ++V) + for (int32 V = 0; V < SeqNum; ++V) { CumulativeWeight[V + 1] = CumulativeWeight[V] + GetVisemeDurationWeight(TextVisemeSequence[V]); } - // For each active audio frame, find which viseme it maps to based on - // its proportional position in the weighted timeline. + // For each active audio frame, find which viseme it maps to. int32 ActiveIdx = 0; for (int32 Idx = 0; Idx < VisemeQueue.Num() && Idx < AmplitudeQueue.Num(); ++Idx) { @@ -1421,16 +1736,16 @@ void UElevenLabsLipSyncComponent::ApplyTextVisemesToQueue() if (Amp < 0.08f) { - // Silent frame — keep as silence + // Silent frame — mouth closes via audio silence, skip distribution continue; } // Where are we in the weighted timeline? (0..TotalWeight) const float TimelinePos = (static_cast(ActiveIdx) / static_cast(ActiveFrames)) * TotalWeight; - // Find which viseme this position falls into (binary-style search) + // Find which viseme this position falls into int32 VisemeIdx = 0; - for (int32 V = 0; V < TextVisemeSequence.Num(); ++V) + for (int32 V = 0; V < SeqNum; ++V) { if (TimelinePos >= CumulativeWeight[V] && TimelinePos < CumulativeWeight[V + 1]) { @@ -1449,8 +1764,8 @@ void UElevenLabsLipSyncComponent::ApplyTextVisemesToQueue() ? FMath::Clamp((TimelinePos - VisemeStart) / VisemeDuration, 0.0f, 1.0f) : 0.0f; - // Next viseme for blending during the last 30% of each viseme - const int32 NextIdx = FMath::Min(VisemeIdx + 1, TextVisemeSequence.Num() - 1); + // Next viseme for anticipatory blending during the last 30% + const int32 NextIdx = FMath::Min(VisemeIdx + 1, SeqNum - 1); const FName NextViseme = TextVisemeSequence[NextIdx]; // Rebuild this frame: text-derived shape × stored amplitude @@ -1460,30 +1775,22 @@ void UElevenLabsLipSyncComponent::ApplyTextVisemesToQueue() Frame.FindOrAdd(Name) = 0.0f; } - if (TextViseme == FName("sil")) + // Anticipatory blending: in the last 30% of each viseme, + // gradually blend towards the next viseme shape. + const float BlendZone = 0.3f; + float BlendToNext = 0.0f; + if (LocalProgress > (1.0f - BlendZone) && NextViseme != TextViseme) { - // Text-driven silence — mouth closes - Frame.FindOrAdd(FName("sil")) = 1.0f; + BlendToNext = (LocalProgress - (1.0f - BlendZone)) / BlendZone; } - else + + // Primary viseme shape × amplitude + Frame.FindOrAdd(TextViseme) += Amp * (1.0f - BlendToNext * 0.5f); + + // Blend towards next viseme + if (BlendToNext > 0.0f) { - // Anticipatory blending: in the last 30% of each viseme, - // gradually blend towards the next viseme shape. - const float BlendZone = 0.3f; - float BlendToNext = 0.0f; - if (LocalProgress > (1.0f - BlendZone) && NextViseme != TextViseme && NextViseme != FName("sil")) - { - BlendToNext = (LocalProgress - (1.0f - BlendZone)) / BlendZone; - } - - // Primary viseme shape × amplitude - Frame.FindOrAdd(TextViseme) += Amp * (1.0f - BlendToNext * 0.5f); - - // Blend towards next viseme - if (BlendToNext > 0.0f && NextViseme != FName("sil")) - { - Frame.FindOrAdd(NextViseme) += Amp * BlendToNext * 0.5f; - } + Frame.FindOrAdd(NextViseme) += Amp * BlendToNext * 0.5f; } ActiveIdx++; @@ -1491,9 +1798,12 @@ void UElevenLabsLipSyncComponent::ApplyTextVisemesToQueue() bTextVisemesApplied = true; + const float FinalRatio = static_cast(ActiveFrames) / static_cast(SeqNum); + UE_LOG(LogElevenLabsLipSync, Log, - TEXT("Applied %d text visemes to %d active frames (of %d total)"), - TextVisemeSequence.Num(), ActiveFrames, VisemeQueue.Num()); + TEXT("Applied %d syllable-visemes to %d active frames (of %d total) — %.1f frames/viseme (%.0fms/viseme)"), + SeqNum, ActiveFrames, VisemeQueue.Num(), + FinalRatio, FinalRatio * 32.0f); } void UElevenLabsLipSyncComponent::AnalyzeSpectrum() @@ -1656,13 +1966,46 @@ void UElevenLabsLipSyncComponent::MapVisemesToBlendshapes() { CurrentBlendshapes.Reset(); - // Accumulate blendshape contributions from all active visemes + // Choose mapping source: pose-extracted curves (if available) or hardcoded ARKit map + const bool bUsePoseMapping = (PoseExtractedCurveMap.Num() > 0); + + // In pose mode, use a higher weight threshold to prevent many weak + // visemes from each contributing small conflicting curve values across + // 50+ channels simultaneously — the primary cause of visible vibration. + const float MinWeight = bUsePoseMapping ? 0.05f : 0.001f; + + // Accumulate blendshape/curve contributions from all active visemes for (const FName& VisemeName : VisemeNames) { const float VisemeWeight = SmoothedVisemes.FindOrAdd(VisemeName); - if (VisemeWeight < 0.001f) continue; + if (VisemeWeight < MinWeight) continue; + + const TMap* Mapping = nullptr; + + if (bUsePoseMapping) + { + Mapping = PoseExtractedCurveMap.Find(VisemeName); + } + + // Fallback to hardcoded mapping if no pose data for this viseme + if (!Mapping) + { + if (bUsePoseMapping) + { + // Warn once per viseme about mixing pose and hardcoded mappings + static TSet WarnedVisemes; + if (!WarnedVisemes.Contains(VisemeName)) + { + WarnedVisemes.Add(VisemeName); + UE_LOG(LogElevenLabsLipSync, Warning, + TEXT("No pose assigned for viseme '%s' — falling back to hardcoded ARKit mapping. " + "Mixing pose and hardcoded visemes may produce inconsistent results."), + *VisemeName.ToString()); + } + } + Mapping = VisemeToBlendshapeMap.Find(VisemeName); + } - const TMap* Mapping = VisemeToBlendshapeMap.Find(VisemeName); if (!Mapping) continue; for (const auto& Pair : *Mapping) @@ -1672,10 +2015,11 @@ void UElevenLabsLipSyncComponent::MapVisemesToBlendshapes() } } - // Clamp all blendshape values to [0, 1] + // Clamp all values. Use wider range for pose data (CTRL curves can exceed 1.0). + const float MaxClamp = bUsePoseMapping ? 2.0f : 1.0f; for (auto& Pair : CurrentBlendshapes) { - Pair.Value = FMath::Clamp(Pair.Value, 0.0f, 1.0f); + Pair.Value = FMath::Clamp(Pair.Value, 0.0f, MaxClamp); } } diff --git a/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Public/ElevenLabsLipSyncComponent.h b/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Public/ElevenLabsLipSyncComponent.h index 3fa6747..8d987ac 100644 --- a/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Public/ElevenLabsLipSyncComponent.h +++ b/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Public/ElevenLabsLipSyncComponent.h @@ -8,6 +8,7 @@ #include "ElevenLabsLipSyncComponent.generated.h" class UElevenLabsConversationalAgentComponent; +class UElevenLabsLipSyncPoseMap; class USkeletalMeshComponent; // Fired every tick when viseme/blendshape data has been updated. @@ -65,6 +66,18 @@ public: ToolTip = "Smoothing speed for viseme transitions.\n35 = smooth and soft, 50 = balanced, 65 = sharp and responsive.")) float SmoothingSpeed = 50.0f; + // ── Phoneme Pose Map ───────────────────────────────────────────────────── + + /** Optional pose map asset mapping OVR visemes to phoneme AnimSequences. + * Create once (right-click → Miscellaneous → Data Asset → ElevenLabsLipSyncPoseMap), + * assign your MHF_* poses, then reference it on every MetaHuman. + * When assigned, curve data is extracted at BeginPlay and replaces the + * hardcoded ARKit blendshape mapping with artist-crafted poses. + * Leave empty to use the built-in ARKit mapping (backward compatible). */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ElevenLabs|LipSync", + meta = (ToolTip = "Reusable pose map asset.\nAssign your MHF_* AnimSequences once, reuse on all MetaHumans.\nLeave empty for built-in ARKit mapping.")) + TObjectPtr PoseMap; + // ── Events ──────────────────────────────────────────────────────────────── /** Fires every tick when viseme data has been updated. @@ -215,6 +228,23 @@ private: TWeakObjectPtr AgentComponent; FDelegateHandle AudioDataHandle; + // ── Pose-extracted curve data ──────────────────────────────────────────── + + /** Instance-level mapping extracted from pose AnimSequences at BeginPlay. + * Format: VisemeName → { CurveName → CurveValue }. + * When non-empty, replaces the static VisemeToBlendshapeMap. */ + TMap> PoseExtractedCurveMap; + + /** Whether pose-extracted curves use CTRL_expressions_* naming (true) + * or ARKit naming like jawOpen (false). Determined at extraction time. */ + bool bPosesUseCTRLNaming = false; + + /** Extract curve values at t=0 from an AnimSequence and store in PoseExtractedCurveMap. */ + void ExtractPoseCurves(const FName& VisemeName, UAnimSequence* AnimSeq); + + /** Initialize PoseExtractedCurveMap from all assigned pose UPROPERTYs. */ + void InitializePoseMappings(); + // ── Static data ─────────────────────────────────────────────────────────── /** OVR Viseme names (15 standard visemes). */ diff --git a/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Public/ElevenLabsLipSyncPoseMap.h b/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Public/ElevenLabsLipSyncPoseMap.h new file mode 100644 index 0000000..6bacbd1 --- /dev/null +++ b/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Public/ElevenLabsLipSyncPoseMap.h @@ -0,0 +1,106 @@ +// Copyright ASTERION. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "Engine/DataAsset.h" +#include "Engine/AssetManager.h" +#include "ElevenLabsLipSyncPoseMap.generated.h" + +class UAnimSequence; + +/** + * Reusable data asset that maps OVR visemes to phoneme pose AnimSequences. + * + * Create ONE instance of this asset in the Content Browser + * (right-click → Miscellaneous → Data Asset → ElevenLabsLipSyncPoseMap), + * assign your MHF_* AnimSequences once, then reference this single asset + * on every MetaHuman's ElevenLabs Lip Sync component. + * + * The component extracts curve data from each pose at BeginPlay and uses it + * to drive lip sync — replacing the hardcoded ARKit blendshape mapping with + * artist-crafted poses that coordinate dozens of facial curves. + */ +UCLASS(BlueprintType, Blueprintable, DisplayName = "ElevenLabs Lip Sync Pose Map") +class PS_AI_AGENT_ELEVENLABS_API UElevenLabsLipSyncPoseMap : public UPrimaryDataAsset +{ + GENERATED_BODY() + +public: + // ── Phoneme Poses (15 OVR visemes) ─────────────────────────────────────── + + /** Silence / neutral pose. Mouth at rest. (OVR viseme: sil) */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Phoneme Poses", + meta = (ToolTip = "Silence / neutral. E.g. MHF_None")) + TObjectPtr PoseSilence; + + /** Bilabial pose — P, B, M. Lips pressed together. (OVR viseme: PP) */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Phoneme Poses", + meta = (ToolTip = "Bilabials (P, B, M). E.g. MHF_PBM")) + TObjectPtr PosePBM; + + /** Labiodental pose — F, V. Lower lip under upper teeth. (OVR viseme: FF) */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Phoneme Poses", + meta = (ToolTip = "Labiodentals (F, V). E.g. MHF_FV")) + TObjectPtr PoseFV; + + /** Dental pose — TH. Tongue between teeth. (OVR viseme: TH) */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Phoneme Poses", + meta = (ToolTip = "Dental (TH). E.g. MHF_TH")) + TObjectPtr PoseTH; + + /** Alveolar pose — T, D. Tongue on alveolar ridge. (OVR viseme: DD) */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Phoneme Poses", + meta = (ToolTip = "Alveolars (T, D). E.g. MHF_TD")) + TObjectPtr PoseTD; + + /** Velar pose — K, G. Back of tongue raised. (OVR viseme: kk) */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Phoneme Poses", + meta = (ToolTip = "Velars (K, G). E.g. MHF_KG")) + TObjectPtr PoseKG; + + /** Postalveolar pose — CH, SH, J. Tongue bunched. (OVR viseme: CH) */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Phoneme Poses", + meta = (ToolTip = "Postalveolars (CH, SH, J). E.g. MHF_CH")) + TObjectPtr PoseCH; + + /** Alveolar fricative pose — S, Z. Air through narrow channel. (OVR viseme: SS) */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Phoneme Poses", + meta = (ToolTip = "Fricatives (S, Z). E.g. MHF_SZ")) + TObjectPtr PoseSZ; + + /** Nasal/lateral pose — N, L. Soft palate lowered. (OVR viseme: nn) */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Phoneme Poses", + meta = (ToolTip = "Nasals/Laterals (N, L). E.g. MHF_NL")) + TObjectPtr PoseNL; + + /** Rhotic/liquid pose — R. Tongue curled. (OVR viseme: RR) */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Phoneme Poses", + meta = (ToolTip = "Rhotics (R). E.g. MHF_RR")) + TObjectPtr PoseRR; + + /** Open vowel pose — A as in father. Wide open jaw. (OVR viseme: aa) */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Phoneme Poses", + meta = (ToolTip = "Open vowel (A). E.g. MHF_AA")) + TObjectPtr PoseAA; + + /** Mid front vowel pose — E as in bed. Spread lips. (OVR viseme: E) */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Phoneme Poses", + meta = (ToolTip = "Mid front vowel (E). E.g. MHF_EE")) + TObjectPtr PoseEE; + + /** Close front vowel pose — I as in sit. Narrow spread. (OVR viseme: ih) */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Phoneme Poses", + meta = (ToolTip = "Close front vowel (I). E.g. MHF_II")) + TObjectPtr PoseII; + + /** Mid back vowel pose — O as in go. Rounded lips. (OVR viseme: oh) */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Phoneme Poses", + meta = (ToolTip = "Mid back vowel (O). E.g. MHF_OH")) + TObjectPtr PoseOH; + + /** Close back vowel pose — OO as in boot. Tight round. (OVR viseme: ou) */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Phoneme Poses", + meta = (ToolTip = "Close back vowel (OO). E.g. MHF_OU")) + TObjectPtr PoseOU; +}; diff --git a/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabsEditor/PS_AI_Agent_ElevenLabsEditor.Build.cs b/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabsEditor/PS_AI_Agent_ElevenLabsEditor.Build.cs index 4140ddb..766d5b9 100644 --- a/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabsEditor/PS_AI_Agent_ElevenLabsEditor.Build.cs +++ b/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabsEditor/PS_AI_Agent_ElevenLabsEditor.Build.cs @@ -14,6 +14,8 @@ public class PS_AI_Agent_ElevenLabsEditor : ModuleRules "Core", "CoreUObject", "Engine", + // UFactory base class for asset creation + "UnrealEd", // AnimGraph editor node base class "AnimGraph", "BlueprintGraph", diff --git a/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabsEditor/Private/ElevenLabsLipSyncPoseMapFactory.cpp b/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabsEditor/Private/ElevenLabsLipSyncPoseMapFactory.cpp new file mode 100644 index 0000000..bbe598d --- /dev/null +++ b/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabsEditor/Private/ElevenLabsLipSyncPoseMapFactory.cpp @@ -0,0 +1,29 @@ +// Copyright ASTERION. All Rights Reserved. + +#include "ElevenLabsLipSyncPoseMapFactory.h" +#include "ElevenLabsLipSyncPoseMap.h" +#include "AssetTypeCategories.h" + +UElevenLabsLipSyncPoseMapFactory::UElevenLabsLipSyncPoseMapFactory() +{ + SupportedClass = UElevenLabsLipSyncPoseMap::StaticClass(); + bCreateNew = true; + bEditAfterNew = true; +} + +UObject* UElevenLabsLipSyncPoseMapFactory::FactoryCreateNew( + UClass* Class, UObject* InParent, FName Name, EObjectFlags Flags, + UObject* Context, FFeedbackContext* Warn) +{ + return NewObject(InParent, Class, Name, Flags); +} + +FText UElevenLabsLipSyncPoseMapFactory::GetDisplayName() const +{ + return FText::FromString(TEXT("ElevenLabs Lip Sync Pose Map")); +} + +uint32 UElevenLabsLipSyncPoseMapFactory::GetMenuCategories() const +{ + return EAssetTypeCategories::Misc; +} diff --git a/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabsEditor/Private/ElevenLabsLipSyncPoseMapFactory.h b/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabsEditor/Private/ElevenLabsLipSyncPoseMapFactory.h new file mode 100644 index 0000000..24fdefd --- /dev/null +++ b/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabsEditor/Private/ElevenLabsLipSyncPoseMapFactory.h @@ -0,0 +1,27 @@ +// Copyright ASTERION. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "Factories/Factory.h" +#include "ElevenLabsLipSyncPoseMapFactory.generated.h" + +/** + * Factory that lets users create ElevenLabsLipSyncPoseMap assets + * directly from the Content Browser (right-click → Miscellaneous). + */ +UCLASS() +class UElevenLabsLipSyncPoseMapFactory : public UFactory +{ + GENERATED_BODY() + +public: + UElevenLabsLipSyncPoseMapFactory(); + + virtual UObject* FactoryCreateNew(UClass* Class, UObject* InParent, + FName Name, EObjectFlags Flags, UObject* Context, + FFeedbackContext* Warn) override; + + virtual FText GetDisplayName() const override; + virtual uint32 GetMenuCategories() const override; +};