From 0208e2dcf1c989dd363b385ea76c1c985c53ba55 Mon Sep 17 00:00:00 2001 From: Chris Walker Date: Mon, 15 Nov 2021 11:48:06 -0800 Subject: [PATCH] Initial commit --- .gitattributes | 14 + .gitignore | 20 + AmazonPollyMetaHuman.uproject | 42 ++ CODE_OF_CONDUCT.md | 4 + CONTRIBUTING.md | 55 ++ Config/DefaultEditor.ini | 1 + Config/DefaultEditorSettings.ini | 3 + Config/DefaultEngine.ini | 31 + Config/DefaultGame.ini | 7 + .../AmazonPollyMetaHuman/Ada/BP_Ada.uasset | 3 + .../Ada/Body/BodyBaseColor.uasset | 3 + .../Ada/Face/Ada_FaceMesh.uasset | 3 + .../Ada/Face/ChestBaseColor.uasset | 3 + .../Ada/Face/FaceBaseColor.uasset | 3 + .../Ada/Face/FaceBaseColorAnim1.uasset | 3 + .../Ada/Face/FaceBaseColorAnim2.uasset | 3 + .../Ada/Face/FaceBaseColorAnim3.uasset | 3 + .../Ada/Face/FollicleMask.uasset | 3 + .../Materials/M_EyeRefractive_Inst_L.uasset | 3 + .../Materials/M_EyeRefractive_Inst_R.uasset | 3 + .../LODs/M_HeadSynthesized_LOD1.uasset | 3 + .../LODs/M_HeadSynthesized_LOD2.uasset | 3 + .../LODs/M_HeadSynthesized_LOD3.uasset | 3 + .../LODs/M_HeadSynthesized_LOD4.uasset | 3 + .../LODs/M_HeadSynthesized_LOD5.uasset | 3 + .../Materials/M_HeadSynthesized.uasset | 3 + .../NormalWeight/Body/f_med_nrw_body.uasset | 3 + ..._head_skmesh_Face_Archetype_Binding.uasset | 3 + ..._skmesh_lod0_Face_Archetype_Binding.uasset | 3 + ...air_S_Coil_f_head_Archetype_Binding.uasset | 3 + ...uzz_M_Thin_f_head_Archetype_Binding.uasset | 3 + .../FemaleHair/Hair/Eyebrows_M_Thin.uasset | 3 + ...ebrows_M_Thin_CardsMesh_Group0_LOD0.uasset | 3 + ...ebrows_M_Thin_CardsMesh_Group0_LOD1.uasset | 3 + ...ebrows_M_Thin_CardsMesh_Group0_LOD2.uasset | 3 + ...ebrows_M_Thin_CardsMesh_Group0_LOD3.uasset | 3 + ...ebrows_M_Thin_CardsMesh_Group0_LOD4.uasset | 3 + .../Hair/Eyelashes_L_SlightCurl.uasset | 3 + .../Ada/FemaleHair/Hair/Hair_S_Coil.uasset | 3 + .../Hair_S_Coil_CardsMesh_Group0_LOD0.uasset | 3 + .../Hair_S_Coil_CardsMesh_Group0_LOD1.uasset | 3 + .../Hair_S_Coil_CardsMesh_Group0_LOD2.uasset | 3 + .../Hair_S_Coil_CardsMesh_Group0_LOD3.uasset | 3 + .../Hair_S_Coil_CardsMesh_Group0_LOD4.uasset | 3 + .../FemaleHair/Hair/Peachfuzz_M_Thin.uasset | 3 + .../Helmets/Hair_S_Coil_Helmet_LOD5.uasset | 3 + .../Helmets/Hair_S_Coil_Helmet_LOD6.uasset | 3 + .../Helmets/Hair_S_Coil_Helmet_LOD7.uasset | 3 + .../Ada/Materials/Flats/M_shs_flats.uasset | 3 + .../Jeans_slm/M_btm_jeans_slm_custom.uasset | 3 + .../Ada/Materials/MI_Facial_Hair.uasset | 3 + .../Ada/Materials/MI_Hair.uasset | 3 + .../Ada/Materials/MI_Hair1.uasset | 3 + .../Ada/Materials/MI_Hair2.uasset | 3 + .../Ada/Materials/MI_Hair_Cards.uasset | 3 + .../Ada/Materials/MI_Hair_Helmet.uasset | 3 + .../Ada/Materials/MI_PeachFuzz.uasset | 3 + .../Ada/Materials/M_BodySynthesized.uasset | 3 + .../M_EyeLash_HigherLODs_Inst.uasset | 3 + .../Materials/M_EyelashLowerLODs_Inst.uasset | 3 + .../M_TeethCharacterCreator_Inst.uasset | 3 + .../Shirt/Female/M_f_top_shirt.uasset | 3 + .../Animation/BodyIdle.uasset | 3 + .../Animation/FaceIdle.uasset | 3 + .../Animation/Lean.uasset | 3 + .../Animation/Speech_AnimBP.uasset | 3 + .../Animation/StretchNeck.uasset | 3 + .../Animation/Visemes/Viseme_E_capital.uasset | 3 + .../Animation/Visemes/Viseme_a.uasset | 3 + .../Animation/Visemes/Viseme_at-sign.uasset | 3 + .../Animation/Visemes/Viseme_t.uasset | 3 + .../Animation/Visemes/viseme_O_capital.uasset | 3 + .../Animation/Visemes/viseme_S_capital.uasset | 3 + .../Animation/Visemes/viseme_T_capital.uasset | 3 + .../Animation/Visemes/viseme_f.uasset | 3 + .../Animation/Visemes/viseme_i.uasset | 3 + .../Animation/Visemes/viseme_k.uasset | 3 + .../Animation/Visemes/viseme_lowerE.uasset | 3 + .../Animation/Visemes/viseme_lowerO.uasset | 3 + .../Animation/Visemes/viseme_lowerS.uasset | 3 + .../Animation/Visemes/viseme_p.uasset | 3 + .../Animation/Visemes/viseme_r.uasset | 3 + .../Animation/Visemes/viseme_sil.uasset | 3 + .../Animation/Visemes/viseme_u.uasset | 3 + .../MetaHuman_Clothing_LODSettings.uasset | 3 + .../Common/Common/MetaHuman_ControlRig.uasset | 3 + .../Common/Mocap/mh_arkit_mapping_anim.uasset | 3 + .../Mocap/mh_arkit_mapping_anim1.uasset | 3 + .../Common/Mocap/mh_arkit_mapping_pose.uasset | 3 + .../Common/Utilities/MH_CR_Picker.uasset | 3 + .../Picker_Assets/epic_games_logo.uasset | 3 + .../Picker_Assets/grey_round_button.uasset | 3 + .../Utilities/Picker_Assets/refresh.uasset | 3 + .../Picker_Assets/refresh_down.uasset | 3 + .../Picker_Assets/refresh_over.uasset | 3 + .../Common/Common/f_med_nrw_preview.uasset | 3 + .../Common/f_med_ovw_body_preview.uasset | 3 + .../Common/f_med_unw_body_preview.uasset | 3 + .../Common/f_srt_nrw_body_preview.uasset | 3 + .../Common/f_srt_ovw_body_preview.uasset | 3 + .../Common/f_srt_unw_body_preview.uasset | 3 + .../Common/f_tal_nrw_body_preview.uasset | 3 + .../Common/f_tal_ovw_body_preview.uasset | 3 + .../Common/f_tal_unw_body_preview.uasset | 3 + .../Common/m_med_nrw_body_preview.uasset | 3 + .../Common/m_med_ovw_body_preview.uasset | 3 + .../Common/m_med_unw_body_preview.uasset | 3 + .../Common/m_srt_nrw_body_preview.uasset | 3 + .../Common/m_srt_ovw_body_preview.uasset | 3 + .../Common/m_srt_unw_body_preview.uasset | 3 + .../Common/m_tal_nrw_body_preview.uasset | 3 + .../Common/m_tal_ovw_body_preview.uasset | 3 + .../Common/m_tal_unw_body_preview.uasset | 3 + .../Common/metahuman_proc_ControlRig.uasset | 3 + .../Controls/DefaultGizmoLibrary.uasset | 3 + .../Controls/M_RigControlActor_Black.uasset | 3 + .../Common/Controls/convergence_3l.uasset | 3 + .../Common/Controls/faceboard_2x.uasset | 3 + .../T_SkinAccentRegions_001.uasset | 3 + .../T_SkinAccentRegions_002.uasset | 3 + .../Common/Face/Face_AnimBP.uasset | 3 + .../Common/Face/Face_Archetype.uasset | 3 + .../Face/Face_Archetype_LODSettings.uasset | 3 + .../Common/Face/Face_Archetype_Physics.uasset | 3 + .../Face/Face_Archetype_Skeleton.uasset | 3 + .../Face/Face_ControlBoard_CtrlRig.uasset | 3 + .../Face/Face_PostProcess_AnimBP.uasset | 3 + .../LookDev/AnimMasks/head_wm13_msk_01.uasset | 3 + .../LookDev/AnimMasks/head_wm1_msk_01.uasset | 3 + .../LookDev/AnimMasks/head_wm1_msk_02.uasset | 3 + .../LookDev/AnimMasks/head_wm1_msk_03.uasset | 3 + .../LookDev/AnimMasks/head_wm1_msk_04.uasset | 3 + .../LookDev/AnimMasks/head_wm2_msk_01.uasset | 3 + .../LookDev/AnimMasks/head_wm2_msk_02.uasset | 3 + .../LookDev/AnimMasks/head_wm2_msk_03.uasset | 3 + .../LookDev/AnimMasks/head_wm3_msk_01.uasset | 3 + .../LookDev/AnimMasks/head_wm3_msk_02.uasset | 3 + .../Face/LookDev/Materials/M_Cartilage.uasset | 3 + .../LookDev/Materials/M_EyeOcclusion.uasset | 3 + .../Materials/M_EyeOcclusion_Inst.uasset | 3 + .../Materials/M_EyeRefractive_Inst_L.uasset | 3 + .../Materials/M_EyeRefractive_Inst_R.uasset | 3 + .../LookDev/Materials/M_lacrimal_fluid.uasset | 3 + .../Materials/M_lacrimal_fluid_Inst.uasset | 3 + .../Functions/MF_EyeRefraction.uasset | 3 + .../Functions/MF_IrisGenerator.uasset | 3 + .../MF_ParallaxOcclusionMappingEye.uasset | 3 + .../EyeMaterials/M_EyeRefractive.uasset | 3 + .../SSProfile/SSP_Eye_Inner.uasset | 3 + .../IrisTextures/iris_001/T_Iris_A_H.uasset | 3 + .../IrisTextures/iris_001/T_Iris_A_M.uasset | 3 + .../IrisTextures/iris_007/T_Iris_A_H.uasset | 3 + .../IrisTextures/iris_007/T_Iris_A_M.uasset | 3 + .../Textures/T_EyeMidPlaneDisplacement.uasset | 3 + .../EyeMaterials/Textures/T_Eye_N.uasset | 3 + .../EyeMaterials/Textures/T_Sclera_D.uasset | 3 + .../EyeMaterials/Textures/T_Sclera_N.uasset | 3 + .../Textures/T_TilingNoise_001.uasset | 3 + .../EyeMaterials/Textures/T_Veins_D.uasset | 3 + .../Textures/iris_color_picker.uasset | 3 + .../Textures/sclera_tint_picker.uasset | 3 + .../Common/Face/LookDev/Shared/M_Head.uasset | 3 + .../MaterialFunctions/MF_AnimatedMaps.uasset | 3 + .../MF_BakedGroomTextures.uasset | 3 + .../MaterialFunctions/MF_HeadMask_01.uasset | 3 + .../MaterialFunctions/MF_HeadMask_02.uasset | 3 + .../MaterialFunctions/MF_HeadMask_03.uasset | 3 + .../MaterialFunctions/MF_RoughnessMult.uasset | 3 + .../T_RoughnessRegions_001.uasset | 3 + .../T_RoughnessRegions_002.uasset | 3 + .../T_RoughnessRegions_003.uasset | 3 + .../T_RoughnessRegions_004.uasset | 3 + .../T_RoughnessRegions_005.uasset | 3 + .../T_RoughnessRegions_006.uasset | 3 + .../T_RoughnessRegions_007.uasset | 3 + .../Shared/Textures/T_FlatNormal.uasset | 3 + .../LookDev/SubsurfaceProfiles/SP_Head.uasset | 3 + .../Textures/1x1_BakedGroomTextureBase.uasset | 3 + .../Face/LookDev/Textures/lacrimal_h.uasset | 3 + .../Face/LookDev/Textures/lacrimal_n.uasset | 3 + .../Materials/Materials/DefaultTexture.uasset | 3 + .../Materials/DefaultTextureLinear.uasset | 3 + .../LODs/M_HeadSynthesized_LOD1.uasset | 3 + .../LODs/M_HeadSynthesized_LOD2.uasset | 3 + .../Materials/M_HeadSynthesized.uasset | 3 + .../Materials/RoughnessBake_Tex.uasset | 3 + .../Common/Face/Neck_CtrlRig.uasset | 3 + .../Body/MetaHuman_LODSettings.uasset | 3 + .../NormalWeight/Body/f_med_nrw_animbp.uasset | 3 + .../Body/f_med_nrw_body_skmesh_Physics.uasset | 3 + .../Body/metahuman_base_skel.uasset | 3 + .../Jeans/f_med_nrw_btm_jeans_slm.uasset | 3 + .../Poses/f_med_nrw_calf_l_anim.uasset | 3 + .../Poses/f_med_nrw_calf_l_pose.uasset | 3 + .../Poses/f_med_nrw_calf_r_anim.uasset | 3 + .../Poses/f_med_nrw_calf_r_pose.uasset | 3 + .../Poses/f_med_nrw_clavicle_l_anim.uasset | 3 + .../Poses/f_med_nrw_clavicle_l_pose.uasset | 3 + .../Poses/f_med_nrw_clavicle_r_anim.uasset | 3 + .../Poses/f_med_nrw_clavicle_r_pose.uasset | 3 + .../Poses/f_med_nrw_foot_l_anim.uasset | 3 + .../Poses/f_med_nrw_foot_l_pose.uasset | 3 + .../Poses/f_med_nrw_foot_r_anim.uasset | 3 + .../Poses/f_med_nrw_foot_r_pose.uasset | 3 + .../Poses/f_med_nrw_hand_l_anim.uasset | 3 + .../Poses/f_med_nrw_hand_l_pose.uasset | 3 + .../Poses/f_med_nrw_hand_r_anim.uasset | 3 + .../Poses/f_med_nrw_hand_r_pose.uasset | 3 + .../Poses/f_med_nrw_lowerarm_l_anim.uasset | 3 + .../Poses/f_med_nrw_lowerarm_l_pose.uasset | 3 + .../Poses/f_med_nrw_lowerarm_r_anim.uasset | 3 + .../Poses/f_med_nrw_lowerarm_r_pose.uasset | 3 + .../Poses/f_med_nrw_thigh_l_anim.uasset | 3 + .../Poses/f_med_nrw_thigh_l_pose.uasset | 3 + .../Poses/f_med_nrw_thigh_r_anim.uasset | 3 + .../Poses/f_med_nrw_thigh_r_pose.uasset | 3 + .../Poses/f_med_nrw_upperarm_l_anim.uasset | 3 + .../Poses/f_med_nrw_upperarm_l_pose.uasset | 3 + .../Poses/f_med_nrw_upperarm_r_anim.uasset | 3 + .../Poses/f_med_nrw_upperarm_r_pose.uasset | 3 + .../Flats/Meshes/f_med_nrw_shs_flats.uasset | 3 + .../Tops/Shirt/f_med_nrw_top_shirt_nrm.uasset | 3 + .../f_med_nrw_top_shirt_nrm_CtrlRig.uasset | 3 + ..._med_nrw_top_shirt_nrm_PhysicsAsset.uasset | 3 + .../f_med_nrw_top_shirt_nrm_Skeleton.uasset | 3 + ...op_shirt_nrm_Skeleton_AnimBlueprint.uasset | 3 + .../Shared/1K/female_body_mask_map.uasset | 3 + .../1K/female_underwear_color_map.uasset | 3 + .../female001/female_chest_cavity_map.uasset | 3 + .../female001/female_chest_mask_map.uasset | 3 + .../female001/female_chest_normal_map.uasset | 3 + .../female_chest_roughness_map.uasset | 3 + .../1K/female_body_cavity_map.uasset | 3 + .../1K/female_body_normal_map.uasset | 3 + .../1K/female_body_roughness_map.uasset | 3 + .../1K/female_chest_cavity_map.uasset | 3 + .../1K/female_chest_normal_map.uasset | 3 + .../1K/female_chest_roughness_map.uasset | 3 + ...yebrows_M_Thin_CardsAtlas_Attribute.uasset | 3 + ...Eyebrows_M_Thin_CardsAtlas_Coverage.uasset | 3 + .../Eyebrows_M_Thin_CardsAtlas_Depth.uasset | 3 + .../Eyebrows_M_Thin_CardsAtlas_Tangent.uasset | 3 + .../Eyebrows_M_Thin_baked.uasset | 3 + .../Eyelashes_L_SlightCurl_Coverage.uasset | 3 + .../Hair_S_Coil/Hair_S_Coil_Attribute.uasset | 3 + .../Hair_S_Coil/Hair_S_Coil_Depth.uasset | 3 + .../Hair_S_Coil/Hair_S_Coil_Opacity.uasset | 3 + .../Hair_S_Coil/Hair_S_Coil_Tangent.uasset | 3 + .../Hair_S_Coil_CardsAtlas_Attribute.uasset | 3 + .../Hair_S_Coil_CardsAtlas_Coverage.uasset | 3 + .../Hair_S_Coil_CardsAtlas_Depth.uasset | 3 + .../Hair_S_Coil_CardsAtlas_Tangent.uasset | 3 + .../Hair_S_Coil_baked.uasset | 3 + .../Common/Fonts/RobotoCondensed-Bold.uasset | 3 + .../Fonts/RobotoCondensed-BoldItalic.uasset | 3 + .../Common/Fonts/RobotoCondensed-Light.uasset | 3 + .../Fonts/RobotoCondensed-LightItalic.uasset | 3 + .../Fonts/RobotoCondensed-Regular.uasset | 3 + .../Common/Fonts/RobotoCondensed.uasset | 3 + .../Materials/DefaultTexture_Grayscale.uasset | 3 + .../DefaultTexture_LinearColor.uasset | 3 + .../Common/Materials/Flats/M_shs_flats.uasset | 3 + .../Materials/Flats/shs_flats_AO.uasset | 3 + .../Materials/Flats/shs_flats_Mask.uasset | 3 + .../Common/Materials/Flats/shs_flats_N.uasset | 3 + .../Materials/Jeans/btm_jeans_nrm_AO.uasset | 3 + .../Materials/Jeans/btm_jeans_nrm_D.uasset | 3 + .../Materials/Jeans/btm_jeans_nrm_Mask.uasset | 3 + .../Materials/Jeans/btm_jeans_nrm_N.uasset | 3 + .../Jeans/btm_jeans_nrm_fuzz_M.uasset | 3 + .../Jeans/btm_jeans_nrm_memory_fold_N.uasset | 3 + .../Jeans/btm_jeans_nrm_roughness_mask.uasset | 3 + .../Jeans_slm/M_btm_jeans_slm_custom.uasset | 3 + .../Jeans_slm/btm_jeans_slm_AO_2.uasset | 3 + .../Jeans_slm/btm_jeans_slm_D.uasset | 3 + .../Jeans_slm/btm_jeans_slm_Mask_02.uasset | 3 + .../Jeans_slm/btm_jeans_slm_N.uasset | 3 + .../Materials/MF_HairAnisotropic.uasset | 3 + .../Common/Materials/MF_Passthrough.uasset | 3 + .../Common/Materials/MF_Variation.uasset | 3 + .../Common/Materials/MI_Facial_Hair.uasset | 3 + .../Common/Materials/MI_Hair.uasset | 3 + .../Common/Materials/MI_Hair_Cards.uasset | 3 + .../Common/Materials/MI_Hair_Helmet.uasset | 3 + .../Common/Materials/MI_PeachFuzz.uasset | 3 + .../Common/Materials/MPC_HairColor.uasset | 3 + .../Common/Materials/M_BodySkin.uasset | 3 + .../Common/Materials/M_BodySynthesized.uasset | 3 + .../M_EyeLash_HigherLODs_Inst.uasset | 3 + .../Materials/M_EyelashLowerLODs_Inst.uasset | 3 + .../Common/Materials/M_Eyelashes_Cards.uasset | 3 + .../Common/Materials/M_Facial_Hair.uasset | 3 + .../Common/Materials/M_PeachFuzzMaster.uasset | 3 + .../Common/Materials/M_Teeth.uasset | 3 + .../M_TeethCharacterCreator_Inst.uasset | 3 + .../Common/Materials/M_fabric_simpler.uasset | 3 + .../Common/Materials/M_hair_v2.uasset | 3 + .../M_jeans_nrm_custom_master.uasset | 3 + .../Materials/SP_TeethCharacterCreator.uasset | 3 + .../Shirt/Female/M_f_top_shirt.uasset | 3 + .../Shirt/Female/f_top_shirt_AO.uasset | 3 + .../Shirt/Female/f_top_shirt_Mask.uasset | 3 + .../Shirt/Female/f_top_shirt_N.uasset | 3 + .../Common/Materials/T_Black_Linear.uasset | 3 + .../DefaultMaps/Clothing_Default_Mask.uasset | 3 + .../Clothing/DefaultMaps/black_masks.uasset | 3 + .../DefaultMaps/color_spectrum.uasset | 3 + .../macro_jeans_nrm_tile_overlay_D.uasset | 3 + .../Macros/macro_linen_rbess3s_4K.uasset | 3 + .../Clothing/Macros/macro_pilling_A.uasset | 3 + .../Clothing/Macros/macro_pilling_N.uasset | 3 + .../MF_AvgColorReplace.uasset | 3 + .../MaterialFunction/MF_PowerVariation.uasset | 3 + .../MatLayerBlend_Aniso.uasset | 3 + .../Clothing/Micros/micro_jeans_tile_M.uasset | 3 + .../Clothing/Micros/micro_jeans_tile_N.uasset | 3 + .../Clothing/Micros/micro_pp_oxford_N.uasset | 3 + .../Micros/micro_weave_denim_N.uasset | 3 + .../Micros/micro_weave_denim_diffuse.uasset | 3 + .../Clothing/Micros/micro_weave_plain.uasset | 3 + .../Micros/micro_weave_plain_normal.uasset | 3 + .../Wrinkles/crease_a_tileable_N.uasset | 3 + .../Wrinkles/memory_wrinkles_normal.uasset | 3 + .../Textures/Clothing/clothing_AO.uasset | 3 + .../Textures/Clothing/clothing_N.uasset | 3 + .../upresTest/MF_NormalStrength.uasset | 3 + .../Textures/T_SkinMicroNormal.uasset | 3 + .../Textures/T_Teeth_mouthOcc.uasset | 3 + .../Materials/Textures/TeethGumsNormal.uasset | 3 + .../Materials/Textures/TilingNoise05.uasset | 3 + .../Textures/gums_color_picker.uasset | 3 + .../Materials/Textures/gums_div_001.uasset | 3 + .../Textures/plaque_color_picker.uasset | 3 + .../Common/Materials/Textures/skin_n.uasset | 3 + .../Textures/teeth_color_map_001.uasset | 3 + .../Textures/teeth_color_picker_001.uasset | 3 + .../Materials/Textures/teeth_masks_001.uasset | 3 + .../Textures/teeth_normal_map.uasset | 3 + .../Textures/teeth_sharpNormal_map.uasset | 3 + .../chr_0017/head_cavity_map.uasset | 3 + .../chr_0017/head_normal_map.uasset | 3 + .../chr_0017/head_roughness_map.uasset | 3 + .../chr_0017/head_wm1_normal_map.uasset | 3 + .../chr_0017/head_wm2_normal_map.uasset | 3 + .../chr_0017/head_wm3_normal_map.uasset | 3 + .../Common/Textures/DefaultTexture_VT.uasset | 3 + .../Scene/BP_UIWidget.uasset | 3 + .../Scene/CameraSequence.uasset | 3 + .../Scene/MetaHumanScene.umap | 3 + .../Scene/MetaHumanScene_BuiltData.uasset | 3 + Documentation/DeveloperGuide.md | 155 +++++ .../code/metahuman-blueprint-nodes.txt | 66 ++ Documentation/media/MH-AnimBP-AnimGraph.png | 3 + Documentation/media/MH-AnimBP-EventGraph.png | 3 + Documentation/media/MH-AnimBP-VisemeVar.png | 3 + .../media/MH-Blueprint-SpeakEvent.png | 3 + .../media/MH-Blueprint-changes-1.png | 3 + .../media/MH-Blueprint-changes-2.png | 3 + .../media/MH-Blueprint-changes-2.psd | 3 + .../media/MH-Blueprint-changes-3.png | 3 + .../media/MH-Blueprint-changes-3.psd | 3 + .../media/MH-Speech-BP-functions.png | 3 + .../media/MH-Speech-Components-panel.png | 3 + .../media/MH-Speech-Components-panel.psd | 3 + Documentation/media/MH-add-speech-comp.png | 3 + Documentation/media/MH-add-speech-comp.psd | 3 + .../media/MH-assign-speech-anim-BP.png | 3 + .../media/MH-assign-speech-anim-BP.psd | 3 + Documentation/media/MH-body-anim.png | 3 + Documentation/media/MH-body-anim.psd | 3 + Documentation/media/MetaHumanDemo.mov | 3 + Documentation/media/UE4-toolbar-play.png | 3 + Documentation/media/UE4-toolbar.psd | 3 + Documentation/media/compiling-shaders.png | 3 + Documentation/media/module-compile-prompt.png | 3 + LICENSE | 14 + README.md | 115 +++ Source/AmazonPollyMetaHuman.Target.cs | 31 + .../AmazonPollyMetaHuman.Build.cs | 118 ++++ .../AmazonPollyMetaHuman.cpp | 69 ++ .../AmazonPollyMetaHuman.h | 100 +++ .../Private/CaseSensitiveKeyFunc.h | 58 ++ .../Private/GenerateSpeechAction.cpp | 50 ++ .../Private/GenerateSpeechAction.h | 66 ++ .../Private/PollyClient.cpp | 45 ++ .../Private/PollyClient.h | 63 ++ .../Private/SpeechComponent.cpp | 213 ++++++ .../Private/Tests/MockPollyClient.cpp | 32 + .../Private/Tests/MockPollyClient.h | 46 ++ .../Private/Tests/SpeechComponent.spec.cpp | 653 ++++++++++++++++++ .../Private/Tests/TestableSpeechComponent.cpp | 73 ++ .../Private/Tests/TestableSpeechComponent.h | 84 +++ .../Private/UnrealAWSUtils.cpp | 47 ++ .../Private/UnrealAWSUtils.h | 45 ++ .../AmazonPollyMetaHuman/Private/Viseme.cpp | 60 ++ .../AmazonPollyMetaHuman/Private/VoiceId.cpp | 123 ++++ .../Public/SpeechComponent.h | 228 ++++++ Source/AmazonPollyMetaHuman/Public/Viseme.h | 59 ++ Source/AmazonPollyMetaHuman/Public/VoiceId.h | 77 +++ .../ThirdParty/AwsSdk/BuildAwsSdkMac.sh | 36 + .../ThirdParty/AwsSdk/BuildAwsSdkWin64.bat | 72 ++ Source/AmazonPollyMetaHumanEditor.Target.cs | 31 + 402 files changed, 4098 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 AmazonPollyMetaHuman.uproject create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md create mode 100644 Config/DefaultEditor.ini create mode 100644 Config/DefaultEditorSettings.ini create mode 100644 Config/DefaultEngine.ini create mode 100644 Config/DefaultGame.ini create mode 100644 Content/AmazonPollyMetaHuman/Ada/BP_Ada.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/Body/BodyBaseColor.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/Face/Ada_FaceMesh.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/Face/ChestBaseColor.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/Face/FaceBaseColor.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/Face/FaceBaseColorAnim1.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/Face/FaceBaseColorAnim2.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/Face/FaceBaseColorAnim3.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/Face/FollicleMask.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/Face/LookDev/Materials/M_EyeRefractive_Inst_L.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/Face/LookDev/Materials/M_EyeRefractive_Inst_R.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/Face/Materials/Materials/LODs/M_HeadSynthesized_LOD1.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/Face/Materials/Materials/LODs/M_HeadSynthesized_LOD2.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/Face/Materials/Materials/LODs/M_HeadSynthesized_LOD3.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/Face/Materials/Materials/LODs/M_HeadSynthesized_LOD4.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/Face/Materials/Materials/LODs/M_HeadSynthesized_LOD5.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/Face/Materials/Materials/M_HeadSynthesized.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/Female/Medium/NormalWeight/Body/f_med_nrw_body.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/FemaleHair/GroomBinding/Eyebrows_M_Thin_f_med_nrw_head_skmesh_Face_Archetype_Binding.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/FemaleHair/GroomBinding/Eyelashes_L_SlightCurl_f_med_nrw_head_skmesh_lod0_Face_Archetype_Binding.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/FemaleHair/GroomBinding/Hair_S_Coil_f_head_Archetype_Binding.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/FemaleHair/GroomBinding/Peachfuzz_M_Thin_f_head_Archetype_Binding.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Eyebrows_M_Thin.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Eyebrows_M_Thin_CardsMesh_Group0_LOD0.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Eyebrows_M_Thin_CardsMesh_Group0_LOD1.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Eyebrows_M_Thin_CardsMesh_Group0_LOD2.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Eyebrows_M_Thin_CardsMesh_Group0_LOD3.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Eyebrows_M_Thin_CardsMesh_Group0_LOD4.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Eyelashes_L_SlightCurl.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Hair_S_Coil.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Hair_S_Coil_CardsMesh_Group0_LOD0.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Hair_S_Coil_CardsMesh_Group0_LOD1.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Hair_S_Coil_CardsMesh_Group0_LOD2.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Hair_S_Coil_CardsMesh_Group0_LOD3.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Hair_S_Coil_CardsMesh_Group0_LOD4.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Peachfuzz_M_Thin.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/FemaleHair/Helmets/Hair_S_Coil_Helmet_LOD5.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/FemaleHair/Helmets/Hair_S_Coil_Helmet_LOD6.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/FemaleHair/Helmets/Hair_S_Coil_Helmet_LOD7.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/Materials/Flats/M_shs_flats.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/Materials/Jeans_slm/M_btm_jeans_slm_custom.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/Materials/MI_Facial_Hair.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/Materials/MI_Hair.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/Materials/MI_Hair1.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/Materials/MI_Hair2.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/Materials/MI_Hair_Cards.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/Materials/MI_Hair_Helmet.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/Materials/MI_PeachFuzz.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/Materials/M_BodySynthesized.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/Materials/M_EyeLash_HigherLODs_Inst.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/Materials/M_EyelashLowerLODs_Inst.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/Materials/M_TeethCharacterCreator_Inst.uasset create mode 100644 Content/AmazonPollyMetaHuman/Ada/Materials/Shirt/Female/M_f_top_shirt.uasset create mode 100644 Content/AmazonPollyMetaHuman/Animation/BodyIdle.uasset create mode 100644 Content/AmazonPollyMetaHuman/Animation/FaceIdle.uasset create mode 100644 Content/AmazonPollyMetaHuman/Animation/Lean.uasset create mode 100644 Content/AmazonPollyMetaHuman/Animation/Speech_AnimBP.uasset create mode 100644 Content/AmazonPollyMetaHuman/Animation/StretchNeck.uasset create mode 100644 Content/AmazonPollyMetaHuman/Animation/Visemes/Viseme_E_capital.uasset create mode 100644 Content/AmazonPollyMetaHuman/Animation/Visemes/Viseme_a.uasset create mode 100644 Content/AmazonPollyMetaHuman/Animation/Visemes/Viseme_at-sign.uasset create mode 100644 Content/AmazonPollyMetaHuman/Animation/Visemes/Viseme_t.uasset create mode 100644 Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_O_capital.uasset create mode 100644 Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_S_capital.uasset create mode 100644 Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_T_capital.uasset create mode 100644 Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_f.uasset create mode 100644 Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_i.uasset create mode 100644 Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_k.uasset create mode 100644 Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_lowerE.uasset create mode 100644 Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_lowerO.uasset create mode 100644 Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_lowerS.uasset create mode 100644 Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_p.uasset create mode 100644 Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_r.uasset create mode 100644 Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_sil.uasset create mode 100644 Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_u.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Common/MetaHuman_Clothing_LODSettings.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Common/MetaHuman_ControlRig.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Common/Mocap/mh_arkit_mapping_anim.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Common/Mocap/mh_arkit_mapping_anim1.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Common/Mocap/mh_arkit_mapping_pose.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Common/Utilities/MH_CR_Picker.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Common/Utilities/Picker_Assets/epic_games_logo.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Common/Utilities/Picker_Assets/grey_round_button.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Common/Utilities/Picker_Assets/refresh.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Common/Utilities/Picker_Assets/refresh_down.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Common/Utilities/Picker_Assets/refresh_over.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Common/f_med_nrw_preview.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Common/f_med_ovw_body_preview.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Common/f_med_unw_body_preview.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Common/f_srt_nrw_body_preview.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Common/f_srt_ovw_body_preview.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Common/f_srt_unw_body_preview.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Common/f_tal_nrw_body_preview.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Common/f_tal_ovw_body_preview.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Common/f_tal_unw_body_preview.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Common/m_med_nrw_body_preview.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Common/m_med_ovw_body_preview.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Common/m_med_unw_body_preview.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Common/m_srt_nrw_body_preview.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Common/m_srt_ovw_body_preview.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Common/m_srt_unw_body_preview.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Common/m_tal_nrw_body_preview.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Common/m_tal_ovw_body_preview.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Common/m_tal_unw_body_preview.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Common/metahuman_proc_ControlRig.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Controls/DefaultGizmoLibrary.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Controls/M_RigControlActor_Black.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Controls/convergence_3l.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Controls/faceboard_2x.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/ArtistDelights/SkinAccents/T_SkinAccentRegions_001.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/ArtistDelights/SkinAccents/T_SkinAccentRegions_002.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/Face_AnimBP.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/Face_Archetype.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/Face_Archetype_LODSettings.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/Face_Archetype_Physics.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/Face_Archetype_Skeleton.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/Face_ControlBoard_CtrlRig.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/Face_PostProcess_AnimBP.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/AnimMasks/head_wm13_msk_01.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/AnimMasks/head_wm1_msk_01.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/AnimMasks/head_wm1_msk_02.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/AnimMasks/head_wm1_msk_03.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/AnimMasks/head_wm1_msk_04.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/AnimMasks/head_wm2_msk_01.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/AnimMasks/head_wm2_msk_02.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/AnimMasks/head_wm2_msk_03.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/AnimMasks/head_wm3_msk_01.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/AnimMasks/head_wm3_msk_02.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/Materials/M_Cartilage.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/Materials/M_EyeOcclusion.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/Materials/M_EyeOcclusion_Inst.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/Materials/M_EyeRefractive_Inst_L.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/Materials/M_EyeRefractive_Inst_R.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/Materials/M_lacrimal_fluid.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/Materials/M_lacrimal_fluid_Inst.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Functions/MF_EyeRefraction.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Functions/MF_IrisGenerator.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Functions/MF_ParallaxOcclusionMappingEye.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/M_EyeRefractive.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/SSProfile/SSP_Eye_Inner.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/IrisTextures/iris_001/T_Iris_A_H.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/IrisTextures/iris_001/T_Iris_A_M.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/IrisTextures/iris_007/T_Iris_A_H.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/IrisTextures/iris_007/T_Iris_A_M.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/T_EyeMidPlaneDisplacement.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/T_Eye_N.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/T_Sclera_D.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/T_Sclera_N.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/T_TilingNoise_001.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/T_Veins_D.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/iris_color_picker.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/sclera_tint_picker.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/M_Head.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/MaterialFunctions/MF_AnimatedMaps.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/MaterialFunctions/MF_BakedGroomTextures.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/MaterialFunctions/MF_HeadMask_01.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/MaterialFunctions/MF_HeadMask_02.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/MaterialFunctions/MF_HeadMask_03.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/MaterialFunctions/MF_RoughnessMult.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/Textures/RoughnessRegionsMasks/T_RoughnessRegions_001.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/Textures/RoughnessRegionsMasks/T_RoughnessRegions_002.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/Textures/RoughnessRegionsMasks/T_RoughnessRegions_003.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/Textures/RoughnessRegionsMasks/T_RoughnessRegions_004.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/Textures/RoughnessRegionsMasks/T_RoughnessRegions_005.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/Textures/RoughnessRegionsMasks/T_RoughnessRegions_006.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/Textures/RoughnessRegionsMasks/T_RoughnessRegions_007.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/Textures/T_FlatNormal.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/SubsurfaceProfiles/SP_Head.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/Textures/1x1_BakedGroomTextureBase.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/Textures/lacrimal_h.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/LookDev/Textures/lacrimal_n.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/Materials/Materials/DefaultTexture.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/Materials/Materials/DefaultTextureLinear.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/Materials/Materials/LODs/M_HeadSynthesized_LOD1.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/Materials/Materials/LODs/M_HeadSynthesized_LOD2.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/Materials/Materials/M_HeadSynthesized.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/Materials/Materials/RoughnessBake_Tex.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Face/Neck_CtrlRig.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Body/MetaHuman_LODSettings.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Body/f_med_nrw_animbp.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Body/f_med_nrw_body_skmesh_Physics.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Body/metahuman_base_skel.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Bottoms/Jeans/f_med_nrw_btm_jeans_slm.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_calf_l_anim.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_calf_l_pose.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_calf_r_anim.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_calf_r_pose.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_clavicle_l_anim.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_clavicle_l_pose.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_clavicle_r_anim.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_clavicle_r_pose.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_foot_l_anim.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_foot_l_pose.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_foot_r_anim.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_foot_r_pose.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_hand_l_anim.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_hand_l_pose.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_hand_r_anim.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_hand_r_pose.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_lowerarm_l_anim.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_lowerarm_l_pose.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_lowerarm_r_anim.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_lowerarm_r_pose.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_thigh_l_anim.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_thigh_l_pose.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_thigh_r_anim.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_thigh_r_pose.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_upperarm_l_anim.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_upperarm_l_pose.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_upperarm_r_anim.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_upperarm_r_pose.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Shoes/Flats/Meshes/f_med_nrw_shs_flats.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Tops/Shirt/f_med_nrw_top_shirt_nrm.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Tops/Shirt/f_med_nrw_top_shirt_nrm_CtrlRig.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Tops/Shirt/f_med_nrw_top_shirt_nrm_PhysicsAsset.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Tops/Shirt/f_med_nrw_top_shirt_nrm_Skeleton.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Tops/Shirt/f_med_nrw_top_shirt_nrm_Skeleton_AnimBlueprint.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Textures/Shared/1K/female_body_mask_map.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Textures/Shared/1K/female_underwear_color_map.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Textures/female001/female_chest_cavity_map.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Textures/female001/female_chest_mask_map.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Textures/female001/female_chest_normal_map.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Textures/female001/female_chest_roughness_map.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Textures/female_002/1K/female_body_cavity_map.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Textures/female_002/1K/female_body_normal_map.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Textures/female_002/1K/female_body_roughness_map.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Textures/female_002/1K/female_chest_cavity_map.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Textures/female_002/1K/female_chest_normal_map.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Female/Textures/female_002/1K/female_chest_roughness_map.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Eyebrows_M_Thin_Cards/Eyebrows_M_Thin_CardsAtlas_Attribute.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Eyebrows_M_Thin_Cards/Eyebrows_M_Thin_CardsAtlas_Coverage.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Eyebrows_M_Thin_Cards/Eyebrows_M_Thin_CardsAtlas_Depth.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Eyebrows_M_Thin_Cards/Eyebrows_M_Thin_CardsAtlas_Tangent.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Eyebrows_M_Thin_baked/Eyebrows_M_Thin_baked.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Eyelashes_L_SlightCurl_Cards/Eyelashes_L_SlightCurl_Coverage.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Hair_S_Coil/Hair_S_Coil_Attribute.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Hair_S_Coil/Hair_S_Coil_Depth.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Hair_S_Coil/Hair_S_Coil_Opacity.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Hair_S_Coil/Hair_S_Coil_Tangent.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Hair_S_Coil_Cards/Hair_S_Coil_CardsAtlas_Attribute.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Hair_S_Coil_Cards/Hair_S_Coil_CardsAtlas_Coverage.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Hair_S_Coil_Cards/Hair_S_Coil_CardsAtlas_Depth.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Hair_S_Coil_Cards/Hair_S_Coil_CardsAtlas_Tangent.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Hair_S_Coil_baked/Hair_S_Coil_baked.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Fonts/RobotoCondensed-Bold.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Fonts/RobotoCondensed-BoldItalic.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Fonts/RobotoCondensed-Light.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Fonts/RobotoCondensed-LightItalic.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Fonts/RobotoCondensed-Regular.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Fonts/RobotoCondensed.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/DefaultTexture_Grayscale.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/DefaultTexture_LinearColor.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Flats/M_shs_flats.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Flats/shs_flats_AO.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Flats/shs_flats_Mask.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Flats/shs_flats_N.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Jeans/btm_jeans_nrm_AO.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Jeans/btm_jeans_nrm_D.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Jeans/btm_jeans_nrm_Mask.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Jeans/btm_jeans_nrm_N.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Jeans/btm_jeans_nrm_fuzz_M.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Jeans/btm_jeans_nrm_memory_fold_N.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Jeans/btm_jeans_nrm_roughness_mask.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Jeans_slm/M_btm_jeans_slm_custom.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Jeans_slm/btm_jeans_slm_AO_2.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Jeans_slm/btm_jeans_slm_D.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Jeans_slm/btm_jeans_slm_Mask_02.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Jeans_slm/btm_jeans_slm_N.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/MF_HairAnisotropic.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/MF_Passthrough.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/MF_Variation.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/MI_Facial_Hair.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/MI_Hair.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/MI_Hair_Cards.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/MI_Hair_Helmet.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/MI_PeachFuzz.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/MPC_HairColor.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/M_BodySkin.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/M_BodySynthesized.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/M_EyeLash_HigherLODs_Inst.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/M_EyelashLowerLODs_Inst.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/M_Eyelashes_Cards.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/M_Facial_Hair.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/M_PeachFuzzMaster.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/M_Teeth.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/M_TeethCharacterCreator_Inst.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/M_fabric_simpler.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/M_hair_v2.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/M_jeans_nrm_custom_master.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/SP_TeethCharacterCreator.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Shirt/Female/M_f_top_shirt.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Shirt/Female/f_top_shirt_AO.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Shirt/Female/f_top_shirt_Mask.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Shirt/Female/f_top_shirt_N.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/T_Black_Linear.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/DefaultMaps/Clothing_Default_Mask.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/DefaultMaps/black_masks.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/DefaultMaps/color_spectrum.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Macros/macro_jeans_nrm_tile_overlay_D.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Macros/macro_linen_rbess3s_4K.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Macros/macro_pilling_A.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Macros/macro_pilling_N.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/MaterialFunction/MF_AvgColorReplace.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/MaterialFunction/MF_PowerVariation.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/MaterialFunction/MatLayerBlend_Aniso.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Micros/micro_jeans_tile_M.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Micros/micro_jeans_tile_N.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Micros/micro_pp_oxford_N.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Micros/micro_weave_denim_N.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Micros/micro_weave_denim_diffuse.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Micros/micro_weave_plain.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Micros/micro_weave_plain_normal.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Wrinkles/crease_a_tileable_N.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Wrinkles/memory_wrinkles_normal.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/clothing_AO.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/clothing_N.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/upresTest/MF_NormalStrength.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Textures/T_SkinMicroNormal.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Textures/T_Teeth_mouthOcc.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Textures/TeethGumsNormal.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Textures/TilingNoise05.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Textures/gums_color_picker.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Textures/gums_div_001.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Textures/plaque_color_picker.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Textures/skin_n.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Textures/teeth_color_map_001.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Textures/teeth_color_picker_001.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Textures/teeth_masks_001.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Textures/teeth_normal_map.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Materials/Textures/teeth_sharpNormal_map.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Models/PuffinTexture-8k/chr_0017/head_cavity_map.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Models/PuffinTexture-8k/chr_0017/head_normal_map.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Models/PuffinTexture-8k/chr_0017/head_roughness_map.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Models/PuffinTexture-8k/chr_0017/head_wm1_normal_map.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Models/PuffinTexture-8k/chr_0017/head_wm2_normal_map.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Models/PuffinTexture-8k/chr_0017/head_wm3_normal_map.uasset create mode 100644 Content/AmazonPollyMetaHuman/Common/Textures/DefaultTexture_VT.uasset create mode 100644 Content/AmazonPollyMetaHuman/Scene/BP_UIWidget.uasset create mode 100644 Content/AmazonPollyMetaHuman/Scene/CameraSequence.uasset create mode 100644 Content/AmazonPollyMetaHuman/Scene/MetaHumanScene.umap create mode 100644 Content/AmazonPollyMetaHuman/Scene/MetaHumanScene_BuiltData.uasset create mode 100644 Documentation/DeveloperGuide.md create mode 100644 Documentation/code/metahuman-blueprint-nodes.txt create mode 100644 Documentation/media/MH-AnimBP-AnimGraph.png create mode 100644 Documentation/media/MH-AnimBP-EventGraph.png create mode 100644 Documentation/media/MH-AnimBP-VisemeVar.png create mode 100644 Documentation/media/MH-Blueprint-SpeakEvent.png create mode 100644 Documentation/media/MH-Blueprint-changes-1.png create mode 100644 Documentation/media/MH-Blueprint-changes-2.png create mode 100644 Documentation/media/MH-Blueprint-changes-2.psd create mode 100644 Documentation/media/MH-Blueprint-changes-3.png create mode 100644 Documentation/media/MH-Blueprint-changes-3.psd create mode 100644 Documentation/media/MH-Speech-BP-functions.png create mode 100644 Documentation/media/MH-Speech-Components-panel.png create mode 100644 Documentation/media/MH-Speech-Components-panel.psd create mode 100644 Documentation/media/MH-add-speech-comp.png create mode 100644 Documentation/media/MH-add-speech-comp.psd create mode 100644 Documentation/media/MH-assign-speech-anim-BP.png create mode 100644 Documentation/media/MH-assign-speech-anim-BP.psd create mode 100644 Documentation/media/MH-body-anim.png create mode 100644 Documentation/media/MH-body-anim.psd create mode 100644 Documentation/media/MetaHumanDemo.mov create mode 100644 Documentation/media/UE4-toolbar-play.png create mode 100644 Documentation/media/UE4-toolbar.psd create mode 100644 Documentation/media/compiling-shaders.png create mode 100644 Documentation/media/module-compile-prompt.png create mode 100644 LICENSE create mode 100644 README.md create mode 100644 Source/AmazonPollyMetaHuman.Target.cs create mode 100644 Source/AmazonPollyMetaHuman/AmazonPollyMetaHuman.Build.cs create mode 100644 Source/AmazonPollyMetaHuman/AmazonPollyMetaHuman.cpp create mode 100644 Source/AmazonPollyMetaHuman/AmazonPollyMetaHuman.h create mode 100644 Source/AmazonPollyMetaHuman/Private/CaseSensitiveKeyFunc.h create mode 100644 Source/AmazonPollyMetaHuman/Private/GenerateSpeechAction.cpp create mode 100644 Source/AmazonPollyMetaHuman/Private/GenerateSpeechAction.h create mode 100644 Source/AmazonPollyMetaHuman/Private/PollyClient.cpp create mode 100644 Source/AmazonPollyMetaHuman/Private/PollyClient.h create mode 100644 Source/AmazonPollyMetaHuman/Private/SpeechComponent.cpp create mode 100644 Source/AmazonPollyMetaHuman/Private/Tests/MockPollyClient.cpp create mode 100644 Source/AmazonPollyMetaHuman/Private/Tests/MockPollyClient.h create mode 100644 Source/AmazonPollyMetaHuman/Private/Tests/SpeechComponent.spec.cpp create mode 100644 Source/AmazonPollyMetaHuman/Private/Tests/TestableSpeechComponent.cpp create mode 100644 Source/AmazonPollyMetaHuman/Private/Tests/TestableSpeechComponent.h create mode 100644 Source/AmazonPollyMetaHuman/Private/UnrealAWSUtils.cpp create mode 100644 Source/AmazonPollyMetaHuman/Private/UnrealAWSUtils.h create mode 100644 Source/AmazonPollyMetaHuman/Private/Viseme.cpp create mode 100644 Source/AmazonPollyMetaHuman/Private/VoiceId.cpp create mode 100644 Source/AmazonPollyMetaHuman/Public/SpeechComponent.h create mode 100644 Source/AmazonPollyMetaHuman/Public/Viseme.h create mode 100644 Source/AmazonPollyMetaHuman/Public/VoiceId.h create mode 100755 Source/AmazonPollyMetaHuman/ThirdParty/AwsSdk/BuildAwsSdkMac.sh create mode 100644 Source/AmazonPollyMetaHuman/ThirdParty/AwsSdk/BuildAwsSdkWin64.bat create mode 100644 Source/AmazonPollyMetaHumanEditor.Target.cs diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..0b47ab8f --- /dev/null +++ b/.gitattributes @@ -0,0 +1,14 @@ +Content/** filter=lfs diff=lfs merge=lfs -text +*.dll filter=lfs diff=lfs merge=lfs -text +*.dylib filter=lfs diff=lfs merge=lfs -text +*.lib filter=lfs diff=lfs merge=lfs -text +*.png filter=lfs diff=lfs merge=lfs -text +*.uasset filter=lfs diff=lfs merge=lfs -text +*.umap filter=lfs diff=lfs merge=lfs -text +*.fx filter=lfs diff=lfs merge=lfs -text +*.tga filter=lfs diff=lfs merge=lfs -text +*.dds filter=lfs diff=lfs merge=lfs -text +*.dna filter=lfs diff=lfs merge=lfs -text +*.psd filter=lfs diff=lfs merge=lfs -text +*.mov filter=lfs diff=lfs merge=lfs -text +*.mp4 filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..01f9affa --- /dev/null +++ b/.gitignore @@ -0,0 +1,20 @@ +Binaries +DerivedDataCache +Intermediate +Saved +.DS_Store +.vscode +.vs +.ignore +*.VC.db +*.opensdf +*.opendb +*.sdf +*.sln +*.suo +*.xcodeproj +*.xcworkspace +*.code-workspace +Source/AmazonPollyMetaHuman/ThirdParty/AwsSdk/Mac +Source/AmazonPollyMetaHuman/ThirdParty/AwsSdk/Win64 + diff --git a/AmazonPollyMetaHuman.uproject b/AmazonPollyMetaHuman.uproject new file mode 100644 index 00000000..003c2f4a --- /dev/null +++ b/AmazonPollyMetaHuman.uproject @@ -0,0 +1,42 @@ +{ + "FileVersion": 3, + "EngineAssociation": "4.26", + "Category": "", + "Description": "", + "Modules": [ + { + "Name": "AmazonPollyMetaHuman", + "Type": "Runtime", + "LoadingPhase": "Default", + "AdditionalDependencies": [ + "Engine" + ] + } + ], + "Plugins": [ + { + "Name": "RigLogic", + "Enabled": true + }, + { + "Name": "LiveLink", + "Enabled": true + }, + { + "Name": "LiveLinkControlRig", + "Enabled": true + }, + { + "Name": "SequencerScripting", + "Enabled": true + }, + { + "Name": "HairStrands", + "Enabled": true + }, + { + "Name": "FunctionalTestingEditor", + "Enabled": true + } + ] +} diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..5b627cfa --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,4 @@ +## Code of Conduct +This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct). +For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact +opensource-codeofconduct@amazon.com with any additional questions or comments. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..2f43adc5 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,55 @@ +# Contributing Guidelines + +Thank you for your interest in contributing to our project. Whether it's a bug report, new feature, correction, or additional documentation, we greatly value feedback and contributions from our community. + +Please read through this document before submitting any issues or pull requests to ensure we have all the necessary information to effectively respond to your bug report or contribution. + + +## Reporting Bugs/Feature Requests + +We welcome you to use the GitHub issue tracker to report bugs or suggest features. + +When filing an issue, please check existing open, or recently closed, issues to make sure somebody else hasn't already reported the issue. Please try to include as much information as you can. Details like these are incredibly useful: + +* A reproducible test case or series of steps +* The version of our code being used +* Any modifications you've made relevant to the bug +* Anything unusual about your environment or deployment + + +## Contributing via Pull Requests +Contributions via pull requests are much appreciated. Before sending us a pull request, please ensure that: + +1. You are working against the latest source on the *main* branch. +2. You check existing open, and recently merged, pull requests to make sure someone else hasn't addressed the problem already. +3. You open an issue to discuss any significant work - we would hate for your time to be wasted. + +To send us a pull request, please: + +1. Fork the repository. +2. Modify the source; please focus on the specific change you are contributing. If you also reformat all the code, it will be hard for us to focus on your change. +3. Ensure local tests pass. +4. Commit to your fork using clear commit messages. +5. Send us a pull request, answering any default questions in the pull request interface. +6. Pay attention to any automated CI failures reported in the pull request, and stay involved in the conversation. + +GitHub provides additional document on [forking a repository](https://help.github.com/articles/fork-a-repo/) and [creating a pull request](https://help.github.com/articles/creating-a-pull-request/). + + +## Finding contributions to work on +Looking at the existing issues is a great way to find something to contribute on. As our projects, by default, use the default GitHub issue labels (enhancement/bug/duplicate/help wanted/invalid/question/wontfix), looking at any 'help wanted' issues is a great place to start. + + +## Code of Conduct +This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct). For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact opensource-codeofconduct@amazon.com with any additional questions or comments. + + +## Security issue notifications +If you discover a potential security issue in this project we ask that you notify AWS/Amazon Security via our [vulnerability reporting page](http://aws.amazon.com/security/vulnerability-reporting/). Please do **not** create a public GitHub issue. + + +## Licensing + +See the [LICENSE](LICENSE) file for our project's licensing. We will ask you to confirm the licensing of your contribution. + +We may ask you to sign a [Contributor License Agreement (CLA)](http://en.wikipedia.org/wiki/Contributor_License_Agreement) for larger changes. \ No newline at end of file diff --git a/Config/DefaultEditor.ini b/Config/DefaultEditor.ini new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/Config/DefaultEditor.ini @@ -0,0 +1 @@ + diff --git a/Config/DefaultEditorSettings.ini b/Config/DefaultEditorSettings.ini new file mode 100644 index 00000000..66235fd4 --- /dev/null +++ b/Config/DefaultEditorSettings.ini @@ -0,0 +1,3 @@ +[/Script/SourceCodeAccess.SourceCodeAccessSettings] +PreferredAccessor=VisualStudioCode + diff --git a/Config/DefaultEngine.ini b/Config/DefaultEngine.ini new file mode 100644 index 00000000..34f00121 --- /dev/null +++ b/Config/DefaultEngine.ini @@ -0,0 +1,31 @@ +[URL] +GameName=AmazonPollyMetaHuman + +[/Script/EngineSettings.GameMapsSettings] +GameDefaultMap=/Game/AmazonPollyMetaHuman/Scene/MetahumanScene.MetaHumanScene +EditorStartupMap=/Game/AmazonPollyMetaHuman/Scene/MetahumanScene.MetaHumanScene + +[/Script/HardwareTargeting.HardwareTargetingSettings] +TargetedHardwareClass=Desktop +AppliedTargetedHardwareClass=Desktop +DefaultGraphicsPerformance=Maximum +AppliedDefaultGraphicsPerformance=Maximum + +[/Script/Engine.Engine] ++ActiveGameNameRedirects=(OldGameName="TP_BlankBP",NewGameName="/Script/AmazonPollyMetaHuman") ++ActiveGameNameRedirects=(OldGameName="/Script/TP_BlankBP",NewGameName="/Script/AmazonPollyMetaHuman") ++ActiveGameNameRedirects=(OldGameName="/Script/MetaHumans",NewGameName="/Script/AmazonPollyMetaHuman") ++ActiveGameNameRedirects=(OldGameName="/Script/AmazonPollyMetaHumans",NewGameName="/Script/AmazonPollyMetaHuman") + +[ConsoleVariables] +fx.Niagara.ForceLastTickGroup=1 + +[/Script/Engine.RendererSettings] +r.GPUSkin.Support16BitBoneIndex=True +r.GPUSkin.UnlimitedBoneInfluences=True +r.SkinCache.BlendUsingVertexColorForRecomputeTangents=2 +r.SkinCache.CompileShaders=True +r.SkinCache.DefaultBehavior=0 +SkeletalMesh.UseExperimentalChunking=1 +r.DefaultFeature.AutoExposure=False + diff --git a/Config/DefaultGame.ini b/Config/DefaultGame.ini new file mode 100644 index 00000000..f8d15779 --- /dev/null +++ b/Config/DefaultGame.ini @@ -0,0 +1,7 @@ +[/Script/EngineSettings.GeneralProjectSettings] +ProjectID=B510366448A219E7E41BAAA45DDF5A6E +ProjectName=AmazonPollyMetaHuman + +[StartupActions] +bAddPacks=False + diff --git a/Content/AmazonPollyMetaHuman/Ada/BP_Ada.uasset b/Content/AmazonPollyMetaHuman/Ada/BP_Ada.uasset new file mode 100644 index 00000000..c5fd5068 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/BP_Ada.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cc87244926994288b0ba7955f9acd0155dc3e57ecebb28f6276a2262e2ef5449 +size 261561 diff --git a/Content/AmazonPollyMetaHuman/Ada/Body/BodyBaseColor.uasset b/Content/AmazonPollyMetaHuman/Ada/Body/BodyBaseColor.uasset new file mode 100644 index 00000000..b612ae82 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/Body/BodyBaseColor.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1937b0f4545c1d0b5dd44f3c198a433ad17d0c4e7b7f2930afbc4a1d88c9abd1 +size 1280704 diff --git a/Content/AmazonPollyMetaHuman/Ada/Face/Ada_FaceMesh.uasset b/Content/AmazonPollyMetaHuman/Ada/Face/Ada_FaceMesh.uasset new file mode 100644 index 00000000..4a7c039e --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/Face/Ada_FaceMesh.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2c7163182bc1cc36ab14b6048f9807778d7eb60783fd359ce4d70ad865ce8ed2 +size 149813573 diff --git a/Content/AmazonPollyMetaHuman/Ada/Face/ChestBaseColor.uasset b/Content/AmazonPollyMetaHuman/Ada/Face/ChestBaseColor.uasset new file mode 100644 index 00000000..18612521 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/Face/ChestBaseColor.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca277dc108f0dfdafab698b72824bdb79c68aa4bce52f7454cd3cc22987fc918 +size 437585 diff --git a/Content/AmazonPollyMetaHuman/Ada/Face/FaceBaseColor.uasset b/Content/AmazonPollyMetaHuman/Ada/Face/FaceBaseColor.uasset new file mode 100644 index 00000000..988e2143 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/Face/FaceBaseColor.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fb81a41f7fd6c324abd61671a1bf176228e32b631aff46388debb1960730bbbc +size 4236053 diff --git a/Content/AmazonPollyMetaHuman/Ada/Face/FaceBaseColorAnim1.uasset b/Content/AmazonPollyMetaHuman/Ada/Face/FaceBaseColorAnim1.uasset new file mode 100644 index 00000000..32ad7015 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/Face/FaceBaseColorAnim1.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:86d2d072c73d63787db01dcd358bd5b360a90eab32a8820b5b94a4bc66420998 +size 4212892 diff --git a/Content/AmazonPollyMetaHuman/Ada/Face/FaceBaseColorAnim2.uasset b/Content/AmazonPollyMetaHuman/Ada/Face/FaceBaseColorAnim2.uasset new file mode 100644 index 00000000..2d17635c --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/Face/FaceBaseColorAnim2.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2a38adb753be3f157887429a45d68da4927ec770bdc3ce6ff420ee32b1d27104 +size 4230399 diff --git a/Content/AmazonPollyMetaHuman/Ada/Face/FaceBaseColorAnim3.uasset b/Content/AmazonPollyMetaHuman/Ada/Face/FaceBaseColorAnim3.uasset new file mode 100644 index 00000000..9c89c0f4 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/Face/FaceBaseColorAnim3.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f64042c525b85f0e8ebc123bb5919c5ca8ef9a6cb8c3bdfc44dbfd7a8f233c80 +size 4232220 diff --git a/Content/AmazonPollyMetaHuman/Ada/Face/FollicleMask.uasset b/Content/AmazonPollyMetaHuman/Ada/Face/FollicleMask.uasset new file mode 100644 index 00000000..87e1b5ba --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/Face/FollicleMask.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4fe6cc855fcccdce55c25170bef6e1118409d7e8142fde50b9b3d2d6ac1ed473 +size 1389071 diff --git a/Content/AmazonPollyMetaHuman/Ada/Face/LookDev/Materials/M_EyeRefractive_Inst_L.uasset b/Content/AmazonPollyMetaHuman/Ada/Face/LookDev/Materials/M_EyeRefractive_Inst_L.uasset new file mode 100644 index 00000000..58379e7b --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/Face/LookDev/Materials/M_EyeRefractive_Inst_L.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a03f8ed2b1603c5f5099ef6eb7bd20427451c188909a55c61b94da7e26c9c925 +size 114140 diff --git a/Content/AmazonPollyMetaHuman/Ada/Face/LookDev/Materials/M_EyeRefractive_Inst_R.uasset b/Content/AmazonPollyMetaHuman/Ada/Face/LookDev/Materials/M_EyeRefractive_Inst_R.uasset new file mode 100644 index 00000000..9ef64d27 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/Face/LookDev/Materials/M_EyeRefractive_Inst_R.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:06d4fd3b7694565463ebcfc9ba3818fd03444b41f29d8f21839739faa618989a +size 113675 diff --git a/Content/AmazonPollyMetaHuman/Ada/Face/Materials/Materials/LODs/M_HeadSynthesized_LOD1.uasset b/Content/AmazonPollyMetaHuman/Ada/Face/Materials/Materials/LODs/M_HeadSynthesized_LOD1.uasset new file mode 100644 index 00000000..7d72b821 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/Face/Materials/Materials/LODs/M_HeadSynthesized_LOD1.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b48e99fe22b596aa323d5d7668a622e9fd720da71532c8107911edd37e57b659 +size 156515 diff --git a/Content/AmazonPollyMetaHuman/Ada/Face/Materials/Materials/LODs/M_HeadSynthesized_LOD2.uasset b/Content/AmazonPollyMetaHuman/Ada/Face/Materials/Materials/LODs/M_HeadSynthesized_LOD2.uasset new file mode 100644 index 00000000..12ea6f26 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/Face/Materials/Materials/LODs/M_HeadSynthesized_LOD2.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dc34632989d928873e459cc13eff38f198bf85625766babd1c3ed7bcbccbffef +size 157547 diff --git a/Content/AmazonPollyMetaHuman/Ada/Face/Materials/Materials/LODs/M_HeadSynthesized_LOD3.uasset b/Content/AmazonPollyMetaHuman/Ada/Face/Materials/Materials/LODs/M_HeadSynthesized_LOD3.uasset new file mode 100644 index 00000000..5d789456 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/Face/Materials/Materials/LODs/M_HeadSynthesized_LOD3.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cffc7871da7f7838e374b8a330fde7004954c62d12c9795aabde9b4cd6c0ab64 +size 157775 diff --git a/Content/AmazonPollyMetaHuman/Ada/Face/Materials/Materials/LODs/M_HeadSynthesized_LOD4.uasset b/Content/AmazonPollyMetaHuman/Ada/Face/Materials/Materials/LODs/M_HeadSynthesized_LOD4.uasset new file mode 100644 index 00000000..b41ab59c --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/Face/Materials/Materials/LODs/M_HeadSynthesized_LOD4.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:de77671e64dca168c02707c1965fdadfcf3e36b178c3c05b1c901e5fbb052aaa +size 157536 diff --git a/Content/AmazonPollyMetaHuman/Ada/Face/Materials/Materials/LODs/M_HeadSynthesized_LOD5.uasset b/Content/AmazonPollyMetaHuman/Ada/Face/Materials/Materials/LODs/M_HeadSynthesized_LOD5.uasset new file mode 100644 index 00000000..f67932d5 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/Face/Materials/Materials/LODs/M_HeadSynthesized_LOD5.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a8679fb0ff92122e9677e2ccd947accda61883113b648df323de34c922b25d32 +size 158588 diff --git a/Content/AmazonPollyMetaHuman/Ada/Face/Materials/Materials/M_HeadSynthesized.uasset b/Content/AmazonPollyMetaHuman/Ada/Face/Materials/Materials/M_HeadSynthesized.uasset new file mode 100644 index 00000000..3480e55c --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/Face/Materials/Materials/M_HeadSynthesized.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dd3b510a970fe1af402be8290bec522145874e7078d9ff409dd93f026165b10e +size 156858 diff --git a/Content/AmazonPollyMetaHuman/Ada/Female/Medium/NormalWeight/Body/f_med_nrw_body.uasset b/Content/AmazonPollyMetaHuman/Ada/Female/Medium/NormalWeight/Body/f_med_nrw_body.uasset new file mode 100644 index 00000000..7581b682 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/Female/Medium/NormalWeight/Body/f_med_nrw_body.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ea1cf4bde4e57e6c3ab3c43e89e44ac3951b40a8f50e0bcbdc8ccf9ecc20b3eb +size 5253265 diff --git a/Content/AmazonPollyMetaHuman/Ada/FemaleHair/GroomBinding/Eyebrows_M_Thin_f_med_nrw_head_skmesh_Face_Archetype_Binding.uasset b/Content/AmazonPollyMetaHuman/Ada/FemaleHair/GroomBinding/Eyebrows_M_Thin_f_med_nrw_head_skmesh_Face_Archetype_Binding.uasset new file mode 100644 index 00000000..8cf2e595 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/FemaleHair/GroomBinding/Eyebrows_M_Thin_f_med_nrw_head_skmesh_Face_Archetype_Binding.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b9023856a59d509040f21b1f90a27d30b5ef90d45a247c8e7af8238f68907208 +size 2306 diff --git a/Content/AmazonPollyMetaHuman/Ada/FemaleHair/GroomBinding/Eyelashes_L_SlightCurl_f_med_nrw_head_skmesh_lod0_Face_Archetype_Binding.uasset b/Content/AmazonPollyMetaHuman/Ada/FemaleHair/GroomBinding/Eyelashes_L_SlightCurl_f_med_nrw_head_skmesh_lod0_Face_Archetype_Binding.uasset new file mode 100644 index 00000000..076a6963 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/FemaleHair/GroomBinding/Eyelashes_L_SlightCurl_f_med_nrw_head_skmesh_lod0_Face_Archetype_Binding.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3c700f098ab7d07b312eac36a8be106fa7606d294e985fb616a0120873aac18d +size 2421 diff --git a/Content/AmazonPollyMetaHuman/Ada/FemaleHair/GroomBinding/Hair_S_Coil_f_head_Archetype_Binding.uasset b/Content/AmazonPollyMetaHuman/Ada/FemaleHair/GroomBinding/Hair_S_Coil_f_head_Archetype_Binding.uasset new file mode 100644 index 00000000..ba41cfe9 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/FemaleHair/GroomBinding/Hair_S_Coil_f_head_Archetype_Binding.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:68d3d5d70af2707fb444d546529452a288c91303a758ed8b4d1196ebecb040eb +size 2202 diff --git a/Content/AmazonPollyMetaHuman/Ada/FemaleHair/GroomBinding/Peachfuzz_M_Thin_f_head_Archetype_Binding.uasset b/Content/AmazonPollyMetaHuman/Ada/FemaleHair/GroomBinding/Peachfuzz_M_Thin_f_head_Archetype_Binding.uasset new file mode 100644 index 00000000..67f629a5 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/FemaleHair/GroomBinding/Peachfuzz_M_Thin_f_head_Archetype_Binding.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8ee31ffeee1ea2b2a5b9b79b9654b6981cdf0ecfc8f3073fbeeaaa07d11a4bb7 +size 2232 diff --git a/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Eyebrows_M_Thin.uasset b/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Eyebrows_M_Thin.uasset new file mode 100644 index 00000000..b2ed96f7 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Eyebrows_M_Thin.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:06183544514ccc5d93b551e1c47cb0251edc1abc0a02b2ed928d317eb701baff +size 281202 diff --git a/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Eyebrows_M_Thin_CardsMesh_Group0_LOD0.uasset b/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Eyebrows_M_Thin_CardsMesh_Group0_LOD0.uasset new file mode 100644 index 00000000..de464c31 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Eyebrows_M_Thin_CardsMesh_Group0_LOD0.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:affb293e3455886340d8e18d99b00027296c2edc7428f72523249657ca639750 +size 261250 diff --git a/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Eyebrows_M_Thin_CardsMesh_Group0_LOD1.uasset b/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Eyebrows_M_Thin_CardsMesh_Group0_LOD1.uasset new file mode 100644 index 00000000..56c3cf9b --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Eyebrows_M_Thin_CardsMesh_Group0_LOD1.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e0736b1fdbf794916edb337c2e65a9f1c9d19317bc6ea85fdd7fd30b27960af4 +size 175239 diff --git a/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Eyebrows_M_Thin_CardsMesh_Group0_LOD2.uasset b/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Eyebrows_M_Thin_CardsMesh_Group0_LOD2.uasset new file mode 100644 index 00000000..1b368622 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Eyebrows_M_Thin_CardsMesh_Group0_LOD2.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ac38a939c1d90c5069db7cffe1fafdd502fdcc912083715ae983a018e7e940cd +size 122964 diff --git a/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Eyebrows_M_Thin_CardsMesh_Group0_LOD3.uasset b/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Eyebrows_M_Thin_CardsMesh_Group0_LOD3.uasset new file mode 100644 index 00000000..b1d76864 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Eyebrows_M_Thin_CardsMesh_Group0_LOD3.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d7c0fb37cb6630637eed433471bab5e9352b2ce7fbd63e004a67555a16ea34d9 +size 100857 diff --git a/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Eyebrows_M_Thin_CardsMesh_Group0_LOD4.uasset b/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Eyebrows_M_Thin_CardsMesh_Group0_LOD4.uasset new file mode 100644 index 00000000..5343519e --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Eyebrows_M_Thin_CardsMesh_Group0_LOD4.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3db93c6521b86ac3c23b8b72943ed88a88aea0a6306beb5ef195e0c64372bb38 +size 86001 diff --git a/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Eyelashes_L_SlightCurl.uasset b/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Eyelashes_L_SlightCurl.uasset new file mode 100644 index 00000000..da4c5411 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Eyelashes_L_SlightCurl.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1604db704210116385bf931c888693e4ac1b1860791d51f7b777f9127bb770c1 +size 179210 diff --git a/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Hair_S_Coil.uasset b/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Hair_S_Coil.uasset new file mode 100644 index 00000000..4dd7e0bd --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Hair_S_Coil.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8c75bd05c6e733b2b5de4e067a5a467e30df37893b917f626854b4694d49e683 +size 49235113 diff --git a/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Hair_S_Coil_CardsMesh_Group0_LOD0.uasset b/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Hair_S_Coil_CardsMesh_Group0_LOD0.uasset new file mode 100644 index 00000000..ef5d64ed --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Hair_S_Coil_CardsMesh_Group0_LOD0.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3507e50d78cad905b3d3327813049b094d1e9886eb5836157517fbe3e2a75b43 +size 1657919 diff --git a/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Hair_S_Coil_CardsMesh_Group0_LOD1.uasset b/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Hair_S_Coil_CardsMesh_Group0_LOD1.uasset new file mode 100644 index 00000000..186113c5 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Hair_S_Coil_CardsMesh_Group0_LOD1.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:95431a6f614e858ad4a89ef4921fff787c8aa507f55573ead162bccc880118d2 +size 905000 diff --git a/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Hair_S_Coil_CardsMesh_Group0_LOD2.uasset b/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Hair_S_Coil_CardsMesh_Group0_LOD2.uasset new file mode 100644 index 00000000..16d4bf7f --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Hair_S_Coil_CardsMesh_Group0_LOD2.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f191dbcc5a0fbc938d0195370a25e7b53b0a57b2c0a57d14991b693367269d16 +size 588942 diff --git a/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Hair_S_Coil_CardsMesh_Group0_LOD3.uasset b/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Hair_S_Coil_CardsMesh_Group0_LOD3.uasset new file mode 100644 index 00000000..d50a4222 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Hair_S_Coil_CardsMesh_Group0_LOD3.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:11e0b161b363b842e11df30ccbe92d28c3610adeb4e9faa52760d0f8542e735f +size 289486 diff --git a/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Hair_S_Coil_CardsMesh_Group0_LOD4.uasset b/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Hair_S_Coil_CardsMesh_Group0_LOD4.uasset new file mode 100644 index 00000000..911c987d --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Hair_S_Coil_CardsMesh_Group0_LOD4.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:674a094cea59a53bb22e12f4f1e36a79ca15098b8609d2c09cb7e830bd4bb6c2 +size 147904 diff --git a/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Peachfuzz_M_Thin.uasset b/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Peachfuzz_M_Thin.uasset new file mode 100644 index 00000000..665177e9 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Hair/Peachfuzz_M_Thin.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c1932845d21f8fe48956e7e0bce16da9eeb165fc8e44072207ab3304a7e33345 +size 4573708 diff --git a/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Helmets/Hair_S_Coil_Helmet_LOD5.uasset b/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Helmets/Hair_S_Coil_Helmet_LOD5.uasset new file mode 100644 index 00000000..5748a4c0 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Helmets/Hair_S_Coil_Helmet_LOD5.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a195992632bfd0eaaffa5754f16902fcd5467d8ba9910cc4a44972360b36a5d4 +size 142139 diff --git a/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Helmets/Hair_S_Coil_Helmet_LOD6.uasset b/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Helmets/Hair_S_Coil_Helmet_LOD6.uasset new file mode 100644 index 00000000..d2038261 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Helmets/Hair_S_Coil_Helmet_LOD6.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0dbd3961112be910b212cdc86d7d5aff0f2cc5590c5b96eb32f096effce39247 +size 111253 diff --git a/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Helmets/Hair_S_Coil_Helmet_LOD7.uasset b/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Helmets/Hair_S_Coil_Helmet_LOD7.uasset new file mode 100644 index 00000000..63143917 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/FemaleHair/Helmets/Hair_S_Coil_Helmet_LOD7.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:95ac1c3b5448c1c6a9f3e21c23e394e25f5671b70252d50bc13026e8984c603c +size 96646 diff --git a/Content/AmazonPollyMetaHuman/Ada/Materials/Flats/M_shs_flats.uasset b/Content/AmazonPollyMetaHuman/Ada/Materials/Flats/M_shs_flats.uasset new file mode 100644 index 00000000..1990c342 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/Materials/Flats/M_shs_flats.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9d482f4d1740df6b622841823f0a70dfd5ef9ceee33dd01915c748f09e98312d +size 105443 diff --git a/Content/AmazonPollyMetaHuman/Ada/Materials/Jeans_slm/M_btm_jeans_slm_custom.uasset b/Content/AmazonPollyMetaHuman/Ada/Materials/Jeans_slm/M_btm_jeans_slm_custom.uasset new file mode 100644 index 00000000..d298e0e5 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/Materials/Jeans_slm/M_btm_jeans_slm_custom.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:25617d07ac46a5d9a16578d6c2585a4d623046e80702fa0fb0c5325e58be2c41 +size 115441 diff --git a/Content/AmazonPollyMetaHuman/Ada/Materials/MI_Facial_Hair.uasset b/Content/AmazonPollyMetaHuman/Ada/Materials/MI_Facial_Hair.uasset new file mode 100644 index 00000000..ada06412 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/Materials/MI_Facial_Hair.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bc00f301524256765e0cd6ef72aa68b421f11ef6598d7772469b299de85f604f +size 86160 diff --git a/Content/AmazonPollyMetaHuman/Ada/Materials/MI_Hair.uasset b/Content/AmazonPollyMetaHuman/Ada/Materials/MI_Hair.uasset new file mode 100644 index 00000000..0c3de800 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/Materials/MI_Hair.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cb1ade356c0c832ae8088c2ec4839bf684d29e9f7c567855a8edf540b44f6a20 +size 89602 diff --git a/Content/AmazonPollyMetaHuman/Ada/Materials/MI_Hair1.uasset b/Content/AmazonPollyMetaHuman/Ada/Materials/MI_Hair1.uasset new file mode 100644 index 00000000..00b96473 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/Materials/MI_Hair1.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c79ed46ea133a2406261534371ada03af597bdfe4d6d55882183da33b5f5b851 +size 89622 diff --git a/Content/AmazonPollyMetaHuman/Ada/Materials/MI_Hair2.uasset b/Content/AmazonPollyMetaHuman/Ada/Materials/MI_Hair2.uasset new file mode 100644 index 00000000..afe30ddd --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/Materials/MI_Hair2.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a14931872374e307d882ebc4fc51141652d72d25d0d019fafc04347347ac4469 +size 89622 diff --git a/Content/AmazonPollyMetaHuman/Ada/Materials/MI_Hair_Cards.uasset b/Content/AmazonPollyMetaHuman/Ada/Materials/MI_Hair_Cards.uasset new file mode 100644 index 00000000..893b6e72 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/Materials/MI_Hair_Cards.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:84ed24df867c44b33b7aa40eb290bbb0fe944f6828dd1752ba780f3f0a729a2d +size 91848 diff --git a/Content/AmazonPollyMetaHuman/Ada/Materials/MI_Hair_Helmet.uasset b/Content/AmazonPollyMetaHuman/Ada/Materials/MI_Hair_Helmet.uasset new file mode 100644 index 00000000..8427b31f --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/Materials/MI_Hair_Helmet.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4333099a61035b41c46b2c095b1ae66595ca4a4bdd0913f360f45b0e555a5a8e +size 90078 diff --git a/Content/AmazonPollyMetaHuman/Ada/Materials/MI_PeachFuzz.uasset b/Content/AmazonPollyMetaHuman/Ada/Materials/MI_PeachFuzz.uasset new file mode 100644 index 00000000..52dd8114 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/Materials/MI_PeachFuzz.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:178c32c4796c22beaea8ab1738a8c698e16cd29a93af233516deb70f61b8c044 +size 83834 diff --git a/Content/AmazonPollyMetaHuman/Ada/Materials/M_BodySynthesized.uasset b/Content/AmazonPollyMetaHuman/Ada/Materials/M_BodySynthesized.uasset new file mode 100644 index 00000000..359691c5 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/Materials/M_BodySynthesized.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ba1b0ba52a3d5499f0256f077efc0e8cfbf2c73c2bcf5dd6d3b727ac3fe824d7 +size 114344 diff --git a/Content/AmazonPollyMetaHuman/Ada/Materials/M_EyeLash_HigherLODs_Inst.uasset b/Content/AmazonPollyMetaHuman/Ada/Materials/M_EyeLash_HigherLODs_Inst.uasset new file mode 100644 index 00000000..3206a8f0 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/Materials/M_EyeLash_HigherLODs_Inst.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e52fecf7963a801f32a55ba3201050e6050c4d8f10cdfa0d6fb81966c594eb22 +size 93292 diff --git a/Content/AmazonPollyMetaHuman/Ada/Materials/M_EyelashLowerLODs_Inst.uasset b/Content/AmazonPollyMetaHuman/Ada/Materials/M_EyelashLowerLODs_Inst.uasset new file mode 100644 index 00000000..680935ac --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/Materials/M_EyelashLowerLODs_Inst.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6551b4d21548c8898589a30c03f5b5528161337ffcbe0cbb62a74ec03ac8de87 +size 83271 diff --git a/Content/AmazonPollyMetaHuman/Ada/Materials/M_TeethCharacterCreator_Inst.uasset b/Content/AmazonPollyMetaHuman/Ada/Materials/M_TeethCharacterCreator_Inst.uasset new file mode 100644 index 00000000..69fdc5ae --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/Materials/M_TeethCharacterCreator_Inst.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c89b4f0375c652b24be56e40f7b08793499e3649d814d89da410a12db2803403 +size 117784 diff --git a/Content/AmazonPollyMetaHuman/Ada/Materials/Shirt/Female/M_f_top_shirt.uasset b/Content/AmazonPollyMetaHuman/Ada/Materials/Shirt/Female/M_f_top_shirt.uasset new file mode 100644 index 00000000..5458cbdd --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Ada/Materials/Shirt/Female/M_f_top_shirt.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:63e10e3698818a72d2918997d11e54f434e96fa22dbc21fa167966dc3b3c3207 +size 110333 diff --git a/Content/AmazonPollyMetaHuman/Animation/BodyIdle.uasset b/Content/AmazonPollyMetaHuman/Animation/BodyIdle.uasset new file mode 100644 index 00000000..64971df5 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Animation/BodyIdle.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c6a3df944b2aa0ce78b9f5d201c8178ad1717cfec67c8c90c29b65dfd72f5c86 +size 3187997 diff --git a/Content/AmazonPollyMetaHuman/Animation/FaceIdle.uasset b/Content/AmazonPollyMetaHuman/Animation/FaceIdle.uasset new file mode 100644 index 00000000..e2c59140 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Animation/FaceIdle.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dc922808a5cb32fe94f668a7d64b90e9a2204537e2bc29673a1b5920e35f8aa9 +size 71003750 diff --git a/Content/AmazonPollyMetaHuman/Animation/Lean.uasset b/Content/AmazonPollyMetaHuman/Animation/Lean.uasset new file mode 100644 index 00000000..0a5ac004 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Animation/Lean.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ff083d14d07075008b021f165e59c4a0531b2aa11e5130f6bc0cd7dc3b9c5c74 +size 195884 diff --git a/Content/AmazonPollyMetaHuman/Animation/Speech_AnimBP.uasset b/Content/AmazonPollyMetaHuman/Animation/Speech_AnimBP.uasset new file mode 100644 index 00000000..e57264fd --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Animation/Speech_AnimBP.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2d0677ceae3d524e9b0769b8b600279911dca451d978f59fa550350f619a65ea +size 350793 diff --git a/Content/AmazonPollyMetaHuman/Animation/StretchNeck.uasset b/Content/AmazonPollyMetaHuman/Animation/StretchNeck.uasset new file mode 100644 index 00000000..69ae5eae --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Animation/StretchNeck.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a78ce58addca34188922a3a9b0985afa97ae51ac7d6dce4a87085fb6f8194cc8 +size 107749 diff --git a/Content/AmazonPollyMetaHuman/Animation/Visemes/Viseme_E_capital.uasset b/Content/AmazonPollyMetaHuman/Animation/Visemes/Viseme_E_capital.uasset new file mode 100644 index 00000000..77d56aaf --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Animation/Visemes/Viseme_E_capital.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bdc140b6e9d205c30346d20071cfea93d0e257969bbf5b58fd958cdbdc6ad0e3 +size 4406214 diff --git a/Content/AmazonPollyMetaHuman/Animation/Visemes/Viseme_a.uasset b/Content/AmazonPollyMetaHuman/Animation/Visemes/Viseme_a.uasset new file mode 100644 index 00000000..0d88848f --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Animation/Visemes/Viseme_a.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:78fedadb0af2b966234a24996a251f0ad9fed1dda1fdce9ddfc5e58026a3e041 +size 3558498 diff --git a/Content/AmazonPollyMetaHuman/Animation/Visemes/Viseme_at-sign.uasset b/Content/AmazonPollyMetaHuman/Animation/Visemes/Viseme_at-sign.uasset new file mode 100644 index 00000000..7672a0bb --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Animation/Visemes/Viseme_at-sign.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0d8ce7f81e9442748ed411ee49be6b51478065841639d6c6af1a63133d0fe6ce +size 3758983 diff --git a/Content/AmazonPollyMetaHuman/Animation/Visemes/Viseme_t.uasset b/Content/AmazonPollyMetaHuman/Animation/Visemes/Viseme_t.uasset new file mode 100644 index 00000000..9dba9e18 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Animation/Visemes/Viseme_t.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1cf4544a1ef38ea0470dda92809d7ad45180958f8bb8ce92f5e9fe63908e9d79 +size 4908212 diff --git a/Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_O_capital.uasset b/Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_O_capital.uasset new file mode 100644 index 00000000..c741bc1d --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_O_capital.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bf8d22f9a79a4f1342389eaf4e9720771903b30f6011b18d246b93323daf6e36 +size 1205947 diff --git a/Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_S_capital.uasset b/Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_S_capital.uasset new file mode 100644 index 00000000..e5657957 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_S_capital.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d6d06a65cfcb6e8e8288419177927fdd1b3a44b2c23318a2a7e41094848880a7 +size 4825523 diff --git a/Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_T_capital.uasset b/Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_T_capital.uasset new file mode 100644 index 00000000..6f09a0cf --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_T_capital.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:deaacfaa457155700d147f08059c02f2e977f13fbe85a59e5963d093db79b4ef +size 4827956 diff --git a/Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_f.uasset b/Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_f.uasset new file mode 100644 index 00000000..d5336cd3 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_f.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f8bd3a7ef54797ad6fca53816fb43ec99e1338ba37f0c2338570f9f70ebe42bf +size 898886 diff --git a/Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_i.uasset b/Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_i.uasset new file mode 100644 index 00000000..4c1278d0 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_i.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:30f2bfcc7d436efeb9c386b105154d86b49b9bd1c5ade8fc78e94d85a7a8ea58 +size 1063870 diff --git a/Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_k.uasset b/Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_k.uasset new file mode 100644 index 00000000..e8c1c9b1 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_k.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:50f2bf78ba5cc96dae018629cfad3971e9cf0736c6a130882346ca133effa7d0 +size 7273596 diff --git a/Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_lowerE.uasset b/Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_lowerE.uasset new file mode 100644 index 00000000..6743a648 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_lowerE.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9cf977ebee74579855001ed060ceaa30c9c33ad3e2bfe859d30aea7896449852 +size 4827976 diff --git a/Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_lowerO.uasset b/Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_lowerO.uasset new file mode 100644 index 00000000..f1e91064 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_lowerO.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2c9cfdf9419dc14d93d3c6073bfa133d20909e32971126a399a4e8ad9084da89 +size 4943423 diff --git a/Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_lowerS.uasset b/Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_lowerS.uasset new file mode 100644 index 00000000..257dd653 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_lowerS.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7a2cf1c2e3bb896ad868e845820fdae8117b86839af17b126eab8da0885231e6 +size 3095662 diff --git a/Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_p.uasset b/Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_p.uasset new file mode 100644 index 00000000..b30da1c6 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_p.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:99118288cb954f059fea74dd88a83648b955139d7ad754d072d7b684a1d2801d +size 1091054 diff --git a/Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_r.uasset b/Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_r.uasset new file mode 100644 index 00000000..b1388c7f --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_r.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:42dd31b973e25cba67dc7501ec2979cb233ef7edad9a04afbb8acee80ca6d72e +size 1531310 diff --git a/Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_sil.uasset b/Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_sil.uasset new file mode 100644 index 00000000..00a3ea67 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_sil.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7acf68bfcc146e9b54a1b202d1654579375096774810d659f4ee2bb743c3fb60 +size 4171275 diff --git a/Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_u.uasset b/Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_u.uasset new file mode 100644 index 00000000..96c20bd7 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Animation/Visemes/viseme_u.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:404b9b20c1396488aa195b23bbad5f8bda86543bada2e3086b50c74d8877611d +size 1063682 diff --git a/Content/AmazonPollyMetaHuman/Common/Common/MetaHuman_Clothing_LODSettings.uasset b/Content/AmazonPollyMetaHuman/Common/Common/MetaHuman_Clothing_LODSettings.uasset new file mode 100644 index 00000000..851f2e0d --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Common/MetaHuman_Clothing_LODSettings.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e70bb4eec83075320579dda8da8084d402f5e796f1701aef9988d8c85aef8637 +size 19407 diff --git a/Content/AmazonPollyMetaHuman/Common/Common/MetaHuman_ControlRig.uasset b/Content/AmazonPollyMetaHuman/Common/Common/MetaHuman_ControlRig.uasset new file mode 100644 index 00000000..1cd1a715 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Common/MetaHuman_ControlRig.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9008962255ede9669a8f9285f00bb8d06927e272d006e99c702e3b303ec785d1 +size 8230723 diff --git a/Content/AmazonPollyMetaHuman/Common/Common/Mocap/mh_arkit_mapping_anim.uasset b/Content/AmazonPollyMetaHuman/Common/Common/Mocap/mh_arkit_mapping_anim.uasset new file mode 100644 index 00000000..7ea8b77c --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Common/Mocap/mh_arkit_mapping_anim.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:af49d51e65cf70c343e0664926fcb7ff4f3c81b91ea181edd92ebcbe0dff8258 +size 716078 diff --git a/Content/AmazonPollyMetaHuman/Common/Common/Mocap/mh_arkit_mapping_anim1.uasset b/Content/AmazonPollyMetaHuman/Common/Common/Mocap/mh_arkit_mapping_anim1.uasset new file mode 100644 index 00000000..9296835a --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Common/Mocap/mh_arkit_mapping_anim1.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:69b6b67a3ef383b692185719fa1fc48be6e1be88261ac17b6b244bc7460a56ea +size 709091 diff --git a/Content/AmazonPollyMetaHuman/Common/Common/Mocap/mh_arkit_mapping_pose.uasset b/Content/AmazonPollyMetaHuman/Common/Common/Mocap/mh_arkit_mapping_pose.uasset new file mode 100644 index 00000000..bc3ecf13 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Common/Mocap/mh_arkit_mapping_pose.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d7ce12c4a9a2f40f3aea4c557bfdd8f6f1b73870a4350044b1fd74569f7af149 +size 248329 diff --git a/Content/AmazonPollyMetaHuman/Common/Common/Utilities/MH_CR_Picker.uasset b/Content/AmazonPollyMetaHuman/Common/Common/Utilities/MH_CR_Picker.uasset new file mode 100644 index 00000000..988c86ab --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Common/Utilities/MH_CR_Picker.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:042a8e66473f47bc5ba746f54a55ebe78fbda0533229f4dd19776a5125e200d0 +size 1625401 diff --git a/Content/AmazonPollyMetaHuman/Common/Common/Utilities/Picker_Assets/epic_games_logo.uasset b/Content/AmazonPollyMetaHuman/Common/Common/Utilities/Picker_Assets/epic_games_logo.uasset new file mode 100644 index 00000000..523a0514 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Common/Utilities/Picker_Assets/epic_games_logo.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c543ef16d4ee3655da4413aa5e2b414b8294a16dfc9ec2afdf267b35ba258cd7 +size 354367 diff --git a/Content/AmazonPollyMetaHuman/Common/Common/Utilities/Picker_Assets/grey_round_button.uasset b/Content/AmazonPollyMetaHuman/Common/Common/Utilities/Picker_Assets/grey_round_button.uasset new file mode 100644 index 00000000..28497f6d --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Common/Utilities/Picker_Assets/grey_round_button.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c1a23cb939851d82bdbeaa8dda2577fe950d2fa184db195da05fefc4e28d708d +size 78382 diff --git a/Content/AmazonPollyMetaHuman/Common/Common/Utilities/Picker_Assets/refresh.uasset b/Content/AmazonPollyMetaHuman/Common/Common/Utilities/Picker_Assets/refresh.uasset new file mode 100644 index 00000000..b28a4967 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Common/Utilities/Picker_Assets/refresh.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:25570ca6a0ed6360259dc5845e623d46173910394554ed278119bbbe47ada5e4 +size 133768 diff --git a/Content/AmazonPollyMetaHuman/Common/Common/Utilities/Picker_Assets/refresh_down.uasset b/Content/AmazonPollyMetaHuman/Common/Common/Utilities/Picker_Assets/refresh_down.uasset new file mode 100644 index 00000000..8fc1cac8 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Common/Utilities/Picker_Assets/refresh_down.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cb966d3d50796110532e0760418e0d007fbd09fa25dd418422383cb53df93b4d +size 35572 diff --git a/Content/AmazonPollyMetaHuman/Common/Common/Utilities/Picker_Assets/refresh_over.uasset b/Content/AmazonPollyMetaHuman/Common/Common/Utilities/Picker_Assets/refresh_over.uasset new file mode 100644 index 00000000..29143e4a --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Common/Utilities/Picker_Assets/refresh_over.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d8dc096b18e6930063ada510560c33845bbb39a4266ce902d1c5cffcbac57002 +size 243464 diff --git a/Content/AmazonPollyMetaHuman/Common/Common/f_med_nrw_preview.uasset b/Content/AmazonPollyMetaHuman/Common/Common/f_med_nrw_preview.uasset new file mode 100644 index 00000000..07dd4ddc --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Common/f_med_nrw_preview.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:08768c5284a9a80a62ecbb27e1c060f1fc2b77bac3db7e848af4721d48e31e2c +size 16299296 diff --git a/Content/AmazonPollyMetaHuman/Common/Common/f_med_ovw_body_preview.uasset b/Content/AmazonPollyMetaHuman/Common/Common/f_med_ovw_body_preview.uasset new file mode 100644 index 00000000..7dcc1015 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Common/f_med_ovw_body_preview.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fa903b1cffe0fa37b35163d8295c023e9b2d714dc0d4127c24ed090f245b75c4 +size 4422183 diff --git a/Content/AmazonPollyMetaHuman/Common/Common/f_med_unw_body_preview.uasset b/Content/AmazonPollyMetaHuman/Common/Common/f_med_unw_body_preview.uasset new file mode 100644 index 00000000..10921d4a --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Common/f_med_unw_body_preview.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e4a5d14e0d86e63c673edebd3218c2b72cb76e65c63d2015db3d0851563c14ac +size 4612212 diff --git a/Content/AmazonPollyMetaHuman/Common/Common/f_srt_nrw_body_preview.uasset b/Content/AmazonPollyMetaHuman/Common/Common/f_srt_nrw_body_preview.uasset new file mode 100644 index 00000000..b9decc62 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Common/f_srt_nrw_body_preview.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2ed44245b67edf96780b6c69f83d63a2abd0861b8382dbd5de2e8698887704f0 +size 3704982 diff --git a/Content/AmazonPollyMetaHuman/Common/Common/f_srt_ovw_body_preview.uasset b/Content/AmazonPollyMetaHuman/Common/Common/f_srt_ovw_body_preview.uasset new file mode 100644 index 00000000..34804253 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Common/f_srt_ovw_body_preview.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:31189bdd66ec813e1e379f62ce6fb58fd8562f764e22e491fef2e70cd10d2a04 +size 3711234 diff --git a/Content/AmazonPollyMetaHuman/Common/Common/f_srt_unw_body_preview.uasset b/Content/AmazonPollyMetaHuman/Common/Common/f_srt_unw_body_preview.uasset new file mode 100644 index 00000000..78da3a2e --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Common/f_srt_unw_body_preview.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6d37df5ec088919a5a308e3b07f8b49d0e475bb8eff6988ed6ab660f8054ed5a +size 4476440 diff --git a/Content/AmazonPollyMetaHuman/Common/Common/f_tal_nrw_body_preview.uasset b/Content/AmazonPollyMetaHuman/Common/Common/f_tal_nrw_body_preview.uasset new file mode 100644 index 00000000..5d9fb744 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Common/f_tal_nrw_body_preview.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f9e18ed0e0cbe5b4630513ab7a5e35e77cb8b1f407376244ea15d321581ee0ef +size 4568156 diff --git a/Content/AmazonPollyMetaHuman/Common/Common/f_tal_ovw_body_preview.uasset b/Content/AmazonPollyMetaHuman/Common/Common/f_tal_ovw_body_preview.uasset new file mode 100644 index 00000000..fb251a1e --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Common/f_tal_ovw_body_preview.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:90e540ff5d483e6a0ca671dcc6a0d41294b5866afa4fcfc8453c2c3710da1cf8 +size 4411319 diff --git a/Content/AmazonPollyMetaHuman/Common/Common/f_tal_unw_body_preview.uasset b/Content/AmazonPollyMetaHuman/Common/Common/f_tal_unw_body_preview.uasset new file mode 100644 index 00000000..55025a4c --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Common/f_tal_unw_body_preview.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aeb7a30397752e00bd3ea1f6f7bb3c94da91fe5de1a0b0509f6fcc5a7fd5c33d +size 4418310 diff --git a/Content/AmazonPollyMetaHuman/Common/Common/m_med_nrw_body_preview.uasset b/Content/AmazonPollyMetaHuman/Common/Common/m_med_nrw_body_preview.uasset new file mode 100644 index 00000000..f165afb4 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Common/m_med_nrw_body_preview.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:73e3b16e5fccd5b7208901b2809b21ff1b433d41fd88af6a01f4534b4137c959 +size 4445469 diff --git a/Content/AmazonPollyMetaHuman/Common/Common/m_med_ovw_body_preview.uasset b/Content/AmazonPollyMetaHuman/Common/Common/m_med_ovw_body_preview.uasset new file mode 100644 index 00000000..c205f9d3 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Common/m_med_ovw_body_preview.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e6995a6495f7ad72631304b02ec67cef2e79c6adbcd9f4be73ca6e4ce347140f +size 4469431 diff --git a/Content/AmazonPollyMetaHuman/Common/Common/m_med_unw_body_preview.uasset b/Content/AmazonPollyMetaHuman/Common/Common/m_med_unw_body_preview.uasset new file mode 100644 index 00000000..3945cc44 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Common/m_med_unw_body_preview.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1c298804d5bbaf5fd1a1d3e2bf33483cda4897675869cca7efcb5fe1a5973869 +size 4452089 diff --git a/Content/AmazonPollyMetaHuman/Common/Common/m_srt_nrw_body_preview.uasset b/Content/AmazonPollyMetaHuman/Common/Common/m_srt_nrw_body_preview.uasset new file mode 100644 index 00000000..e276249b --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Common/m_srt_nrw_body_preview.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:01c648cab58906f6c0cfe86b6e5fff2707ab9bf2e3414c1ffc1420979736e02b +size 4470139 diff --git a/Content/AmazonPollyMetaHuman/Common/Common/m_srt_ovw_body_preview.uasset b/Content/AmazonPollyMetaHuman/Common/Common/m_srt_ovw_body_preview.uasset new file mode 100644 index 00000000..c4b1567f --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Common/m_srt_ovw_body_preview.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:058deed445271d6a18474d0cb355d77a9f9b7f685690774ac8e86daf7f89108e +size 4715197 diff --git a/Content/AmazonPollyMetaHuman/Common/Common/m_srt_unw_body_preview.uasset b/Content/AmazonPollyMetaHuman/Common/Common/m_srt_unw_body_preview.uasset new file mode 100644 index 00000000..ea602a86 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Common/m_srt_unw_body_preview.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b1f5a6db4f4ddae1646a3706acc509aab2b36ffbd4becb75b9c42477469c41c4 +size 4191790 diff --git a/Content/AmazonPollyMetaHuman/Common/Common/m_tal_nrw_body_preview.uasset b/Content/AmazonPollyMetaHuman/Common/Common/m_tal_nrw_body_preview.uasset new file mode 100644 index 00000000..227132dc --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Common/m_tal_nrw_body_preview.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5dde6d4cf0a66070b0927a92c2c43d9d25cab40d7da3d652955763a8a53aaa9e +size 3715189 diff --git a/Content/AmazonPollyMetaHuman/Common/Common/m_tal_ovw_body_preview.uasset b/Content/AmazonPollyMetaHuman/Common/Common/m_tal_ovw_body_preview.uasset new file mode 100644 index 00000000..a6a00a00 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Common/m_tal_ovw_body_preview.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:08b1a47ff070f91655438c20ac9fb1deba9277ca7bbc186537d1a6814f660635 +size 3719463 diff --git a/Content/AmazonPollyMetaHuman/Common/Common/m_tal_unw_body_preview.uasset b/Content/AmazonPollyMetaHuman/Common/Common/m_tal_unw_body_preview.uasset new file mode 100644 index 00000000..3c178bcf --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Common/m_tal_unw_body_preview.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ebc5a838aeef361d4796e5626c71f25828edbc5a5a39bddce884ea2c7fb2db2f +size 4447503 diff --git a/Content/AmazonPollyMetaHuman/Common/Common/metahuman_proc_ControlRig.uasset b/Content/AmazonPollyMetaHuman/Common/Common/metahuman_proc_ControlRig.uasset new file mode 100644 index 00000000..9e95b375 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Common/metahuman_proc_ControlRig.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f6501ce6fa084e68f1fb6fb6c2151465ec585e551261362b4e0de8f3be0667c7 +size 3133050 diff --git a/Content/AmazonPollyMetaHuman/Common/Controls/DefaultGizmoLibrary.uasset b/Content/AmazonPollyMetaHuman/Common/Controls/DefaultGizmoLibrary.uasset new file mode 100644 index 00000000..bdfb2613 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Controls/DefaultGizmoLibrary.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:de7bc9fb86dd2d40734edb76d3310facfc8b1024ea9389882993662c8b764eba +size 29963 diff --git a/Content/AmazonPollyMetaHuman/Common/Controls/M_RigControlActor_Black.uasset b/Content/AmazonPollyMetaHuman/Common/Controls/M_RigControlActor_Black.uasset new file mode 100644 index 00000000..c382839d --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Controls/M_RigControlActor_Black.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2b1ea2780887a9f9ed17f4fcefa44ff944e6e22e19679717d35dbf553d764d4b +size 79846 diff --git a/Content/AmazonPollyMetaHuman/Common/Controls/convergence_3l.uasset b/Content/AmazonPollyMetaHuman/Common/Controls/convergence_3l.uasset new file mode 100644 index 00000000..6dda9e8d --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Controls/convergence_3l.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:68d0f398ea8277b3493c84042407ea25862a0cf79397803840dcddfc44d175c6 +size 385937 diff --git a/Content/AmazonPollyMetaHuman/Common/Controls/faceboard_2x.uasset b/Content/AmazonPollyMetaHuman/Common/Controls/faceboard_2x.uasset new file mode 100644 index 00000000..0b2b5691 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Controls/faceboard_2x.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3cd677b190c841adbb1ae33d1cbf73ff3a20607a96b35053ca7edfc8fb5c98c3 +size 773287 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/ArtistDelights/SkinAccents/T_SkinAccentRegions_001.uasset b/Content/AmazonPollyMetaHuman/Common/Face/ArtistDelights/SkinAccents/T_SkinAccentRegions_001.uasset new file mode 100644 index 00000000..08be49a3 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/ArtistDelights/SkinAccents/T_SkinAccentRegions_001.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:250a11a6ba1097bb0af2a6a729c52f5c63d6625d7090da1d266bbf97e5de8691 +size 235669 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/ArtistDelights/SkinAccents/T_SkinAccentRegions_002.uasset b/Content/AmazonPollyMetaHuman/Common/Face/ArtistDelights/SkinAccents/T_SkinAccentRegions_002.uasset new file mode 100644 index 00000000..d56284c9 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/ArtistDelights/SkinAccents/T_SkinAccentRegions_002.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:486cc1581aae9949282cea34be703325c1bd0668f5084ce4dccd73f23b1e7a87 +size 321606 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/Face_AnimBP.uasset b/Content/AmazonPollyMetaHuman/Common/Face/Face_AnimBP.uasset new file mode 100644 index 00000000..211499a7 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/Face_AnimBP.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:02775ab252026206da239008e68d24658834654d47a92178d2b14972cafc2b36 +size 307665 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/Face_Archetype.uasset b/Content/AmazonPollyMetaHuman/Common/Face/Face_Archetype.uasset new file mode 100644 index 00000000..02eb57c8 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/Face_Archetype.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f42ffe671a13f47638effb3520df8203c0474b9e5def5dac14b6661f481928f9 +size 149807301 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/Face_Archetype_LODSettings.uasset b/Content/AmazonPollyMetaHuman/Common/Face/Face_Archetype_LODSettings.uasset new file mode 100644 index 00000000..6d8149c1 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/Face_Archetype_LODSettings.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:106085e175b49f99d6fa06c11a0ed376b8d58393905c34998c218353c2759f74 +size 359570 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/Face_Archetype_Physics.uasset b/Content/AmazonPollyMetaHuman/Common/Face/Face_Archetype_Physics.uasset new file mode 100644 index 00000000..ce93aaf0 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/Face_Archetype_Physics.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4f011d85973ca10c8ddcfbe345dd43503b46adbf186518d91d1ca7f2209a8329 +size 79003 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/Face_Archetype_Skeleton.uasset b/Content/AmazonPollyMetaHuman/Common/Face/Face_Archetype_Skeleton.uasset new file mode 100644 index 00000000..9691e932 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/Face_Archetype_Skeleton.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a5617ac4a229edcc3aa4fbea53f64e27c9a4b82ea73815cd7ede7e41f3ea520d +size 234030 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/Face_ControlBoard_CtrlRig.uasset b/Content/AmazonPollyMetaHuman/Common/Face/Face_ControlBoard_CtrlRig.uasset new file mode 100644 index 00000000..3b35f817 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/Face_ControlBoard_CtrlRig.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:76cb62ad3b1818bc0d41435e50e022e6f4560b1c0f2e80bbc61304a07bfbf302 +size 11170975 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/Face_PostProcess_AnimBP.uasset b/Content/AmazonPollyMetaHuman/Common/Face/Face_PostProcess_AnimBP.uasset new file mode 100644 index 00000000..44e81531 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/Face_PostProcess_AnimBP.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6d87574c9bf76434a0b55cae942a3711a245ee27e7a044cd1d7e74db974b13bf +size 111443 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/AnimMasks/head_wm13_msk_01.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/AnimMasks/head_wm13_msk_01.uasset new file mode 100644 index 00000000..b9c48b79 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/AnimMasks/head_wm13_msk_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2565929b9209785341c0844c3bfa89dc739d7ad10a5c047c473fda863057b456 +size 74277 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/AnimMasks/head_wm1_msk_01.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/AnimMasks/head_wm1_msk_01.uasset new file mode 100644 index 00000000..5df83c1f --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/AnimMasks/head_wm1_msk_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6dc15792b37e0928676a626931eeaf4abb4412937c67fbd20d01be79460d79fb +size 222182 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/AnimMasks/head_wm1_msk_02.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/AnimMasks/head_wm1_msk_02.uasset new file mode 100644 index 00000000..2775b640 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/AnimMasks/head_wm1_msk_02.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b0f6943e36dc5e7916852bada32cae37f8a5505ecf0cd0ad1a0f0468e67a188a +size 364802 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/AnimMasks/head_wm1_msk_03.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/AnimMasks/head_wm1_msk_03.uasset new file mode 100644 index 00000000..f8966e9e --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/AnimMasks/head_wm1_msk_03.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:06c81cefcfe6847e502ea5661b5a45e03e54ed86e5a7e814b8d97dabfd12d960 +size 758118 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/AnimMasks/head_wm1_msk_04.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/AnimMasks/head_wm1_msk_04.uasset new file mode 100644 index 00000000..8a79676e --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/AnimMasks/head_wm1_msk_04.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:718e3a875da4519aa7e1f9d980efb1455a848b2a8bab7dcc6d39ca764e9ce14e +size 174704 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/AnimMasks/head_wm2_msk_01.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/AnimMasks/head_wm2_msk_01.uasset new file mode 100644 index 00000000..a592600a --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/AnimMasks/head_wm2_msk_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b39430b608a1cc1669eee898cf99c484409111b0ce7c6be2d77262b69c83c977 +size 289528 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/AnimMasks/head_wm2_msk_02.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/AnimMasks/head_wm2_msk_02.uasset new file mode 100644 index 00000000..52cb87b5 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/AnimMasks/head_wm2_msk_02.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a121a0e227611178c26dbc05d03fa9a5abd25e9213223835abb0e153fbc7d3a9 +size 563486 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/AnimMasks/head_wm2_msk_03.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/AnimMasks/head_wm2_msk_03.uasset new file mode 100644 index 00000000..b8d283bb --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/AnimMasks/head_wm2_msk_03.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5924e259d0dfbae95f8cff12dc49298294b3096888d7595c8c238bb92afbc5e6 +size 330841 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/AnimMasks/head_wm3_msk_01.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/AnimMasks/head_wm3_msk_01.uasset new file mode 100644 index 00000000..a83d6070 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/AnimMasks/head_wm3_msk_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:94ceda9eebb80b5f10a5cb7430f085d5134c45b35717000055fab9626850a916 +size 215990 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/AnimMasks/head_wm3_msk_02.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/AnimMasks/head_wm3_msk_02.uasset new file mode 100644 index 00000000..0f7c62c8 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/AnimMasks/head_wm3_msk_02.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3e4daf13327b68fca8539b2cba686d43c399813f2d0c6516fe1f53a1e5b78d87 +size 453609 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Materials/M_Cartilage.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Materials/M_Cartilage.uasset new file mode 100644 index 00000000..09dc1452 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Materials/M_Cartilage.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9d9a58dadb5f60d0eb0fab78e5427a01d6f55fe83034dabfb992b540d9465cdc +size 69989 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Materials/M_EyeOcclusion.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Materials/M_EyeOcclusion.uasset new file mode 100644 index 00000000..978c7fbf --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Materials/M_EyeOcclusion.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:72d7f04584eb22bf48210c533be49a1d1141643b8855b6cc83735e54e454318f +size 178536 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Materials/M_EyeOcclusion_Inst.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Materials/M_EyeOcclusion_Inst.uasset new file mode 100644 index 00000000..4da75950 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Materials/M_EyeOcclusion_Inst.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:29016a079f062c9a2e6887f38314968022623957b69bf8cdd25b155095d1e828 +size 101344 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Materials/M_EyeRefractive_Inst_L.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Materials/M_EyeRefractive_Inst_L.uasset new file mode 100644 index 00000000..a46ca9f5 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Materials/M_EyeRefractive_Inst_L.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:44f59a1255f85c6df35bc4a7dbe69aad326833d13c39fce3ded8968ec2a341ea +size 106382 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Materials/M_EyeRefractive_Inst_R.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Materials/M_EyeRefractive_Inst_R.uasset new file mode 100644 index 00000000..12faa91f --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Materials/M_EyeRefractive_Inst_R.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ab2ffc2eb3f4f5a2cb8e2a456dd39bcfc998901f0940812d56c700e50e3fda82 +size 105711 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Materials/M_lacrimal_fluid.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Materials/M_lacrimal_fluid.uasset new file mode 100644 index 00000000..23493c9c --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Materials/M_lacrimal_fluid.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6725b447daf9fd0876d79fa3a73d34687e1ef793931994aa310d91c2150ed8ca +size 111734 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Materials/M_lacrimal_fluid_Inst.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Materials/M_lacrimal_fluid_Inst.uasset new file mode 100644 index 00000000..9c3df5eb --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Materials/M_lacrimal_fluid_Inst.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6df85720424aab1a05e4088f6773d55170284c7d284a87ade054b69ed4ac3801 +size 86583 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Functions/MF_EyeRefraction.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Functions/MF_EyeRefraction.uasset new file mode 100644 index 00000000..2b25347e --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Functions/MF_EyeRefraction.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:858eb8746b35b0908c1fca87d879cb5198c7ba1925033c4a4fec197e07fd39b1 +size 113806 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Functions/MF_IrisGenerator.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Functions/MF_IrisGenerator.uasset new file mode 100644 index 00000000..7c72f57d --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Functions/MF_IrisGenerator.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4d5607cf963db9f0f18ce7bda13fdf78f752f0e4d00f3c6e9f0a7a4e4e13c32b +size 113822 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Functions/MF_ParallaxOcclusionMappingEye.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Functions/MF_ParallaxOcclusionMappingEye.uasset new file mode 100644 index 00000000..742ee31f --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Functions/MF_ParallaxOcclusionMappingEye.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d68d08933bee4989c49aac79a35c671b38736c8fe5de409183445f5e72edb841 +size 147700 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/M_EyeRefractive.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/M_EyeRefractive.uasset new file mode 100644 index 00000000..760a860c --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/M_EyeRefractive.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d1410233c9da070126e7a7ee9b039f2bd175fb5514805309275a8bb5d6d3c26a +size 222965 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/SSProfile/SSP_Eye_Inner.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/SSProfile/SSP_Eye_Inner.uasset new file mode 100644 index 00000000..fa1a5e70 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/SSProfile/SSP_Eye_Inner.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8f0745376af68ed1ca2b19eaf7902bbd20755bc044cb666e869dc1960fe454f8 +size 3261 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/IrisTextures/iris_001/T_Iris_A_H.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/IrisTextures/iris_001/T_Iris_A_H.uasset new file mode 100644 index 00000000..d4322d81 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/IrisTextures/iris_001/T_Iris_A_H.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b8496abb886440a9925092b0a8225e7adcea9f07bfccb290892c420fe47f8bdb +size 320593 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/IrisTextures/iris_001/T_Iris_A_M.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/IrisTextures/iris_001/T_Iris_A_M.uasset new file mode 100644 index 00000000..2a1ff95f --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/IrisTextures/iris_001/T_Iris_A_M.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:780357afebad6381e4fa17cb1f453abcadbdbfd6c48e34ad8e2d4b25d855f1ff +size 1882538 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/IrisTextures/iris_007/T_Iris_A_H.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/IrisTextures/iris_007/T_Iris_A_H.uasset new file mode 100644 index 00000000..b87087e5 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/IrisTextures/iris_007/T_Iris_A_H.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a2049a271709b1aadae82d392384befe2b79ae6b230cfe35afb0c20b19732475 +size 306890 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/IrisTextures/iris_007/T_Iris_A_M.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/IrisTextures/iris_007/T_Iris_A_M.uasset new file mode 100644 index 00000000..318661b2 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/IrisTextures/iris_007/T_Iris_A_M.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2ac641963a5a85314c8a1e65ad6cb09f45da1ad485983c9a5ea6ad9cc601b3cc +size 1941356 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/T_EyeMidPlaneDisplacement.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/T_EyeMidPlaneDisplacement.uasset new file mode 100644 index 00000000..6c8469e1 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/T_EyeMidPlaneDisplacement.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dcfc687093761e0e4b6f9d7d45eecec557362e3b037b6b739fab82bae58f2559 +size 1744521 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/T_Eye_N.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/T_Eye_N.uasset new file mode 100644 index 00000000..d1e24065 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/T_Eye_N.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d06dff22ffb914656824064303a1936a20946c7530e11d9ef67b5ef88aa88755 +size 317327 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/T_Sclera_D.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/T_Sclera_D.uasset new file mode 100644 index 00000000..941433e5 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/T_Sclera_D.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3c6087090845bee7520c543e1f4f7a9df5bae601b87667db712b2002c169bc5a +size 3934096 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/T_Sclera_N.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/T_Sclera_N.uasset new file mode 100644 index 00000000..8b81e562 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/T_Sclera_N.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6658421673f19b9d7e8721e4c5e87e9138a722ae6d017d2c2564df7323dc5fa1 +size 1647677 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/T_TilingNoise_001.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/T_TilingNoise_001.uasset new file mode 100644 index 00000000..e791f8ee --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/T_TilingNoise_001.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:061eb46083450e172b9a42fa05ca46d6f2735e1fb8d1248fa1624a1f90251c7b +size 199960 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/T_Veins_D.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/T_Veins_D.uasset new file mode 100644 index 00000000..15f8a904 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/T_Veins_D.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:070031aed437041cfcb434a8c1eb48c3150752af97040888fa4f1f3d96812bcb +size 6026134 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/iris_color_picker.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/iris_color_picker.uasset new file mode 100644 index 00000000..59ee83a3 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/iris_color_picker.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:49f11ce417b49fb7a9928d6994e9ea05982c5c4fc0645137768f0bfe5ed825ac +size 122625 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/sclera_tint_picker.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/sclera_tint_picker.uasset new file mode 100644 index 00000000..d572223c --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/EyeMaterials/Textures/sclera_tint_picker.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9a42f6c17fee29daa851793693fe4ba1c9c523e147acf594d110bac94edc7008 +size 45078 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/M_Head.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/M_Head.uasset new file mode 100644 index 00000000..e73f069b --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/M_Head.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:40a7bb7a672c32bb5f3bdaf53f4e7559bf31ad8ff144e05f1e9613e5d8d53082 +size 350389 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/MaterialFunctions/MF_AnimatedMaps.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/MaterialFunctions/MF_AnimatedMaps.uasset new file mode 100644 index 00000000..d9de358c --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/MaterialFunctions/MF_AnimatedMaps.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:822d18fb14548f4b2cffc14680def48d4189f63c3cd2b3a9e9c9b9e549bd340e +size 91544 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/MaterialFunctions/MF_BakedGroomTextures.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/MaterialFunctions/MF_BakedGroomTextures.uasset new file mode 100644 index 00000000..a6996641 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/MaterialFunctions/MF_BakedGroomTextures.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:37e9d3bb17d1f4d7297cebb6a87f021f28b0d716b3dfa4e4bf767cb99667e318 +size 141015 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/MaterialFunctions/MF_HeadMask_01.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/MaterialFunctions/MF_HeadMask_01.uasset new file mode 100644 index 00000000..0753b203 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/MaterialFunctions/MF_HeadMask_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4156ad0498eb046cdb3b5a11e3443013f45641149c1900fa71cce5b6b5fae361 +size 109961 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/MaterialFunctions/MF_HeadMask_02.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/MaterialFunctions/MF_HeadMask_02.uasset new file mode 100644 index 00000000..61a5a78b --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/MaterialFunctions/MF_HeadMask_02.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:14798db8dfecd32a11ae71d525b64619dd1335f9801bfd1eb1231e380dee27c8 +size 96124 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/MaterialFunctions/MF_HeadMask_03.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/MaterialFunctions/MF_HeadMask_03.uasset new file mode 100644 index 00000000..b044c9cc --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/MaterialFunctions/MF_HeadMask_03.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7f335979986dff8993e3dc4a143b02861f52dede09ef81efb3ca33abbacb4d1e +size 98267 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/MaterialFunctions/MF_RoughnessMult.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/MaterialFunctions/MF_RoughnessMult.uasset new file mode 100644 index 00000000..c3c7da7a --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/MaterialFunctions/MF_RoughnessMult.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bae9bf251a3113461d4bbce4b57937e9cb3a4405aeaf318963327975b686db11 +size 116424 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/Textures/RoughnessRegionsMasks/T_RoughnessRegions_001.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/Textures/RoughnessRegionsMasks/T_RoughnessRegions_001.uasset new file mode 100644 index 00000000..fbf38d94 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/Textures/RoughnessRegionsMasks/T_RoughnessRegions_001.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e124de77d7e5c60b9d6fb23fc144bccca032d807dfc01090575794ab6b74292e +size 212240 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/Textures/RoughnessRegionsMasks/T_RoughnessRegions_002.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/Textures/RoughnessRegionsMasks/T_RoughnessRegions_002.uasset new file mode 100644 index 00000000..19db850a --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/Textures/RoughnessRegionsMasks/T_RoughnessRegions_002.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:da6d941cdc1ead121ac6b640e81b402de4787bdcb7b3a2fe47d30e8b38546ca1 +size 179814 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/Textures/RoughnessRegionsMasks/T_RoughnessRegions_003.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/Textures/RoughnessRegionsMasks/T_RoughnessRegions_003.uasset new file mode 100644 index 00000000..8ef3961e --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/Textures/RoughnessRegionsMasks/T_RoughnessRegions_003.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4c91e99c48e511b7531e109e15c305d2afdebaf78a2de2843112200bf87c2f06 +size 41602 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/Textures/RoughnessRegionsMasks/T_RoughnessRegions_004.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/Textures/RoughnessRegionsMasks/T_RoughnessRegions_004.uasset new file mode 100644 index 00000000..63b7690d --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/Textures/RoughnessRegionsMasks/T_RoughnessRegions_004.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d0e591343c3f161efce5aa2d50509d0f3d0af60728100b843cc4bcb4541d3f6a +size 178479 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/Textures/RoughnessRegionsMasks/T_RoughnessRegions_005.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/Textures/RoughnessRegionsMasks/T_RoughnessRegions_005.uasset new file mode 100644 index 00000000..106b5614 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/Textures/RoughnessRegionsMasks/T_RoughnessRegions_005.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e35788118a80e613d04d4439d1365e59075e79278c14cb115dbf1777678c2847 +size 171120 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/Textures/RoughnessRegionsMasks/T_RoughnessRegions_006.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/Textures/RoughnessRegionsMasks/T_RoughnessRegions_006.uasset new file mode 100644 index 00000000..058b386d --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/Textures/RoughnessRegionsMasks/T_RoughnessRegions_006.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9cf1e11b27c19747b7d79fc95134be3f0d5a0fb2fbbe4a5f13766109206fc0b8 +size 51583 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/Textures/RoughnessRegionsMasks/T_RoughnessRegions_007.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/Textures/RoughnessRegionsMasks/T_RoughnessRegions_007.uasset new file mode 100644 index 00000000..98a640e4 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/Textures/RoughnessRegionsMasks/T_RoughnessRegions_007.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7268bcf525026df7e5b887490f0c0361a800b445c79728397d28980bde4b2bbe +size 33383 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/Textures/T_FlatNormal.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/Textures/T_FlatNormal.uasset new file mode 100644 index 00000000..64b78057 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Shared/Textures/T_FlatNormal.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:97d671b35466ad93a40d12a921bbda1e7ad5dfddfb3dfc7c88b20b59ab18f6fa +size 4957 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/SubsurfaceProfiles/SP_Head.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/SubsurfaceProfiles/SP_Head.uasset new file mode 100644 index 00000000..e54dbd9a --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/SubsurfaceProfiles/SP_Head.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fdbd621d5c8f32c970eced8aa789c4d0e68f617ba0d03b23827202f659cdf1c0 +size 3742 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Textures/1x1_BakedGroomTextureBase.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Textures/1x1_BakedGroomTextureBase.uasset new file mode 100644 index 00000000..99091e65 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Textures/1x1_BakedGroomTextureBase.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1964f484d421c50726aa118be044e66fcd73d9d45f391fcdb85ca8b5175450d5 +size 3095 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Textures/lacrimal_h.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Textures/lacrimal_h.uasset new file mode 100644 index 00000000..10f695ae --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Textures/lacrimal_h.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d2a6eed9729467fb53a0c96490a5be78193dfcdc29227fe071f53f3c6839ed52 +size 676771 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Textures/lacrimal_n.uasset b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Textures/lacrimal_n.uasset new file mode 100644 index 00000000..ebc660e1 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/LookDev/Textures/lacrimal_n.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4b892ac3dca3e9e499ba8bd0c2ba94de7c29a6f7f6784af0881d12e327d1857d +size 1694741 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/Materials/Materials/DefaultTexture.uasset b/Content/AmazonPollyMetaHuman/Common/Face/Materials/Materials/DefaultTexture.uasset new file mode 100644 index 00000000..8161f5aa --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/Materials/Materials/DefaultTexture.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:164e8dd3a5755dc82df5387cb46db8c508b0fd712840deb13647abee63329520 +size 55691 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/Materials/Materials/DefaultTextureLinear.uasset b/Content/AmazonPollyMetaHuman/Common/Face/Materials/Materials/DefaultTextureLinear.uasset new file mode 100644 index 00000000..ffc65fca --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/Materials/Materials/DefaultTextureLinear.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f12c4be134e0355cce6ddcb493fe985328e7a1e4fc846a1e1905e19ce8c0a78d +size 53535 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/Materials/Materials/LODs/M_HeadSynthesized_LOD1.uasset b/Content/AmazonPollyMetaHuman/Common/Face/Materials/Materials/LODs/M_HeadSynthesized_LOD1.uasset new file mode 100644 index 00000000..91223b39 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/Materials/Materials/LODs/M_HeadSynthesized_LOD1.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7bdb37f8e5275620ac42db8f983bafa772ed8ad26d42c4998c267ca73797c408 +size 98037 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/Materials/Materials/LODs/M_HeadSynthesized_LOD2.uasset b/Content/AmazonPollyMetaHuman/Common/Face/Materials/Materials/LODs/M_HeadSynthesized_LOD2.uasset new file mode 100644 index 00000000..09b9931b --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/Materials/Materials/LODs/M_HeadSynthesized_LOD2.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4b0fba24716456ba4b8be22c04bad12ff6f3734094b0bb325dd2077bdd26cb40 +size 98554 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/Materials/Materials/M_HeadSynthesized.uasset b/Content/AmazonPollyMetaHuman/Common/Face/Materials/Materials/M_HeadSynthesized.uasset new file mode 100644 index 00000000..67ffcff5 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/Materials/Materials/M_HeadSynthesized.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8cb50c6f1ddd80ad31fd0e0c0eba2513e961df9d17fca3f4834869756308118b +size 116348 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/Materials/Materials/RoughnessBake_Tex.uasset b/Content/AmazonPollyMetaHuman/Common/Face/Materials/Materials/RoughnessBake_Tex.uasset new file mode 100644 index 00000000..8123f444 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/Materials/Materials/RoughnessBake_Tex.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:53c2f1a222789b4c4a40ea959f14703bb7d8a7f196d5f3760c56044366eb7453 +size 496071 diff --git a/Content/AmazonPollyMetaHuman/Common/Face/Neck_CtrlRig.uasset b/Content/AmazonPollyMetaHuman/Common/Face/Neck_CtrlRig.uasset new file mode 100644 index 00000000..abcfa62c --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Face/Neck_CtrlRig.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:27ce90d404c24e59284dfeb8117a0add238296d0c319d9d1b1005e241c83b616 +size 2132102 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Body/MetaHuman_LODSettings.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Body/MetaHuman_LODSettings.uasset new file mode 100644 index 00000000..d954ec59 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Body/MetaHuman_LODSettings.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4fc8f735c571482b9536608c0aa07314e9f2189bd264e655006420c9351f510d +size 18902 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Body/f_med_nrw_animbp.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Body/f_med_nrw_animbp.uasset new file mode 100644 index 00000000..80ca441d --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Body/f_med_nrw_animbp.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:184b2ba54b1ad96d1cba7800fc9d11eefffbb878a5e80cddc6b265cf7ccff9a1 +size 453278 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Body/f_med_nrw_body_skmesh_Physics.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Body/f_med_nrw_body_skmesh_Physics.uasset new file mode 100644 index 00000000..c00ce41f --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Body/f_med_nrw_body_skmesh_Physics.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:569be4388d2543edbb85c91c52188644e44b568167e86df1e7f8347786189165 +size 113971 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Body/metahuman_base_skel.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Body/metahuman_base_skel.uasset new file mode 100644 index 00000000..1afdace0 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Body/metahuman_base_skel.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f41910b35f0a8e6ad1bc2e8696d5088111f9c58208295e9b5cb1329cdcc123bf +size 487570 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Bottoms/Jeans/f_med_nrw_btm_jeans_slm.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Bottoms/Jeans/f_med_nrw_btm_jeans_slm.uasset new file mode 100644 index 00000000..76277c22 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Bottoms/Jeans/f_med_nrw_btm_jeans_slm.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a560dd95cdf13842c0691a16b3c9bbaba71d9f7bd6c2ba550ae7e00a31074080 +size 5620865 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_calf_l_anim.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_calf_l_anim.uasset new file mode 100644 index 00000000..f24fdfca --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_calf_l_anim.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:726fb9cb59bdd714c934b4fc4bf844cbaaed2ae8120d2e5bc0b243cd8e96c29f +size 100919 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_calf_l_pose.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_calf_l_pose.uasset new file mode 100644 index 00000000..e55f805c --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_calf_l_pose.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a1c0486f228ac4f735b8bc0a296af8db8fc97f773963ab9d5a69bc387d8774ed +size 191512 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_calf_r_anim.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_calf_r_anim.uasset new file mode 100644 index 00000000..68df9a3f --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_calf_r_anim.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:319346d720ba6f971c9a44e52b9f8f0360e0d39ffd58d886cc221f5bd9b82043 +size 101029 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_calf_r_pose.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_calf_r_pose.uasset new file mode 100644 index 00000000..a50ccdea --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_calf_r_pose.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8c152157baf4a3070a6422066290cf4236ddf8110c0e36a34e6803a2d4ef0c14 +size 191512 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_clavicle_l_anim.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_clavicle_l_anim.uasset new file mode 100644 index 00000000..faf260ca --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_clavicle_l_anim.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:62917d7d8197750465d9a731f94f9635a5fae9c71f35d8baac4a88f7aa06317b +size 100558 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_clavicle_l_pose.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_clavicle_l_pose.uasset new file mode 100644 index 00000000..2e934da7 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_clavicle_l_pose.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cad10d8eb27c4eabaeed10d5df1e26efb8df128a62daad5ef51f33b987987f59 +size 159404 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_clavicle_r_anim.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_clavicle_r_anim.uasset new file mode 100644 index 00000000..7b80766f --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_clavicle_r_anim.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:df69151731ad2d7af42320318b58212e13461c84547d99127e428f147d626c65 +size 100521 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_clavicle_r_pose.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_clavicle_r_pose.uasset new file mode 100644 index 00000000..7af44070 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_clavicle_r_pose.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dc061523ca0f5ae575e4b721b470cd238209727317a8e215c4372767e77a9142 +size 159607 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_foot_l_anim.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_foot_l_anim.uasset new file mode 100644 index 00000000..0706efd1 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_foot_l_anim.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f99b10f75e673eddd6b1cab0db69e481e9dd17d0ff86863815d95c948c6980ce +size 98722 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_foot_l_pose.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_foot_l_pose.uasset new file mode 100644 index 00000000..ab2d2826 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_foot_l_pose.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:207855b01d4ed7ee8c0c1bab50ddf687ace928a9c9edd94a673d19263b162138 +size 98534 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_foot_r_anim.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_foot_r_anim.uasset new file mode 100644 index 00000000..ed13b00d --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_foot_r_anim.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:62ac5fc317c8f9ae17679a9fcc3d39c13dc9b14b4cf0e12a47138c7f21532328 +size 98269 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_foot_r_pose.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_foot_r_pose.uasset new file mode 100644 index 00000000..7558dbed --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_foot_r_pose.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e6c1eec3c08fda43a2ea5ea450ca2588f73c24681bc86eb319e83cdee5cadad5 +size 123208 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_hand_l_anim.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_hand_l_anim.uasset new file mode 100644 index 00000000..91459415 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_hand_l_anim.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f9bba807d4ba80e5899fcf3b10c9900acff91e1deab09223f816484cd18c74f0 +size 100539 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_hand_l_pose.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_hand_l_pose.uasset new file mode 100644 index 00000000..8dc0cc60 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_hand_l_pose.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9cebe831d230701f9edae10dfff3f1e9190c7b32dad9d0ed22c6fe31ee31dbe6 +size 129123 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_hand_r_anim.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_hand_r_anim.uasset new file mode 100644 index 00000000..81fc8cbf --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_hand_r_anim.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:baf5ab9ff4c3c9efcbf568636a63cac5b62d584594a8782a6ed3e394d486afac +size 100595 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_hand_r_pose.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_hand_r_pose.uasset new file mode 100644 index 00000000..096be265 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_hand_r_pose.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b48ebf834184f89fda4505167e35886019edef5624b2bdaf1726ca6152e8a9b0 +size 129123 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_lowerarm_l_anim.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_lowerarm_l_anim.uasset new file mode 100644 index 00000000..2a5e363e --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_lowerarm_l_anim.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:07169340c6524b43a38233be698827ee1c580bc4c8e409f95094b558038f24cc +size 101516 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_lowerarm_l_pose.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_lowerarm_l_pose.uasset new file mode 100644 index 00000000..14a718b6 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_lowerarm_l_pose.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:44be34846cbebf80af0a910a0f5e2623584371e0ca504d606cd0090e8cb05fba +size 318207 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_lowerarm_r_anim.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_lowerarm_r_anim.uasset new file mode 100644 index 00000000..342063ad --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_lowerarm_r_anim.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e016f7ff7ef1396c5486b4251db8adea1001668d74b59654e70160d63a7f1066 +size 101548 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_lowerarm_r_pose.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_lowerarm_r_pose.uasset new file mode 100644 index 00000000..cab761f6 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_lowerarm_r_pose.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b994899d284966e0118dd0d67439f873bb22879ecd78cb65dd5b46336cfec701 +size 318231 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_thigh_l_anim.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_thigh_l_anim.uasset new file mode 100644 index 00000000..d4509385 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_thigh_l_anim.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:001cc4d8ca55147cc6f0f3740b8d22fb0d3a987d075d628cb21aae4b9a25e752 +size 104062 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_thigh_l_pose.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_thigh_l_pose.uasset new file mode 100644 index 00000000..88bc6ab2 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_thigh_l_pose.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:95fdc9f9fcdf3ec4e4097af5bdce37b7c8e4d83da211994e6070fad0ee5d1b8b +size 447298 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_thigh_r_anim.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_thigh_r_anim.uasset new file mode 100644 index 00000000..5517d6a6 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_thigh_r_anim.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:633c696448d7e223160d54ce467091d40b7781eb64a4f91d0e00594fd0dc2b7e +size 103716 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_thigh_r_pose.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_thigh_r_pose.uasset new file mode 100644 index 00000000..9bd4a92d --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_thigh_r_pose.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c4dc206c248f4f86a0585cf47d85c84cdbfaa6084d2762850473eb48a6e909a9 +size 447298 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_upperarm_l_anim.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_upperarm_l_anim.uasset new file mode 100644 index 00000000..9eead199 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_upperarm_l_anim.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:18d460cd7fc3d0344ab3e19d421afa4826509d8d26479afe93a5be57357e53ca +size 104561 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_upperarm_l_pose.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_upperarm_l_pose.uasset new file mode 100644 index 00000000..3c8934c5 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_upperarm_l_pose.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e1cf3eb477adb701e974030102abc9512401ac5b0f0dacd8039ee9ed76e86549 +size 507325 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_upperarm_r_anim.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_upperarm_r_anim.uasset new file mode 100644 index 00000000..78c17343 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_upperarm_r_anim.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cab794cfd11744bdcd957560592dea7a6abf41b0b7e713233979c7d5cf5f73a7 +size 105007 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_upperarm_r_pose.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_upperarm_r_pose.uasset new file mode 100644 index 00000000..39d6a0be --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Poses/f_med_nrw_upperarm_r_pose.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5ca200809395f158fa3609b6bed2639b1bab023331e1aa6cd88fd97ff0ce1c15 +size 517069 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Shoes/Flats/Meshes/f_med_nrw_shs_flats.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Shoes/Flats/Meshes/f_med_nrw_shs_flats.uasset new file mode 100644 index 00000000..9e13b778 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Shoes/Flats/Meshes/f_med_nrw_shs_flats.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:39bb4c6ee1c47c5ee6b1ed8d8ba4f08a3c56216744fc9925c5c37b5a8b8cec25 +size 2758751 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Tops/Shirt/f_med_nrw_top_shirt_nrm.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Tops/Shirt/f_med_nrw_top_shirt_nrm.uasset new file mode 100644 index 00000000..d98bc016 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Tops/Shirt/f_med_nrw_top_shirt_nrm.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d07b6a12fa7465cab7cfb0bd47282aef3f08b6c51e3136e7adee397ef51fd2d7 +size 8733611 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Tops/Shirt/f_med_nrw_top_shirt_nrm_CtrlRig.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Tops/Shirt/f_med_nrw_top_shirt_nrm_CtrlRig.uasset new file mode 100644 index 00000000..5a12c26a --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Tops/Shirt/f_med_nrw_top_shirt_nrm_CtrlRig.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0a30c581d8ab2de3dd5c169a9e4cc56af8bd90a8b2fbf3e1ed5af4afdb364000 +size 656555 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Tops/Shirt/f_med_nrw_top_shirt_nrm_PhysicsAsset.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Tops/Shirt/f_med_nrw_top_shirt_nrm_PhysicsAsset.uasset new file mode 100644 index 00000000..f52b316f --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Tops/Shirt/f_med_nrw_top_shirt_nrm_PhysicsAsset.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e319b7f9a7a1923accc075887be120e4bd9fd6f8c2dcf89ae7b042fd8da3c4cc +size 90753 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Tops/Shirt/f_med_nrw_top_shirt_nrm_Skeleton.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Tops/Shirt/f_med_nrw_top_shirt_nrm_Skeleton.uasset new file mode 100644 index 00000000..6a48031d --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Tops/Shirt/f_med_nrw_top_shirt_nrm_Skeleton.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a699f5dc475be74e4a37c1925878226ca27c07902af3614b057b5637456b86dc +size 25677 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Tops/Shirt/f_med_nrw_top_shirt_nrm_Skeleton_AnimBlueprint.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Tops/Shirt/f_med_nrw_top_shirt_nrm_Skeleton_AnimBlueprint.uasset new file mode 100644 index 00000000..c0c96b94 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Medium/NormalWeight/Tops/Shirt/f_med_nrw_top_shirt_nrm_Skeleton_AnimBlueprint.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b98262f5f6873f61adfda213c96a16720ab84abbcde47eacbaa1a13bdd2cecd1 +size 107881 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Textures/Shared/1K/female_body_mask_map.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Textures/Shared/1K/female_body_mask_map.uasset new file mode 100644 index 00000000..c2a5f151 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Textures/Shared/1K/female_body_mask_map.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:31e694e09decdffb22a60f2526a7064994d2595372a6d9d383c94717e5c7e2d2 +size 109836 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Textures/Shared/1K/female_underwear_color_map.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Textures/Shared/1K/female_underwear_color_map.uasset new file mode 100644 index 00000000..ba0b2b37 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Textures/Shared/1K/female_underwear_color_map.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:228610ecb98e1ee20db003507c73e6de99ab80aa001540dbe0b5b53b81748db8 +size 208997 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Textures/female001/female_chest_cavity_map.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Textures/female001/female_chest_cavity_map.uasset new file mode 100644 index 00000000..c6dc5cbb --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Textures/female001/female_chest_cavity_map.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9df61a5a58bd06cd49368e456a509ca67b7c59b7c32186b0900063328febaa82 +size 15900221 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Textures/female001/female_chest_mask_map.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Textures/female001/female_chest_mask_map.uasset new file mode 100644 index 00000000..1684ae0a --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Textures/female001/female_chest_mask_map.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4c067eaff9c7e33a8cad8edce3d891d1b822271a4c290f0f80e4ddae9cbe635c +size 160218 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Textures/female001/female_chest_normal_map.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Textures/female001/female_chest_normal_map.uasset new file mode 100644 index 00000000..e2fce118 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Textures/female001/female_chest_normal_map.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7a44f8546a2677d836fda171c458557fc7b4677dbb1b1696db318133f144963d +size 73746762 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Textures/female001/female_chest_roughness_map.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Textures/female001/female_chest_roughness_map.uasset new file mode 100644 index 00000000..fd559a45 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Textures/female001/female_chest_roughness_map.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9b3709916c13c99cb26610b4420e7d6b1acb74be5f64af2f7a0769deadf5b9be +size 28757 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Textures/female_002/1K/female_body_cavity_map.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Textures/female_002/1K/female_body_cavity_map.uasset new file mode 100644 index 00000000..d19c7543 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Textures/female_002/1K/female_body_cavity_map.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1a591f1df940710f639eff260af2fa4a81e50850a83152c65189106899b88613 +size 1235772 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Textures/female_002/1K/female_body_normal_map.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Textures/female_002/1K/female_body_normal_map.uasset new file mode 100644 index 00000000..b79863d2 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Textures/female_002/1K/female_body_normal_map.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:652c661205272b6f400c30cae6c924bba094c1f27435a0b0efc154f44d749355 +size 1536919 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Textures/female_002/1K/female_body_roughness_map.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Textures/female_002/1K/female_body_roughness_map.uasset new file mode 100644 index 00000000..a17b87de --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Textures/female_002/1K/female_body_roughness_map.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60a92f0cb5e92b131a58977c183d45376b566512be9b0477c51a0a0baea4205d +size 43296 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Textures/female_002/1K/female_chest_cavity_map.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Textures/female_002/1K/female_chest_cavity_map.uasset new file mode 100644 index 00000000..39a0fd15 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Textures/female_002/1K/female_chest_cavity_map.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1513c24fb5ac6a91a80f1b91563f2e413bf74230411596b24cbc8314d7d04ba6 +size 381300 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Textures/female_002/1K/female_chest_normal_map.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Textures/female_002/1K/female_chest_normal_map.uasset new file mode 100644 index 00000000..4d1dc8c8 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Textures/female_002/1K/female_chest_normal_map.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7f4cb1853f683c18b7225dff970b49427b9cc99a5f03f48a955489d470f6b1ec +size 549461 diff --git a/Content/AmazonPollyMetaHuman/Common/Female/Textures/female_002/1K/female_chest_roughness_map.uasset b/Content/AmazonPollyMetaHuman/Common/Female/Textures/female_002/1K/female_chest_roughness_map.uasset new file mode 100644 index 00000000..e17a90eb --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Female/Textures/female_002/1K/female_chest_roughness_map.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6323f369e2e998a04a4412054065caf3c247b2a7dc4c675979d5fcd34697e59c +size 16789 diff --git a/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Eyebrows_M_Thin_Cards/Eyebrows_M_Thin_CardsAtlas_Attribute.uasset b/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Eyebrows_M_Thin_Cards/Eyebrows_M_Thin_CardsAtlas_Attribute.uasset new file mode 100644 index 00000000..b289a102 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Eyebrows_M_Thin_Cards/Eyebrows_M_Thin_CardsAtlas_Attribute.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b4f436ad35673090508d1253df50a9e8e42ec8039e2a671f9f6fefcb1efab22d +size 173389 diff --git a/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Eyebrows_M_Thin_Cards/Eyebrows_M_Thin_CardsAtlas_Coverage.uasset b/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Eyebrows_M_Thin_Cards/Eyebrows_M_Thin_CardsAtlas_Coverage.uasset new file mode 100644 index 00000000..cf74135b --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Eyebrows_M_Thin_Cards/Eyebrows_M_Thin_CardsAtlas_Coverage.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:007f14babe74ddca5553d7c3dab7325f7b58f54730b77986de49645a6846fb0e +size 148593 diff --git a/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Eyebrows_M_Thin_Cards/Eyebrows_M_Thin_CardsAtlas_Depth.uasset b/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Eyebrows_M_Thin_Cards/Eyebrows_M_Thin_CardsAtlas_Depth.uasset new file mode 100644 index 00000000..27832acc --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Eyebrows_M_Thin_Cards/Eyebrows_M_Thin_CardsAtlas_Depth.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6b35e32c0e5fe0aa1574730f4eebe9c5763148bad5672336ae4004b8b4986856 +size 87609 diff --git a/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Eyebrows_M_Thin_Cards/Eyebrows_M_Thin_CardsAtlas_Tangent.uasset b/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Eyebrows_M_Thin_Cards/Eyebrows_M_Thin_CardsAtlas_Tangent.uasset new file mode 100644 index 00000000..093f599f --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Eyebrows_M_Thin_Cards/Eyebrows_M_Thin_CardsAtlas_Tangent.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:624107cc678d1fcf3bfb978e659753355a01b2f05f6c34ba6f14d9c297671af1 +size 97435 diff --git a/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Eyebrows_M_Thin_baked/Eyebrows_M_Thin_baked.uasset b/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Eyebrows_M_Thin_baked/Eyebrows_M_Thin_baked.uasset new file mode 100644 index 00000000..ef53a87f --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Eyebrows_M_Thin_baked/Eyebrows_M_Thin_baked.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eaa9408a1ac24ad162cf07a21162d25ccfa8e72536dc8fb94e692ab2b7e5c81c +size 16924 diff --git a/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Eyelashes_L_SlightCurl_Cards/Eyelashes_L_SlightCurl_Coverage.uasset b/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Eyelashes_L_SlightCurl_Cards/Eyelashes_L_SlightCurl_Coverage.uasset new file mode 100644 index 00000000..bd43dd31 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Eyelashes_L_SlightCurl_Cards/Eyelashes_L_SlightCurl_Coverage.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:26867f9525eacf378283d562c890529b3df9d95444c25144b64898326dfd6faa +size 1267515 diff --git a/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Hair_S_Coil/Hair_S_Coil_Attribute.uasset b/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Hair_S_Coil/Hair_S_Coil_Attribute.uasset new file mode 100644 index 00000000..7f9626f8 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Hair_S_Coil/Hair_S_Coil_Attribute.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8298eddd1d811b292562cdd320d0d7b49fab18eddc8deb5c4e135d27cab9fcd9 +size 7518468 diff --git a/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Hair_S_Coil/Hair_S_Coil_Depth.uasset b/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Hair_S_Coil/Hair_S_Coil_Depth.uasset new file mode 100644 index 00000000..b4ec6d9a --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Hair_S_Coil/Hair_S_Coil_Depth.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:feb6cc93c865fc75fa15478bce16ae6593a82a78b4e3af454fd2b90f000520f7 +size 4965430 diff --git a/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Hair_S_Coil/Hair_S_Coil_Opacity.uasset b/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Hair_S_Coil/Hair_S_Coil_Opacity.uasset new file mode 100644 index 00000000..8d9e61eb --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Hair_S_Coil/Hair_S_Coil_Opacity.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b5c7c1f7c3ebdab6f173d977854ee33c72ad720c8a8e8bfcdbc1ab2c04191c50 +size 314286 diff --git a/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Hair_S_Coil/Hair_S_Coil_Tangent.uasset b/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Hair_S_Coil/Hair_S_Coil_Tangent.uasset new file mode 100644 index 00000000..d73ac4ec --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Hair_S_Coil/Hair_S_Coil_Tangent.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7f34058cfd1cfe56ad20348140b061d84932ee104cb0b39cfc03b796bd170b3a +size 8859560 diff --git a/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Hair_S_Coil_Cards/Hair_S_Coil_CardsAtlas_Attribute.uasset b/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Hair_S_Coil_Cards/Hair_S_Coil_CardsAtlas_Attribute.uasset new file mode 100644 index 00000000..d9725ff6 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Hair_S_Coil_Cards/Hair_S_Coil_CardsAtlas_Attribute.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5741af4794d34f5c787357c6cc4e856ed5c82f7caced06e75b91c6528674bfd0 +size 870857 diff --git a/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Hair_S_Coil_Cards/Hair_S_Coil_CardsAtlas_Coverage.uasset b/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Hair_S_Coil_Cards/Hair_S_Coil_CardsAtlas_Coverage.uasset new file mode 100644 index 00000000..30a3a267 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Hair_S_Coil_Cards/Hair_S_Coil_CardsAtlas_Coverage.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ea67a9cdd1aa582b55784b8f10d9beea76cc6181f3253fd0339ff1f8c3632a9c +size 6344993 diff --git a/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Hair_S_Coil_Cards/Hair_S_Coil_CardsAtlas_Depth.uasset b/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Hair_S_Coil_Cards/Hair_S_Coil_CardsAtlas_Depth.uasset new file mode 100644 index 00000000..562d6789 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Hair_S_Coil_Cards/Hair_S_Coil_CardsAtlas_Depth.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a500555fae5dec39816728b3740187aca605e33f036aa226931a95f9a8d131c0 +size 362231 diff --git a/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Hair_S_Coil_Cards/Hair_S_Coil_CardsAtlas_Tangent.uasset b/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Hair_S_Coil_Cards/Hair_S_Coil_CardsAtlas_Tangent.uasset new file mode 100644 index 00000000..2410378c --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Hair_S_Coil_Cards/Hair_S_Coil_CardsAtlas_Tangent.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7baf205aaed1b9efe5139478d902fa16d987d345ea2ce4791f40b76fb44e2300 +size 642223 diff --git a/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Hair_S_Coil_baked/Hair_S_Coil_baked.uasset b/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Hair_S_Coil_baked/Hair_S_Coil_baked.uasset new file mode 100644 index 00000000..62264239 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/FemaleHair/Textures/Hair_S_Coil_baked/Hair_S_Coil_baked.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:72ac64de52bbc4d6a06b20930f2c9fd9c2bf78af38692077b017405499dd3534 +size 959071 diff --git a/Content/AmazonPollyMetaHuman/Common/Fonts/RobotoCondensed-Bold.uasset b/Content/AmazonPollyMetaHuman/Common/Fonts/RobotoCondensed-Bold.uasset new file mode 100644 index 00000000..aa7bbc5e --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Fonts/RobotoCondensed-Bold.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b8ae7a1ae222d1de11fdb72316309f03b78aecbb92eeef221cf10853b8877117 +size 170815 diff --git a/Content/AmazonPollyMetaHuman/Common/Fonts/RobotoCondensed-BoldItalic.uasset b/Content/AmazonPollyMetaHuman/Common/Fonts/RobotoCondensed-BoldItalic.uasset new file mode 100644 index 00000000..c5d99af4 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Fonts/RobotoCondensed-BoldItalic.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ead0287536d25e802fe6db978a0c75f4fe3d1693ebe489b35134e272ca4546b2 +size 176919 diff --git a/Content/AmazonPollyMetaHuman/Common/Fonts/RobotoCondensed-Light.uasset b/Content/AmazonPollyMetaHuman/Common/Fonts/RobotoCondensed-Light.uasset new file mode 100644 index 00000000..34503c2b --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Fonts/RobotoCondensed-Light.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:696aaaf5d030d3eb827f0eeafeb8f9b088d33ca5d0347ba5bb86b6dadcdf949b +size 169037 diff --git a/Content/AmazonPollyMetaHuman/Common/Fonts/RobotoCondensed-LightItalic.uasset b/Content/AmazonPollyMetaHuman/Common/Fonts/RobotoCondensed-LightItalic.uasset new file mode 100644 index 00000000..65aa6fb0 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Fonts/RobotoCondensed-LightItalic.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dd02bb5bd14537dc8494cce3afb2507479c0a7b2632fb2330b32b8d2295a977d +size 176413 diff --git a/Content/AmazonPollyMetaHuman/Common/Fonts/RobotoCondensed-Regular.uasset b/Content/AmazonPollyMetaHuman/Common/Fonts/RobotoCondensed-Regular.uasset new file mode 100644 index 00000000..fa3a0639 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Fonts/RobotoCondensed-Regular.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e16cb2a3adea3ba92a53d2bf24b74787a4ca387548044ce4538d7f2bef5ea369 +size 171329 diff --git a/Content/AmazonPollyMetaHuman/Common/Fonts/RobotoCondensed.uasset b/Content/AmazonPollyMetaHuman/Common/Fonts/RobotoCondensed.uasset new file mode 100644 index 00000000..038bf6a2 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Fonts/RobotoCondensed.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:28a28ec8218fc6701499f596441de34db39a692fcc537096a68e3fdbaf94b9ff +size 28736 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/DefaultTexture_Grayscale.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/DefaultTexture_Grayscale.uasset new file mode 100644 index 00000000..8ec3298a --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/DefaultTexture_Grayscale.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:38667a58fbe4e3cc60052b510919dbe3718bd0b7b57649ca18ff22992eeaffa5 +size 52720 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/DefaultTexture_LinearColor.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/DefaultTexture_LinearColor.uasset new file mode 100644 index 00000000..f8ac6791 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/DefaultTexture_LinearColor.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:792b12936df3abdd485174749a0006de37f088b0c225d02ccca53979940fa32d +size 53544 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Flats/M_shs_flats.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Flats/M_shs_flats.uasset new file mode 100644 index 00000000..a7962b37 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Flats/M_shs_flats.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ffe3be293866e1f99bf6166fdb434afb9b6d85840e7bbe0d1edbca882109e88d +size 125777 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Flats/shs_flats_AO.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Flats/shs_flats_AO.uasset new file mode 100644 index 00000000..ed76f0d1 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Flats/shs_flats_AO.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8beaa83b6615b8b1b7691c7d60703d28911bb84d647d7a2297a4abc980b01b07 +size 1690153 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Flats/shs_flats_Mask.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Flats/shs_flats_Mask.uasset new file mode 100644 index 00000000..a07663bd --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Flats/shs_flats_Mask.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:24fe091b907af065c4a313d466c272c8569f7a5ca5ecdfce5d8cee5257deda6b +size 1796044 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Flats/shs_flats_N.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Flats/shs_flats_N.uasset new file mode 100644 index 00000000..9b43cfe8 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Flats/shs_flats_N.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:99fd299b113cac05eb54b015a84227f20741a13eced84356fe63a045175c5d03 +size 9403818 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Jeans/btm_jeans_nrm_AO.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Jeans/btm_jeans_nrm_AO.uasset new file mode 100644 index 00000000..72306c72 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Jeans/btm_jeans_nrm_AO.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:da241c557c568e35932f4e54ea95cc3560c7ffbd6ec5fa5b165629bb98c98812 +size 1311762 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Jeans/btm_jeans_nrm_D.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Jeans/btm_jeans_nrm_D.uasset new file mode 100644 index 00000000..e86d8a19 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Jeans/btm_jeans_nrm_D.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8795d0d5565572a7964be3e78910369886ea9c6ba8303a5130479257e4e12425 +size 16608933 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Jeans/btm_jeans_nrm_Mask.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Jeans/btm_jeans_nrm_Mask.uasset new file mode 100644 index 00000000..559ad4e9 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Jeans/btm_jeans_nrm_Mask.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:22f251169a925c97aed520f118861e246083c9fd817f6ab8725bd26991e312d6 +size 5667136 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Jeans/btm_jeans_nrm_N.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Jeans/btm_jeans_nrm_N.uasset new file mode 100644 index 00000000..2ce10b29 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Jeans/btm_jeans_nrm_N.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:76e2bb9d5baeec8070ab2aab4a9f633f55fc264a9f50ab0c4fb47805680731a2 +size 5261576 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Jeans/btm_jeans_nrm_fuzz_M.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Jeans/btm_jeans_nrm_fuzz_M.uasset new file mode 100644 index 00000000..14de0896 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Jeans/btm_jeans_nrm_fuzz_M.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0d4243faaf47a7d3e821909cf6d84d495a8b268c7002f5d5a4abf3d6d59fa6ce +size 9428414 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Jeans/btm_jeans_nrm_memory_fold_N.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Jeans/btm_jeans_nrm_memory_fold_N.uasset new file mode 100644 index 00000000..4eb76296 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Jeans/btm_jeans_nrm_memory_fold_N.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:209ab77c98f5bdef5f59bfe02595c8abe84e7616bb10b8a3ed4292d7f420b34f +size 1000696 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Jeans/btm_jeans_nrm_roughness_mask.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Jeans/btm_jeans_nrm_roughness_mask.uasset new file mode 100644 index 00000000..f7e9fd06 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Jeans/btm_jeans_nrm_roughness_mask.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f2f0aabd30198c30a07a235e42454d1c42caf774982f9cdd520d857daa54cb09 +size 1181759 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Jeans_slm/M_btm_jeans_slm_custom.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Jeans_slm/M_btm_jeans_slm_custom.uasset new file mode 100644 index 00000000..de904880 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Jeans_slm/M_btm_jeans_slm_custom.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8611374eea439b3d610a04021a535538ac45c3caf3c366bb9c687d77e02c2d5d +size 115610 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Jeans_slm/btm_jeans_slm_AO_2.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Jeans_slm/btm_jeans_slm_AO_2.uasset new file mode 100644 index 00000000..ff637c07 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Jeans_slm/btm_jeans_slm_AO_2.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6df0812295b2be5a558895ea220740fd9b66be59f229e3e0d17bed161995bc4a +size 1694441 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Jeans_slm/btm_jeans_slm_D.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Jeans_slm/btm_jeans_slm_D.uasset new file mode 100644 index 00000000..f013240d --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Jeans_slm/btm_jeans_slm_D.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5636e12b8d47f62928edf1f0dc9d9696445995ce8023a1bcb44c289205c373c3 +size 9914096 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Jeans_slm/btm_jeans_slm_Mask_02.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Jeans_slm/btm_jeans_slm_Mask_02.uasset new file mode 100644 index 00000000..b2474114 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Jeans_slm/btm_jeans_slm_Mask_02.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f82f6fd99adfe87428756b143f71be1b489341f8619bceb37c45934be3105ce5 +size 5913619 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Jeans_slm/btm_jeans_slm_N.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Jeans_slm/btm_jeans_slm_N.uasset new file mode 100644 index 00000000..924aa605 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Jeans_slm/btm_jeans_slm_N.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7621b8290e06bf49e8a5b839d41f0779bc9bc878cf2c9ac1920ca1fef72bd528 +size 4016634 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/MF_HairAnisotropic.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/MF_HairAnisotropic.uasset new file mode 100644 index 00000000..b0a1da65 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/MF_HairAnisotropic.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c7aa52183b977967fffc6bc87871fd496a15dc4ca6f4876d130b007267ef2352 +size 135209 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/MF_Passthrough.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/MF_Passthrough.uasset new file mode 100644 index 00000000..64b59f86 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/MF_Passthrough.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cecb6156ab4f5a6ec1ed03011ff57dff3cd650ff81e2c91baec4e5e4b732fcd3 +size 82529 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/MF_Variation.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/MF_Variation.uasset new file mode 100644 index 00000000..80acb0e4 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/MF_Variation.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eed98f7282aed36087efb9a7b2f717de3ab108dcbe08df6b7763a81e6a504004 +size 84796 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/MI_Facial_Hair.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/MI_Facial_Hair.uasset new file mode 100644 index 00000000..6c1a5cd1 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/MI_Facial_Hair.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3b05d975b4b1f5555dbb66c4e56adb6e3e61bf4f337b78fcca88dace3adf27a4 +size 74999 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/MI_Hair.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/MI_Hair.uasset new file mode 100644 index 00000000..27fa0af2 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/MI_Hair.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6d66d4002fd8c1a6e2081c7ef5a38372bf0216884db0dfdfd73677bdacf49993 +size 79723 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/MI_Hair_Cards.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/MI_Hair_Cards.uasset new file mode 100644 index 00000000..d09aeb71 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/MI_Hair_Cards.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:942ee7655e03332195e326f38cddbe5028a2046ece6cba6b24600566677039c7 +size 77574 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/MI_Hair_Helmet.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/MI_Hair_Helmet.uasset new file mode 100644 index 00000000..c22e9946 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/MI_Hair_Helmet.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:677fd7b9d81c79ae4d0d90bf86242961fbb765a9a33d2fede58bbdec5b142af4 +size 78078 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/MI_PeachFuzz.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/MI_PeachFuzz.uasset new file mode 100644 index 00000000..4c653e3b --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/MI_PeachFuzz.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7af6ec9fc28a5d457f25e247655690abf839755904c181d7fbe581cafeed2306 +size 82394 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/MPC_HairColor.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/MPC_HairColor.uasset new file mode 100644 index 00000000..75b7a62c --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/MPC_HairColor.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:daab6e2fa993abe268f87deb1bb0fd838e07863e0ba0f1acb6a95bccffebc62b +size 2659 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/M_BodySkin.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/M_BodySkin.uasset new file mode 100644 index 00000000..2d4de61c --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/M_BodySkin.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:51c9f2a61181a9e92af72f7803d438d4f0427ab1af472f4ec6a40851e3fdaf4c +size 147685 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/M_BodySynthesized.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/M_BodySynthesized.uasset new file mode 100644 index 00000000..306bc3b1 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/M_BodySynthesized.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:02bf598eee2173f9119fee41cc4f2db7ee16fdd3cf2d4fcf7684e832758c8885 +size 98843 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/M_EyeLash_HigherLODs_Inst.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/M_EyeLash_HigherLODs_Inst.uasset new file mode 100644 index 00000000..a7d39855 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/M_EyeLash_HigherLODs_Inst.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7784b5e7abde4d0f797b10da761e42e37e34506783322ef4ecbe9b3defd04cd0 +size 96462 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/M_EyelashLowerLODs_Inst.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/M_EyelashLowerLODs_Inst.uasset new file mode 100644 index 00000000..8fb409fd --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/M_EyelashLowerLODs_Inst.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:43870127e789e9d2e343fa76434fe473b9004a4c8ed2cf74a96f35330eb58b3d +size 82961 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/M_Eyelashes_Cards.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/M_Eyelashes_Cards.uasset new file mode 100644 index 00000000..56adbd64 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/M_Eyelashes_Cards.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9219ecf4654839832d76cde6a0210c5c86a98c6377409f9445e8a1b37a92ca1e +size 110536 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/M_Facial_Hair.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/M_Facial_Hair.uasset new file mode 100644 index 00000000..95ecb3d0 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/M_Facial_Hair.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4e480077a736cd73425c72dd076718efa3abc43ae14053251f6abda5c3a64072 +size 157759 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/M_PeachFuzzMaster.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/M_PeachFuzzMaster.uasset new file mode 100644 index 00000000..f784edd4 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/M_PeachFuzzMaster.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d155d8317c32bde763587e328113ea1e693a7e9e9b96d3bfeec869af26814b24 +size 126813 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/M_Teeth.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/M_Teeth.uasset new file mode 100644 index 00000000..fbcb0bbb --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/M_Teeth.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1a5ceb461691d313e0f101b466fa732371fe1898111dbbe6e1852be06ba50a20 +size 165560 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/M_TeethCharacterCreator_Inst.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/M_TeethCharacterCreator_Inst.uasset new file mode 100644 index 00000000..91e1814b --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/M_TeethCharacterCreator_Inst.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1938103657dd92888ec9d8c6834afbd84ad9840eae249767ede8b3297fa5f287 +size 116149 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/M_fabric_simpler.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/M_fabric_simpler.uasset new file mode 100644 index 00000000..b93d218b --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/M_fabric_simpler.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3c689697a1b442bab094bb2196fb1637a870954b946c826e77df78b967185747 +size 332202 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/M_hair_v2.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/M_hair_v2.uasset new file mode 100644 index 00000000..89f4c950 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/M_hair_v2.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:728f1d2c11d6ded225ec9395e475a4b083b903239845ce4f20ed7bb2f3fbbbd4 +size 188097 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/M_jeans_nrm_custom_master.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/M_jeans_nrm_custom_master.uasset new file mode 100644 index 00000000..100f0695 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/M_jeans_nrm_custom_master.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e0b54f7acac9e2cc29282660dbcedcc6d5e296631f25bfe23d81215ff22312ad +size 218814 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/SP_TeethCharacterCreator.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/SP_TeethCharacterCreator.uasset new file mode 100644 index 00000000..95668c79 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/SP_TeethCharacterCreator.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7b18d012ea56106ba17efabab97a6f9dab467cae62d3a15b1f18f451208eef6f +size 3107 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Shirt/Female/M_f_top_shirt.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Shirt/Female/M_f_top_shirt.uasset new file mode 100644 index 00000000..aa30435e --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Shirt/Female/M_f_top_shirt.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:81a78d513897c3ef8692001de6a9b4bf2e57dbc6a8eb56e7b749f29380bf1717 +size 105022 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Shirt/Female/f_top_shirt_AO.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Shirt/Female/f_top_shirt_AO.uasset new file mode 100644 index 00000000..115c6449 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Shirt/Female/f_top_shirt_AO.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d6477401f1497bbf4e7a82ac949aa6da61e15811631fbb511e8804926ff5f8c9 +size 14814541 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Shirt/Female/f_top_shirt_Mask.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Shirt/Female/f_top_shirt_Mask.uasset new file mode 100644 index 00000000..5ae721ac --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Shirt/Female/f_top_shirt_Mask.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:97dd2731b13fb0c412cbc252a750fb079b2141fd8a18ad2aacebb1618d2e2749 +size 3667892 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Shirt/Female/f_top_shirt_N.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Shirt/Female/f_top_shirt_N.uasset new file mode 100644 index 00000000..e23f166a --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Shirt/Female/f_top_shirt_N.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2bab5d7cb4987d22eb7093e4e224a14ab609ce768e9d76326fd961e3b45b90de +size 6489965 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/T_Black_Linear.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/T_Black_Linear.uasset new file mode 100644 index 00000000..764f26ce --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/T_Black_Linear.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eef20c3b2acbc141a5d86407c89a181b7c0b739eff74766cd4551e98b33933d5 +size 3060 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/DefaultMaps/Clothing_Default_Mask.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/DefaultMaps/Clothing_Default_Mask.uasset new file mode 100644 index 00000000..43c666d3 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/DefaultMaps/Clothing_Default_Mask.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5ce44b815b532d7b82748f293940e71da1a5e2bc40d7ccd91592ed0b1167777b +size 100747 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/DefaultMaps/black_masks.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/DefaultMaps/black_masks.uasset new file mode 100644 index 00000000..3b9ec49d --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/DefaultMaps/black_masks.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0a9d98a44a270e6e0d691e0dfd93bd6172b2f286649c69886fcb2bbcdc83762f +size 3203 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/DefaultMaps/color_spectrum.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/DefaultMaps/color_spectrum.uasset new file mode 100644 index 00000000..7a90a321 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/DefaultMaps/color_spectrum.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4b696b032a18df61f0874ee9f3bd28cda598d23320283ba14d259179efed88a5 +size 130170 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Macros/macro_jeans_nrm_tile_overlay_D.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Macros/macro_jeans_nrm_tile_overlay_D.uasset new file mode 100644 index 00000000..62e32c85 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Macros/macro_jeans_nrm_tile_overlay_D.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:441510a1ff1928514b4e2496a385823833c5e4329d8e230700c511ad876f93d8 +size 1285691 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Macros/macro_linen_rbess3s_4K.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Macros/macro_linen_rbess3s_4K.uasset new file mode 100644 index 00000000..50a70f5d --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Macros/macro_linen_rbess3s_4K.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:15e5808f3a3aa212a893b65e7cdf5c757d1f05d4db09a274a9c33a4871035c47 +size 5709535 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Macros/macro_pilling_A.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Macros/macro_pilling_A.uasset new file mode 100644 index 00000000..896afaa6 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Macros/macro_pilling_A.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:369a8eda20c90dff75cd20e8f63608854d5fe046cf7fe9110ca3cefdb154d500 +size 5303009 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Macros/macro_pilling_N.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Macros/macro_pilling_N.uasset new file mode 100644 index 00000000..e993dd71 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Macros/macro_pilling_N.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e8a04fb75e3e8196980d214ac13b8926f145f074b45da996c06e428b2921c305 +size 14683293 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/MaterialFunction/MF_AvgColorReplace.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/MaterialFunction/MF_AvgColorReplace.uasset new file mode 100644 index 00000000..227f5cae --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/MaterialFunction/MF_AvgColorReplace.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:291d9a748a6f1ed1aa65b4a8f1aa720c7c4aebd7382a2a46cbaf9250d6a1dd44 +size 84193 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/MaterialFunction/MF_PowerVariation.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/MaterialFunction/MF_PowerVariation.uasset new file mode 100644 index 00000000..23d941ab --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/MaterialFunction/MF_PowerVariation.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9c42e28114d795457d25779f78f0a6ee5e22b9adcdb066f96930e08ae2b5589e +size 84422 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/MaterialFunction/MatLayerBlend_Aniso.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/MaterialFunction/MatLayerBlend_Aniso.uasset new file mode 100644 index 00000000..3efd1074 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/MaterialFunction/MatLayerBlend_Aniso.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:998a647c74cfbc92cb0be606e88605becbeced8d131e3b279964f5f297470689 +size 93264 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Micros/micro_jeans_tile_M.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Micros/micro_jeans_tile_M.uasset new file mode 100644 index 00000000..9fcdf01b --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Micros/micro_jeans_tile_M.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2ae866ddfcd3f759d8fe3f7c3c3713fa0a52b26d4f0be7adaedea1b36ccb05a5 +size 314358 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Micros/micro_jeans_tile_N.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Micros/micro_jeans_tile_N.uasset new file mode 100644 index 00000000..7887c3a2 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Micros/micro_jeans_tile_N.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b48dbf2583a30d727647f818a9db31370cb737aa6eab3d4333f7e3820f641c0b +size 552470 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Micros/micro_pp_oxford_N.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Micros/micro_pp_oxford_N.uasset new file mode 100644 index 00000000..9e56e93d --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Micros/micro_pp_oxford_N.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f3408ace1166fab6f0a5bb087888848adf8d7dea7e6a6c159f3d9f2a2bb881e8 +size 1485729 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Micros/micro_weave_denim_N.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Micros/micro_weave_denim_N.uasset new file mode 100644 index 00000000..859ccab4 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Micros/micro_weave_denim_N.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bd5b6ff9b7670e02c6d68391591d381a02fa2157878cfc2ea4b1eb1e0faa041e +size 3370355 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Micros/micro_weave_denim_diffuse.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Micros/micro_weave_denim_diffuse.uasset new file mode 100644 index 00000000..e27272cd --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Micros/micro_weave_denim_diffuse.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5a42cf3b29d7f0427cf03a6348a10ec308a43a4f6af2976562cfd9872559f298 +size 492575 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Micros/micro_weave_plain.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Micros/micro_weave_plain.uasset new file mode 100644 index 00000000..c292e891 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Micros/micro_weave_plain.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1dd3aa2885d63df83ace91cf7ccda655c5effe92b65334351ddef5b05e862c95 +size 733339 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Micros/micro_weave_plain_normal.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Micros/micro_weave_plain_normal.uasset new file mode 100644 index 00000000..0ba7f8a5 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Micros/micro_weave_plain_normal.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:91f2993d99aa40f1611b9e4ef7e4c0c58bd7ab9d87cff01df1cb2d68611a0171 +size 4368744 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Wrinkles/crease_a_tileable_N.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Wrinkles/crease_a_tileable_N.uasset new file mode 100644 index 00000000..265f8164 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Wrinkles/crease_a_tileable_N.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:611ae73c1179c9b1a6b59828b5afcd6d1ff8d59e637e4b13c6ff91cd8e7a4b99 +size 1171773 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Wrinkles/memory_wrinkles_normal.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Wrinkles/memory_wrinkles_normal.uasset new file mode 100644 index 00000000..e82ebb1d --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/Wrinkles/memory_wrinkles_normal.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:57ce5cc0b80df08ddcd0d714b9bc59216dfb2be102892e06aba6c25f44a7955a +size 4274864 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/clothing_AO.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/clothing_AO.uasset new file mode 100644 index 00000000..661fd02c --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/clothing_AO.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:92d2795da3a4d3d561ee2c0d5148b804278938c92c2fab1a8cfe943158c67dac +size 58501 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/clothing_N.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/clothing_N.uasset new file mode 100644 index 00000000..dffcdbf7 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/clothing_N.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1f553814421278092fccb2008e02fac4968c5bf40cdaa6d085a918a4326a3976 +size 5117 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/upresTest/MF_NormalStrength.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/upresTest/MF_NormalStrength.uasset new file mode 100644 index 00000000..fd933b80 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/Clothing/upresTest/MF_NormalStrength.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e6383d74191fed9bfd4fe7442c8cbfcfdd6caec008ef37e1c5f5c71d93b0ca5e +size 80419 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Textures/T_SkinMicroNormal.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/T_SkinMicroNormal.uasset new file mode 100644 index 00000000..b8ab503f --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/T_SkinMicroNormal.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a6a11e6b193dd51f8d4080e3cce60428defd167a3dbf4cadc5ba7d04c20c0a72 +size 2680432 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Textures/T_Teeth_mouthOcc.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/T_Teeth_mouthOcc.uasset new file mode 100644 index 00000000..8dcd1da0 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/T_Teeth_mouthOcc.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b08ca2321975fc39ad80a392433f15395069b7f44a5416d7f479d5fddfb5c72f +size 308581 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Textures/TeethGumsNormal.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/TeethGumsNormal.uasset new file mode 100644 index 00000000..de919e1a --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/TeethGumsNormal.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c0861f78e1a7bdc44c050ed20c89f0648fe608631e663e7110afcacc77ea907c +size 40292122 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Textures/TilingNoise05.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/TilingNoise05.uasset new file mode 100644 index 00000000..130b1093 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/TilingNoise05.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7c8cf50624b5d04a7e6f2badeed4b0478535d1c672694b0b6413c249ea569f0b +size 2164561 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Textures/gums_color_picker.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/gums_color_picker.uasset new file mode 100644 index 00000000..1cc08309 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/gums_color_picker.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a1fef2cb0cdd9efdcf27f938a75cc8be6e27026c1a85c0c67921880f03efc231 +size 92094 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Textures/gums_div_001.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/gums_div_001.uasset new file mode 100644 index 00000000..11712a80 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/gums_div_001.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:af894f78d89d76554e6d0c59c0bb0b78e0f0194cf221e5dcf5932a8f94902eb1 +size 331501 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Textures/plaque_color_picker.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/plaque_color_picker.uasset new file mode 100644 index 00000000..d44fb811 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/plaque_color_picker.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:af0a31af0cdc26a0b0186d1819a7a7dc8c1091301c00be673f58c8a64cc0cd96 +size 94371 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Textures/skin_n.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/skin_n.uasset new file mode 100644 index 00000000..a8a4ef42 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/skin_n.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3b11ba41f1002724f44efbe9aa4f43f9ff5ca0037dac5719cbaf7175e3f80761 +size 1766684 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Textures/teeth_color_map_001.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/teeth_color_map_001.uasset new file mode 100644 index 00000000..a20bec8c --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/teeth_color_map_001.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d30bc08c7233c690fb3dc1c9157184af158aa159fc2385b729043381158396dc +size 5285097 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Textures/teeth_color_picker_001.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/teeth_color_picker_001.uasset new file mode 100644 index 00000000..bfb5de2f --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/teeth_color_picker_001.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a931462f26a8601caf070a691bdfd261fce7b028dd01c026efa1a53724e7f19f +size 140593 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Textures/teeth_masks_001.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/teeth_masks_001.uasset new file mode 100644 index 00000000..b35f0fb1 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/teeth_masks_001.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:83df293d41d965d5fc3b70acb067ee736c5458dd7aa221c86bdd47379ac601c5 +size 3028483 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Textures/teeth_normal_map.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/teeth_normal_map.uasset new file mode 100644 index 00000000..be56ef21 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/teeth_normal_map.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:209f0ad309937e1f588fcfb4750aba3aaad7c1305ca33916fcd579690dd3cbe1 +size 3490228 diff --git a/Content/AmazonPollyMetaHuman/Common/Materials/Textures/teeth_sharpNormal_map.uasset b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/teeth_sharpNormal_map.uasset new file mode 100644 index 00000000..ff4160da --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Materials/Textures/teeth_sharpNormal_map.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0fe24fa52f1e1518227e09986a477d3ef04c18d447c159da1dda4105d4f405fa +size 3292411 diff --git a/Content/AmazonPollyMetaHuman/Common/Models/PuffinTexture-8k/chr_0017/head_cavity_map.uasset b/Content/AmazonPollyMetaHuman/Common/Models/PuffinTexture-8k/chr_0017/head_cavity_map.uasset new file mode 100644 index 00000000..3365d7fe --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Models/PuffinTexture-8k/chr_0017/head_cavity_map.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e76ae18fe7e507f06b7b846574eeac625aa7f98f33131b9ac797aebea320cdb8 +size 123508885 diff --git a/Content/AmazonPollyMetaHuman/Common/Models/PuffinTexture-8k/chr_0017/head_normal_map.uasset b/Content/AmazonPollyMetaHuman/Common/Models/PuffinTexture-8k/chr_0017/head_normal_map.uasset new file mode 100644 index 00000000..24bca58c --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Models/PuffinTexture-8k/chr_0017/head_normal_map.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3320e3228c4d36ebc922bce227cdcf2c2a5fb7dd913c6dc010ab46cf2237e0a4 +size 319483847 diff --git a/Content/AmazonPollyMetaHuman/Common/Models/PuffinTexture-8k/chr_0017/head_roughness_map.uasset b/Content/AmazonPollyMetaHuman/Common/Models/PuffinTexture-8k/chr_0017/head_roughness_map.uasset new file mode 100644 index 00000000..9fefa3dd --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Models/PuffinTexture-8k/chr_0017/head_roughness_map.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a207ba8f7147b2332cc055e4b8c154051a1c2b3ea08d834020a13831db9a7428 +size 34779 diff --git a/Content/AmazonPollyMetaHuman/Common/Models/PuffinTexture-8k/chr_0017/head_wm1_normal_map.uasset b/Content/AmazonPollyMetaHuman/Common/Models/PuffinTexture-8k/chr_0017/head_wm1_normal_map.uasset new file mode 100644 index 00000000..7bdcfbd0 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Models/PuffinTexture-8k/chr_0017/head_wm1_normal_map.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2c400086a2cddcd1ce3f7d0714e53e32b1e8a3fa8d4e88e8e8535dd76a20a0f6 +size 318410859 diff --git a/Content/AmazonPollyMetaHuman/Common/Models/PuffinTexture-8k/chr_0017/head_wm2_normal_map.uasset b/Content/AmazonPollyMetaHuman/Common/Models/PuffinTexture-8k/chr_0017/head_wm2_normal_map.uasset new file mode 100644 index 00000000..1a65d206 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Models/PuffinTexture-8k/chr_0017/head_wm2_normal_map.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bae70b24887212d1ca68232d0f5dd9685e4d67a3583ca2e976e7b51179449435 +size 315579038 diff --git a/Content/AmazonPollyMetaHuman/Common/Models/PuffinTexture-8k/chr_0017/head_wm3_normal_map.uasset b/Content/AmazonPollyMetaHuman/Common/Models/PuffinTexture-8k/chr_0017/head_wm3_normal_map.uasset new file mode 100644 index 00000000..799ae02d --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Models/PuffinTexture-8k/chr_0017/head_wm3_normal_map.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:841d64a6c3aa099a35689f022f02ca493d8342b1b277c95d7629825e83b36522 +size 317182265 diff --git a/Content/AmazonPollyMetaHuman/Common/Textures/DefaultTexture_VT.uasset b/Content/AmazonPollyMetaHuman/Common/Textures/DefaultTexture_VT.uasset new file mode 100644 index 00000000..c5b7153a --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Common/Textures/DefaultTexture_VT.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fe760cf58133a7aa20a596f8ddc48badf56e93843e98c5cf9bb2e12c6ee7daae +size 55687 diff --git a/Content/AmazonPollyMetaHuman/Scene/BP_UIWidget.uasset b/Content/AmazonPollyMetaHuman/Scene/BP_UIWidget.uasset new file mode 100644 index 00000000..798d0163 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Scene/BP_UIWidget.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cb8c5a3c9315972e216bc93103f1ad40b190d0da922e5fc5516c595c108d6249 +size 66305 diff --git a/Content/AmazonPollyMetaHuman/Scene/CameraSequence.uasset b/Content/AmazonPollyMetaHuman/Scene/CameraSequence.uasset new file mode 100644 index 00000000..ca4ccc6b --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Scene/CameraSequence.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3e8bc701c2df7258f7b1164c73a91f79eab840f813e880771f72e96fc03f8424 +size 24910 diff --git a/Content/AmazonPollyMetaHuman/Scene/MetaHumanScene.umap b/Content/AmazonPollyMetaHuman/Scene/MetaHumanScene.umap new file mode 100644 index 00000000..5f8a6232 --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Scene/MetaHumanScene.umap @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c4714f3f5cc42e8d64a4426739b96a5f19e94cd48af98f30fb055d57b621d136 +size 143263 diff --git a/Content/AmazonPollyMetaHuman/Scene/MetaHumanScene_BuiltData.uasset b/Content/AmazonPollyMetaHuman/Scene/MetaHumanScene_BuiltData.uasset new file mode 100644 index 00000000..60b7e46c --- /dev/null +++ b/Content/AmazonPollyMetaHuman/Scene/MetaHumanScene_BuiltData.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c6d4751ae8790b61c7bfe4930f47e245941b53a7ff46c8e9aaafc7d5c449745c +size 22777 diff --git a/Documentation/DeveloperGuide.md b/Documentation/DeveloperGuide.md new file mode 100644 index 00000000..a850c922 --- /dev/null +++ b/Documentation/DeveloperGuide.md @@ -0,0 +1,155 @@ +# Developer Guide + +This guide will walk you through everything you need to know about how this project is implemented and how to customize it for your own use. + +**Contents** + +- [How It Works](#how-it-works) +- [Project Architecture](#project-architecture) +- [Adding New MetaHumans](#adding-new-metahumans) +- [Readying for Production](#readying-for-production) + + + +## How It Works + +Amazon Polly provides two important capabilities that make this project work. First, Polly can turn text into natural sounding speech delivered as an audio file. Second, Polly can generate a JSON-formatted list of mouth shapes corresponding to the sounds in that audio file. These mouth shapes are called "visemes". Here are what the visemes for the word "human" look like... + +``` +{"time":6,"type":"viseme","value":"k"} +{"time":108,"type":"viseme","value":"i"} +{"time":166,"type":"viseme","value":"u"} +{"time":207,"type":"viseme","value":"p"} +{"time":287,"type":"viseme","value":"@"} +{"time":351,"type":"viseme","value":"t"} +{"time":500,"type":"viseme","value":"sil"} +``` + +Because this viseme data includes timestamps for each mouth shape, we can use that information to achieve believable lip sync between the audio playback and MetaHuman facial animations. + +This UE4 project includes a hand-crafted set of animation assets representing each of the possible visemes. It also includes an Animation Blueprint that automatically blends between these viseme animations as audio playback progresses, making it easy to add Polly speech animation to any MetaHuman character. + +Let's dive deeper into the architecture of this project. + + + +## Project Architecture + +The project's implementation includes four key elements: + +- A new Actor Component called "**Speech**" +- Logic added to the main MetaHuman Blueprint, utilizing the **Speech** component +- An Animation Blueprint called "**Speech_Anim_BP**" +- A pre-compiled version of the **Amazon Polly C++ SDK** + +Let's look at each in detail. + + + +### Speech Actor Component + +The **Speech** component exposes a simple, Blueprint-friendly API for interacting with Amazon Polly. It also manages the state of the speech as it plays back. This component can be added to any MetaHuman Blueprint. + +The methods that the **Speech** component exposes to Blueprint are: + +***GenerateSpeech()*** - An asynchronous function that takes a string and a Polly voice ID as input and generates both the audio and the viseme data for the resulting speech. + +***StartSpeech()*** - Starts playback of the previously generated speech. This function immediately returns the speech's audio as a **USoundWaveProcedural** object. Note, this method should only be called after *GenerateSpeech()* has completed. + +***IsSpeaking()*** - Returns a boolean value indicating whether a speech is currently playing. + +***GetCurrentViseme()*** - Returns the currently active viseme during speech playback. This value is used to drive the Animation Blueprint (discussed later). + +To see the **Speech** component in use, open the **/Content/AmazonPollyMetaHuman/Ada/BP_Ada** Blueprint. The **Speech** component will be listed in the Components panel. + +Speech component in Components panel + + + +> ✏️ **Note:** The Speech component is implemented as a C++ class, `USpeechComponent`. The relevant files are [SpeechComponent.h](../Source/AmazonPollyMetaHuman/Public/SpeechComponent.h) and [SpeechComponent.cpp](../Source/AmazonPollyMetaHuman/Private/SpeechComponent.cpp). + + + +### MetaHuman Blueprint Logic + +Open the **BP_Ada** asset (/Content/AmazonPollyMetaHuman/Ada/BP_Ada) to see the custom logic that has been added to this MetaHuman Blueprint. The **Speech** component's functions are called to generate the speech and then start speech playback, including playing the speech audio using the standard ***Play Sound 2D*** function. + +!["Speak Event" Blueprint graph](media/MH-Blueprint-SpeakEvent.png) + + + +### Animation Blueprint + +The **Speech_Anim_BP** Animation Blueprint is responsible for monitoring the state of the **Speech** component and updating the MetaHuman's facial animation to match. Open the **/Content/AmazonPollyMetaHuman/Animation/Speech_Anim_BP** asset to explore further. + +On the left side of the Animation Blueprint Editor you can see that this Blueprint defines a **"Viseme"** variable. + +Viseme variable + +The **Speech_Anim_BP** keeps this variable constantly up-to-date to reflect the state of the **Speech** component. It does this by calling the ***GetCurrentViseme()*** method on the **Speech** component as shown below (viewing the Event Graph tab). + +![Speech_Anim_BP event graph](media/MH-AnimBP-EventGraph.png) + +If you switch to the AnimGraph tab you will see that we're using that **"Viseme"** variable to drive a **Blend Pose** node. It is this node that determines which one of the possible viseme animation assets will be applied to the MetaHuman's face. + +![Speech_Anim_BP Anim Graph](media/MH-AnimBP-AnimGraph.png) + + + +### Amazon Polly C++ SDK + +The `USpeechComponent` class communicates with the Amazon Polly service using the C++ Polly API. This API is part of the [AWS SDK for C++](https://aws.amazon.com/sdk-for-cpp/). You compiled the C++ Poly API as part of the Quick Start. The compiled files can be found at /Source/AmazonPollyMetaHuman/ThirdParty/AwsSdk/. + + + +## Adding New MetaHumans + +This project includes a sample MetaHuman, Ada, but it's easy to modify the project to use your own custom MetaHumans. + +### 1. Create and import a new MetaHuman + +Use Epic's [MetaHuman Creator](https://www.unrealengine.com/en-US/metahuman-creator) to create your MetaHuman. Then, use Quixel [Bridge](https://quixel.com/bridge) to import your new MetaHuman into this project. See the [MetaHuman Creator documentation](https://docs.metahuman.unrealengine.com/en-US/) or official tutorial videos (at the bottom of [this page](https://www.unrealengine.com/en-US/metahuman-creator)) if you need help with these steps. + +### 2. Assign the "Speech_AnimBP" to your MetaHuman + +Open the Blueprint of your MetaHuman. Example: **/Content/MetaHumans/Koda/BP_Koda** + +In the Components tab, select the **Face** component. Then, in the Details panel, scroll to the "Animation" section, and set the ***Anim Class*** property to "Speech_AnimBP_C". + +![Assign the animation Blueprint](media/MH-assign-speech-anim-BP.png) + +### 3. Add speech logic to your MetaHuman + +With the MetaHuman Blueprint still open for editing, in the Components tab, add a **Speech** component. + +Add Speech component + +Select the Event Graph tab if it isn't already displayed. + +We want to trigger some new logic from the BeginPlay event, but we also want to retain the logic that is already connected to that event. To do this, insert a **Sequence** node... + +Insert Sequence node + +Add a **Speech** component reference to the Blueprint by drag-dropping the **Speech** component from the Components tab to the Event Graph tab. Then, create the logic graph shown below. Alternatively, you can copy the text from [this file](code/metahuman-blueprint-nodes.txt) and paste it directly into the Blueprint window to automatically recreate these nodes. + +![Blueprint logic nodes](media/MH-Blueprint-changes-2.png) + +On the **Generate Speech** node, fill in the ***Text*** parameter with the text you would like your MetaHuman to speak. Set ***Voice Id*** to the Polly voice you would like your MetaHuman to use. + +Generate Speech node inputs + +Congratulations! Your MetaHuman is now ready to use. Just add it to a map and start playback. + +### 4. (Optional) Add body animation + +Your MetaHuman will look pretty stiff and unnatural at this point. You can greatly improve the realism by adding an idle animation to the MetaHuman's body. In the Components tab, select the **Body** component. Then, in the Details panel, scroll to the "Animation" section. Ensure that the ***Animation Mode*** is set to "Use Animation Asset" and set the ***Anim to Play*** property to "BodyIdle". + +![Add body idle animation](media/MH-body-anim.png) + + + +## Readying for Production + +Before you can package a build of this project for distribution to your end users you will need to implement your own solution for managing AWS service credentials and service access. The way service access is implemented in this sample project was intentionally kept simple to make it as easy as possible for you to get started. However, since the implementation relies on each user having their own AWS account credentials and having installed and configured the AWS CLI, it is not a practical approach for use in production. + +Each project has different requirements for authentication and access control. Your team is best equipped to design and implement a solution that fits your application's specific needs. You may want to consider using Amazon Cognito as part of your solution. Amazon Cognito is often used to deliver temporary, limited-privilege credentials to native applications including games and other native apps. A good place to learn more is the ["Getting Credentials"](https://docs.aws.amazon.com/cognito/latest/developerguide/getting-credentials.html) section of the Amazon Cognito documentation. diff --git a/Documentation/code/metahuman-blueprint-nodes.txt b/Documentation/code/metahuman-blueprint-nodes.txt new file mode 100644 index 00000000..ff1bf0c9 --- /dev/null +++ b/Documentation/code/metahuman-blueprint-nodes.txt @@ -0,0 +1,66 @@ +Begin Object Class=/Script/BlueprintGraph.K2Node_VariableGet Name="K2Node_VariableGet_11" + VariableReference=(MemberName="Speech",bSelfContext=True) + NodePosX=224 + NodePosY=272 + NodeGuid=13A1762749384526D8C5039532660A43 + CustomProperties Pin (PinId=6072D3384A874842EA341A8B350A5A54,PinName="Speech",Direction="EGPD_Output",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/AmazonPolly.SpeechComponent"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,LinkedTo=(K2Node_CallFunction_39 83E23A6349D3A4DBD894CF9C8A676F20,K2Node_Knot_23 56FB5146420588C59F2923A04C7DBD8A,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + CustomProperties Pin (PinId=431C900643F0C73E2FA03BB46673EE19,PinName="self",PinFriendlyName=NSLOCTEXT("K2Node", "Target", "Target"),PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=BlueprintGeneratedClass'"/Game/MetaHumans/Koda/BP_Koda.BP_Koda_C"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PersistentGuid=00000000000000000000000000000000,bHidden=True,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) +End Object +Begin Object Class=/Script/BlueprintGraph.K2Node_CallFunction Name="K2Node_CallFunction_39" + bWantsEnumToExecExpansion=True + FunctionReference=(MemberParent=Class'"/Script/AmazonPolly.SpeechComponent"',MemberName="GenerateSpeech") + NodePosX=432 + NodePosY=208 + NodeGuid=69EE052144F8231B931F0799F6A63E5D + CustomProperties Pin (PinId=9B37684D4D1ECFFE8563FBB56A3DDE6A,PinName="Success",PinToolTip="Success\nExec",Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=True,LinkedTo=(K2Node_CallFunction_40 208DAD804580EC8E694B2DA3B47C073A,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + CustomProperties Pin (PinId=2C6E358B42ED1EBA30B5248FFF01588B,PinName="Failure",PinToolTip="Failure\nExec",Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=True,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + CustomProperties Pin (PinId=F1876EDB4582454DB7187582EB66C5F0,PinName="execute",PinToolTip="\nExec",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,LinkedTo=(K2Node_ExecutionSequence_0 39891AA24C8F0950C6579197E9E349C5,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + CustomProperties Pin (PinId=83E23A6349D3A4DBD894CF9C8A676F20,PinName="self",PinFriendlyName=NSLOCTEXT("K2Node", "Target", "Target"),PinToolTip="Target\nSpeech Component Object Reference",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/AmazonPolly.SpeechComponent"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=True,LinkedTo=(K2Node_VariableGet_11 6072D3384A874842EA341A8B350A5A54,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + CustomProperties Pin (PinId=9B612039469988FCCD40A78978F7FC26,PinName="WorldContextObject",PinToolTip="World Context Object\nObject Reference\n\ndescription",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/CoreUObject.Object"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PersistentGuid=00000000000000000000000000000000,bHidden=True,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + CustomProperties Pin (PinId=7AF179F34011A89DF1DB7C9F82013A3F,PinName="Text",PinToolTip="Text\nString\n\nthe text to be synthesized by Polly (the maximum length of input text can be up to 3000 characters)",PinType.PinCategory="string",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=True,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + CustomProperties Pin (PinId=43F5E501492ECA31C57508B172277C41,PinName="VoiceId",PinToolTip="Voice Id\nEVoiceId Enum\n\nenum for VoiceId for use in calling Polly",PinType.PinCategory="byte",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Enum'"/Script/AmazonPolly.EVoiceId"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=True,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,DefaultValue="Nicole",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + CustomProperties Pin (PinId=7A89472241BAD992A2B404A7255D034E,PinName="LatentInfo",PinToolTip="Latent Info\nLatent Action Info Structure\n\ndescription",PinType.PinCategory="struct",PinType.PinSubCategory="",PinType.PinSubCategoryObject=ScriptStruct'"/Script/Engine.LatentActionInfo"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,DefaultValue="(Linkage=-1,UUID=-1,ExecutionFunction=\"\",CallbackTarget=None)",AutogeneratedDefaultValue="LatentInfo",PersistentGuid=00000000000000000000000000000000,bHidden=True,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + CustomProperties Pin (PinId=34C8513D434386C30CF169AF636B7B3C,PinName="EGenerateSpeechExecPins",PinToolTip="EGenerate Speech Exec Pins\nEGenerateSpeechExecPins Enum",Direction="EGPD_Output",PinType.PinCategory="byte",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Enum'"/Script/AmazonPolly.EGenerateSpeechExecPins"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,DefaultValue="Success",PersistentGuid=00000000000000000000000000000000,bHidden=True,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) +End Object +Begin Object Class=/Script/BlueprintGraph.K2Node_CallFunction Name="K2Node_CallFunction_40" + FunctionReference=(MemberParent=Class'"/Script/AmazonPolly.SpeechComponent"',MemberName="StartSpeech") + NodePosX=800 + NodePosY=208 + NodeGuid=DEC51C2C4E9D52B8C92A7A923AF747D8 + CustomProperties Pin (PinId=208DAD804580EC8E694B2DA3B47C073A,PinName="execute",PinToolTip="\nExec",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=True,LinkedTo=(K2Node_CallFunction_39 9B37684D4D1ECFFE8563FBB56A3DDE6A,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + CustomProperties Pin (PinId=ECF73A6B444366EFDC5AC8BABCE34CB0,PinName="then",PinToolTip="\nExec",Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=True,LinkedTo=(K2Node_CallFunction_41 A23BF4A84FC93DF787937DA2CDB2E0E9,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + CustomProperties Pin (PinId=9FA3CD484795C998EAC127AB1FA98824,PinName="self",PinFriendlyName=NSLOCTEXT("K2Node", "Target", "Target"),PinToolTip="Target\nSpeech Component Object Reference",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/AmazonPolly.SpeechComponent"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,LinkedTo=(K2Node_Knot_22 2B5195CD402EF86E2A6DB09214C7133C,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + CustomProperties Pin (PinId=86127F37490330EDC9184E9B4DDF11AD,PinName="ReturnValue",PinToolTip="Return Value\nSound Wave Procedural Object Reference\n\nA USoundWaveProcedural object containing the audio synthesized from Polly",Direction="EGPD_Output",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/Engine.SoundWaveProcedural"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) +End Object +Begin Object Class=/Script/BlueprintGraph.K2Node_CallFunction Name="K2Node_CallFunction_41" + FunctionReference=(MemberParent=Class'"/Script/Engine.GameplayStatics"',MemberName="PlaySound2D") + NodePosX=1088 + NodePosY=224 + AdvancedPinDisplay=Hidden + NodeGuid=8B9CC62C4C7ECDEC73E6AB9D9556FFF6 + CustomProperties Pin (PinId=A23BF4A84FC93DF787937DA2CDB2E0E9,PinName="execute",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=True,LinkedTo=(K2Node_CallFunction_40 ECF73A6B444366EFDC5AC8BABCE34CB0,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + CustomProperties Pin (PinId=DF1D02464B90D5A07DE7759657CCBE3C,PinName="then",Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=True,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + CustomProperties Pin (PinId=E5BB79854BBE59A122DA23AEC9D1127B,PinName="self",PinFriendlyName=NSLOCTEXT("K2Node", "Target", "Target"),PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/Engine.GameplayStatics"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,DefaultObject="/Script/Engine.Default__GameplayStatics",PersistentGuid=00000000000000000000000000000000,bHidden=True,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + CustomProperties Pin (PinId=2C6545FF4750642422138FA2CE7E2834,PinName="WorldContextObject",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/CoreUObject.Object"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=True,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PersistentGuid=00000000000000000000000000000000,bHidden=True,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + CustomProperties Pin (PinId=0EB414E9437F1ECB8F1B778D3F9E7335,PinName="Sound",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/Engine.SoundBase"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + CustomProperties Pin (PinId=F1611900438FE28A7BC698B4FC60C8D9,PinName="VolumeMultiplier",PinType.PinCategory="float",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,DefaultValue="1.000000",AutogeneratedDefaultValue="1.000000",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=True,bOrphanedPin=False,) + CustomProperties Pin (PinId=584FE92D4AF6165C7665FE8F8ED64534,PinName="PitchMultiplier",PinType.PinCategory="float",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,DefaultValue="1.000000",AutogeneratedDefaultValue="1.000000",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=True,bOrphanedPin=False,) + CustomProperties Pin (PinId=6DEF1B6C4417ED1033D15AB07310A569,PinName="StartTime",PinType.PinCategory="float",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,DefaultValue="0.000000",AutogeneratedDefaultValue="0.000000",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=True,bOrphanedPin=False,) + CustomProperties Pin (PinId=20FEFE4A4652674B4A85F8997E5C3FBE,PinName="ConcurrencySettings",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/Engine.SoundConcurrency"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,AutogeneratedDefaultValue="None",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=True,bOrphanedPin=False,) + CustomProperties Pin (PinId=44D46D704528EF96CD6ACFA21831E7D1,PinName="OwningActor",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/Engine.Actor"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,AutogeneratedDefaultValue="None",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=True,bOrphanedPin=False,) + CustomProperties Pin (PinId=81DD7498497BAF8DB4C90E8527534757,PinName="bIsUISound",PinType.PinCategory="bool",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,DefaultValue="true",AutogeneratedDefaultValue="true",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=True,bOrphanedPin=False,) +End Object +Begin Object Class=/Script/BlueprintGraph.K2Node_Knot Name="K2Node_Knot_22" + NodePosX=720 + NodePosY=432 + NodeGuid=E9F5AC904CEC22A180736887D73A1B96 + CustomProperties Pin (PinId=14FD45204F8B8DD446CCA99212E3A0B2,PinName="InputPin",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/AmazonPolly.SpeechComponent"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,LinkedTo=(K2Node_Knot_23 CAABD34540170A89458A0496868F3635,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=True,bAdvancedView=False,bOrphanedPin=False,) + CustomProperties Pin (PinId=2B5195CD402EF86E2A6DB09214C7133C,PinName="OutputPin",Direction="EGPD_Output",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/AmazonPolly.SpeechComponent"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,LinkedTo=(K2Node_CallFunction_40 9FA3CD484795C998EAC127AB1FA98824,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) +End Object +Begin Object Class=/Script/BlueprintGraph.K2Node_Knot Name="K2Node_Knot_23" + NodePosX=400 + NodePosY=432 + NodeGuid=3ED851064442B0DAD7937CA29F055870 + CustomProperties Pin (PinId=56FB5146420588C59F2923A04C7DBD8A,PinName="InputPin",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/AmazonPolly.SpeechComponent"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,LinkedTo=(K2Node_VariableGet_11 6072D3384A874842EA341A8B350A5A54,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=True,bAdvancedView=False,bOrphanedPin=False,) + CustomProperties Pin (PinId=CAABD34540170A89458A0496868F3635,PinName="OutputPin",Direction="EGPD_Output",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/AmazonPolly.SpeechComponent"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,LinkedTo=(K2Node_Knot_22 14FD45204F8B8DD446CCA99212E3A0B2,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) +End Object diff --git a/Documentation/media/MH-AnimBP-AnimGraph.png b/Documentation/media/MH-AnimBP-AnimGraph.png new file mode 100644 index 00000000..7de6f264 --- /dev/null +++ b/Documentation/media/MH-AnimBP-AnimGraph.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:868028963b924152fe8902de4d2fbf6ab4cda3bb4a36a3850c48f7ca49f71017 +size 668419 diff --git a/Documentation/media/MH-AnimBP-EventGraph.png b/Documentation/media/MH-AnimBP-EventGraph.png new file mode 100644 index 00000000..b565beb2 --- /dev/null +++ b/Documentation/media/MH-AnimBP-EventGraph.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9266e89a8b9321f04acd81d5781c2384c50225c3dd8daaa95d910bd59ceb4a65 +size 465800 diff --git a/Documentation/media/MH-AnimBP-VisemeVar.png b/Documentation/media/MH-AnimBP-VisemeVar.png new file mode 100644 index 00000000..f88dfb55 --- /dev/null +++ b/Documentation/media/MH-AnimBP-VisemeVar.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:22bba46d80447145e3eb28401372e2b7e84e11ef040d3b97edd5cc0a9df6654d +size 232443 diff --git a/Documentation/media/MH-Blueprint-SpeakEvent.png b/Documentation/media/MH-Blueprint-SpeakEvent.png new file mode 100644 index 00000000..ba3397d1 --- /dev/null +++ b/Documentation/media/MH-Blueprint-SpeakEvent.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:88fbfd440170091e560cc85682e3310e3935443dab977ef7f34f9386ebaf3747 +size 183540 diff --git a/Documentation/media/MH-Blueprint-changes-1.png b/Documentation/media/MH-Blueprint-changes-1.png new file mode 100644 index 00000000..4df69699 --- /dev/null +++ b/Documentation/media/MH-Blueprint-changes-1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:751a276c06d67a2f5db45f40e1579babef61a9b363f8f250a7bb6a4e707cf934 +size 231316 diff --git a/Documentation/media/MH-Blueprint-changes-2.png b/Documentation/media/MH-Blueprint-changes-2.png new file mode 100644 index 00000000..dd49d4e3 --- /dev/null +++ b/Documentation/media/MH-Blueprint-changes-2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bc3692bda03f34376156847a39571d67979ed1f03b9b31d9c508728624ea95d5 +size 191366 diff --git a/Documentation/media/MH-Blueprint-changes-2.psd b/Documentation/media/MH-Blueprint-changes-2.psd new file mode 100644 index 00000000..53002260 --- /dev/null +++ b/Documentation/media/MH-Blueprint-changes-2.psd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cdbcdb8883b416f543dc304a73b1b06b3642ddb6f4cd650d8aa934db558f131a +size 4371329 diff --git a/Documentation/media/MH-Blueprint-changes-3.png b/Documentation/media/MH-Blueprint-changes-3.png new file mode 100644 index 00000000..f85782c1 --- /dev/null +++ b/Documentation/media/MH-Blueprint-changes-3.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c1f1df789ed6108fbf2d631b770fa540449ba54253376bc337bc7c8c409437da +size 80324 diff --git a/Documentation/media/MH-Blueprint-changes-3.psd b/Documentation/media/MH-Blueprint-changes-3.psd new file mode 100644 index 00000000..506df3af --- /dev/null +++ b/Documentation/media/MH-Blueprint-changes-3.psd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:83fa37b142ff49cb2c7bb13565dfaf68d92adbf801323494a64987559eff9f05 +size 1199205 diff --git a/Documentation/media/MH-Speech-BP-functions.png b/Documentation/media/MH-Speech-BP-functions.png new file mode 100644 index 00000000..78c11a7b --- /dev/null +++ b/Documentation/media/MH-Speech-BP-functions.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:33dcee556533aa4d496beab9ca906df20c14b4bd79fb7fb47221e04a3c4f0562 +size 106848 diff --git a/Documentation/media/MH-Speech-Components-panel.png b/Documentation/media/MH-Speech-Components-panel.png new file mode 100644 index 00000000..24657f04 --- /dev/null +++ b/Documentation/media/MH-Speech-Components-panel.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c6c8da5c936dfed3ee298f10d3dabf1ee9b849a9620fc2ed3f3d40605e9cf095 +size 59157 diff --git a/Documentation/media/MH-Speech-Components-panel.psd b/Documentation/media/MH-Speech-Components-panel.psd new file mode 100644 index 00000000..da025231 --- /dev/null +++ b/Documentation/media/MH-Speech-Components-panel.psd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:82e3bf94ec98b69835a359f506ba1f58b84970b247341fe4f54ad121103b8eec +size 779830 diff --git a/Documentation/media/MH-add-speech-comp.png b/Documentation/media/MH-add-speech-comp.png new file mode 100644 index 00000000..493c2f59 --- /dev/null +++ b/Documentation/media/MH-add-speech-comp.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ae46dbe8dc8db672c5d7fb059d6d0e942434164867c53d3b81533a03262db8ac +size 158034 diff --git a/Documentation/media/MH-add-speech-comp.psd b/Documentation/media/MH-add-speech-comp.psd new file mode 100644 index 00000000..5e97d886 --- /dev/null +++ b/Documentation/media/MH-add-speech-comp.psd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6c793630eaff0a4e8242453fb4eda7140244c213e3cb7d0855fd24b0cafeb555 +size 2226750 diff --git a/Documentation/media/MH-assign-speech-anim-BP.png b/Documentation/media/MH-assign-speech-anim-BP.png new file mode 100644 index 00000000..a82c62ec --- /dev/null +++ b/Documentation/media/MH-assign-speech-anim-BP.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:161c30dbe45e5c4dc68f63acd8d15ea0e25e4519bd90c2ba7cab51447e2d778a +size 84874 diff --git a/Documentation/media/MH-assign-speech-anim-BP.psd b/Documentation/media/MH-assign-speech-anim-BP.psd new file mode 100644 index 00000000..2f4ce174 --- /dev/null +++ b/Documentation/media/MH-assign-speech-anim-BP.psd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca86659b461b338ab434c00131e7fe8b6fd27eef24407bb8ed1fe1f09662cff6 +size 1290564 diff --git a/Documentation/media/MH-body-anim.png b/Documentation/media/MH-body-anim.png new file mode 100644 index 00000000..a25980a9 --- /dev/null +++ b/Documentation/media/MH-body-anim.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5b8c5b6f47f78cf5199c2205c643e656897625d9e671018d2ce66d947cbf082b +size 255253 diff --git a/Documentation/media/MH-body-anim.psd b/Documentation/media/MH-body-anim.psd new file mode 100644 index 00000000..e36d10d7 --- /dev/null +++ b/Documentation/media/MH-body-anim.psd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ab83ae90f5bafe36c6982d4a7ab6b61f084277ac6b169580b6dc71c92ea5ac9d +size 2203787 diff --git a/Documentation/media/MetaHumanDemo.mov b/Documentation/media/MetaHumanDemo.mov new file mode 100644 index 00000000..090428c3 --- /dev/null +++ b/Documentation/media/MetaHumanDemo.mov @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f016dac25512f8ab382fa162738927c03327055ff017bdcde9760099ad18207c +size 62837555 diff --git a/Documentation/media/UE4-toolbar-play.png b/Documentation/media/UE4-toolbar-play.png new file mode 100644 index 00000000..7f36f0a4 --- /dev/null +++ b/Documentation/media/UE4-toolbar-play.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:db1207faf9245db7eacc41a0cec4e7a7d2bcdc80595ff2a94cad6b5e2300079f +size 67575 diff --git a/Documentation/media/UE4-toolbar.psd b/Documentation/media/UE4-toolbar.psd new file mode 100644 index 00000000..1dff04b9 --- /dev/null +++ b/Documentation/media/UE4-toolbar.psd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d2103e3f5d886bd4cc08cf1afbecc1325775ddce2b25a66b56e9c0b2e22532ea +size 394277 diff --git a/Documentation/media/compiling-shaders.png b/Documentation/media/compiling-shaders.png new file mode 100644 index 00000000..80c5bd8b --- /dev/null +++ b/Documentation/media/compiling-shaders.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:425b971e979c7438710231a7fd09e5443d44c8833be3ae9628264f8a14d94d37 +size 24178 diff --git a/Documentation/media/module-compile-prompt.png b/Documentation/media/module-compile-prompt.png new file mode 100644 index 00000000..3b246a42 --- /dev/null +++ b/Documentation/media/module-compile-prompt.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:66fd89aad4aee7d0bfc1f7dbfe57b2a01b6c11eefab924aea8e89605edb926fd +size 47815 diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..de5a586a --- /dev/null +++ b/LICENSE @@ -0,0 +1,14 @@ +Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, +merge, publish, distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 00000000..d7718f42 --- /dev/null +++ b/README.md @@ -0,0 +1,115 @@ +# Amazon Polly & MetaHumans Sample Project + +*A sample project combining Epic Games' MetaHuman digital characters with Amazon Polly text-to-speech.* + +This Unreal Engine sample project demonstrates how to bring Epic Games' [MetaHuman digital characters](https://www.unrealengine.com/en-US/digital-humans) to life using the Amazon Polly text-to-speech service from AWS. Use this project as a starting point for creating your own Unreal Engine applications that leverage Amazon Polly to give voice to your MetaHumans using one of 16 different English language voices spanning 5 dialects. Or extend this project to use any of Polly's 60+ voices covering 20+ languages and 13+ dialects. + + +https://user-images.githubusercontent.com/90341805/138525827-1354ab8b-2920-4317-a1f8-4cef5eff1024.mov + + +With Amazon Polly, you only pay for what you use. You are charged based on the number of characters of text that you convert either to speech audio or to speech metadata. In addition, you can cache and replay Amazon Polly’s generated speech at no additional cost. For full pricing details, see [Amazon Polly Pricing](https://aws.amazon.com/polly/pricing/). + +**Contents** + +- [Quick Start](#quick-start) +- [Developer Guide](#developer-guide) +- [Getting Help](#getting-help) +- [Security](#security) +- [License](#license) + + + + +## Quick Start + + + +> 🛑 Before proceeding you must have Unreal Engine 4.26 or later installed as well as the Microsoft Visual Studio development tools required for UE4 C++ development (Windows) or the Xcode development tools (Mac). If you need help with these setup steps, refer to the Unreal Engine 4 documentation, especially ["Setting Up Visual Studio for Unreal Engine"](https://docs.unrealengine.com/4.26/en-US/ProductionPipelines/DevelopmentSetup/VisualStudioSetup/). + + + +### 1. Create AWS credentials for the project + +In order for this Unreal Engine project to interact with the Amazon Polly service, you must provide it with AWS credentials that allow access to that service. The easiest way to generate these credentials is to create a new AWS Identity Access & Management (IAM) user in your AWS account. + +Create a new IAM user and assign to it the permissions policy named *"AmazonPollyReadOnlyAccess"*. Although the name you give this user is not important, we suggest naming it "MetaHumans Sample" or something equally distinctive. Be sure to save the **Access Key ID** and the **Secret Access Key** that are generated during the user creation process. You'll need them later. + +> 💡 **Tip:** For more help, see ["Creating an IAM user in your AWS account"](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html) in the AWS IAM documentation. + + + +### 2. Install and configure the AWS Command Line Interface + +You will need to configure your local computer to communicate with AWS services using the credentials you created above. The easiest way to do this is to install and configure the AWS Command Line Interface (AWS CLI). + +Install the AWS CLI to your local computer following [these instructions](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html). + +Use the `aws configure` command to create a default profile for the AWS CLI. Be sure to use the **Access Key ID** and **Secret Access Key** values you saved above. + +> 💡 **Tip:** For more help, see ["Configuration basics"](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html) in the AWS CLI documentation. + + + +### 3. Compile the Polly C++ SDK + +> 🛑 This next step requires cmake. If you don't already have cmake installed, you can [download it here](https://cmake.org/download/). After you download cmake, launch cmake and click 'Tools' -> 'How To Install For Command Line Use' and follow one of the instructions. E.g. for Mac - One may add CMake to the PATH: PATH="/Applications/CMake.app/Contents/bin":"$PATH" + +This project makes use of the C++ Polly API – a part of the AWS SDK for C++ – to communicate with the Polly service. We've provided scripts to automatically download and compile the appropriate binaries for you. Run one of the following scripts: + +**Windows:** [Source/AmazonPollyMetaHuman/ThirdParty/AwsSdk/BuildAwsSdkWin64.bat](Source/AmazonPollyMetaHuman/ThirdParty/AwsSdk/BuildAwsSdkWin64.bat) + +**Mac:** [Source/AmazonPollyMetaHuman/ThirdParty/AwsSdk/BuildAwsSdkMac.sh](Source/AmazonPollyMetaHuman/ThirdParty/AwsSdk/BuildAwsSdkMac.sh) + + + +### 4. Open the Unreal Engine project + +Open the project by double-clicking on the *AmazonPollyMetaHuman.uproject* file. + +Click "Yes" on the dialog that appears. + +Module compile prompt + + + +### 5. Run the project + +To try out the project, simply click the "Play" button in the Unreal Engine editor. The MetaHuman will come alive using speech and lip sync generated by Amazon Polly. After the MetaHuman stops speaking you can enter your own custom speech text into the on-screen text field. + +![Play button](Documentation/media/UE4-toolbar-play.png) + + + +> ⚠️ Wait until the "Compiling Shaders" process completes before running this project for the first time. +> +> "Compiling Shaders" message + + + +> 🛠 **Troubleshooting:** This project includes extensive error messaging that can help you debug common problems. If the project doesn't work properly, open the Output Log tab in the Unreal Engine editor and look for error messages. + + + +## Developer Guide + +This repository includes a full [Developer Guide](Documentation/DeveloperGuide.md) which describes the project's architecture and explains how to customize the project with your own MetaHuman characters. + + + +## Getting Help + +If you have questions as you explore this sample project post them to the [Issues](./issues) section of this repository. To report bugs, request new features, or contribute to this open source project see [CONTRIBUTING.md](CONTRIBUTING.md). + + + +## Security + +See [CONTRIBUTING](CONTRIBUTING.md#security-issue-notifications) for more information. + + + +## License + +This sample code is licensed under the MIT-0 License. See the [LICENSE](LICENSE) file. + diff --git a/Source/AmazonPollyMetaHuman.Target.cs b/Source/AmazonPollyMetaHuman.Target.cs new file mode 100644 index 00000000..60a3994b --- /dev/null +++ b/Source/AmazonPollyMetaHuman.Target.cs @@ -0,0 +1,31 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: MIT-0 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this + * software and associated documentation files (the "Software"), to deal in the Software + * without restriction, including without limitation the rights to use, copy, modify, + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +using UnrealBuildTool; +using System.Collections.Generic; + +public class AmazonPollyMetaHumanTarget : TargetRules +{ + public AmazonPollyMetaHumanTarget(TargetInfo Target) : base(Target) + { + Type = TargetType.Game; + DefaultBuildSettings = BuildSettingsVersion.V2; + + ExtraModuleNames.AddRange( new string[] { "AmazonPollyMetaHuman" } ); + } +} diff --git a/Source/AmazonPollyMetaHuman/AmazonPollyMetaHuman.Build.cs b/Source/AmazonPollyMetaHuman/AmazonPollyMetaHuman.Build.cs new file mode 100644 index 00000000..d77a287f --- /dev/null +++ b/Source/AmazonPollyMetaHuman/AmazonPollyMetaHuman.Build.cs @@ -0,0 +1,118 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: MIT-0 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this + * software and associated documentation files (the "Software"), to deal in the Software + * without restriction, including without limitation the rights to use, copy, modify, + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +using System; +using System.Collections.Generic; +using System.IO; + +using UnrealBuildTool; + +public class AmazonPollyMetaHuman : ModuleRules +{ + private List LibraryNames = new List() { + "aws-c-auth", + "aws-c-cal", + "aws-c-common", + "aws-c-compression", + "aws-c-event-stream", + "aws-c-http", + "aws-c-io", + "aws-c-mqtt", + "aws-c-s3", + "aws-checksums", + "aws-cpp-sdk-core", + "aws-cpp-sdk-polly", + "aws-crt-cpp" + }; + + public AmazonPollyMetaHuman(ReadOnlyTargetRules Target) : base(Target) + { + PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs; + + // The AWS SDK relies on some identifiers being undefined for + // correct behavior (not the same as being defined with value + // 0). The unreal build tool treats warnings as errors, so + // rather than disabling that behavior (strict is good), we + // can just disable the warnings for undefined identifiers. + // This needs to be done in all modules that depend directly + // on the "AwsSdk" module. + bEnableUndefinedIdentifierWarnings = false; + + PublicDependencyModuleNames.AddRange(new string[] { + "Core", + "CoreUObject", + "Engine", + "InputCore", + "Json", + "JsonUtilities", + "Projects" + }); + + PrivateDependencyModuleNames.AddRange(new string[] { + "CoreUObject", + "Engine", + "Slate", + "SlateCore", + "Json", + "JsonUtilities" + }); + + // Dynamically linking to the SDK requires us to define the + // USE_IMPORT_EXPORT symbol for all build targets using the + // SDK. Source: https://github.com/aws/aws-sdk-cpp/blob/main/Docs/SDK_usage_guide.md#build-defines + PublicDefinitions.Add("USE_IMPORT_EXPORT"); + PublicDefinitions.Add("AWS_CRT_CPP_USE_IMPORT_EXPORT"); + + if (Target.Platform == UnrealTargetPlatform.Win64) { + PublicDefinitions.Add("USE_WINDOWS_DLL_SEMANTICS"); + } + + PublicIncludePaths.Add(Path.Combine(ModuleDirectory, "ThirdParty", "AwsSdk", Target.Platform.ToString(), "include")); + + LibraryNames.ForEach(AddLibrary); + } + + private void AddLibrary(string LibraryName) { + string Platform = Target.Platform.ToString(); + string LibraryPath = Path.Combine(ModuleDirectory, "ThirdParty", "AwsSdk", Platform); + + if (Target.Platform == UnrealTargetPlatform.Win64) { + // Add the library with symbols required by the linker (.lib for dynamic libraries on windows). + PublicAdditionalLibraries.Add(Path.Combine(LibraryPath, "lib", LibraryName + ".lib")); + + // Stage the library along with the target, so it can be loaded at runtime. + RuntimeDependencies.Add( + "$(BinaryOutputDir)/" + LibraryName + ".dll", + Path.Combine(LibraryPath, "bin", LibraryName + ".dll") + ); + } else if (Target.Platform == UnrealTargetPlatform.Mac) { + // Add the library with symbols required by the linker (.dylib for dynamic libraries on windows). + PublicAdditionalLibraries.Add(Path.Combine(LibraryPath, "lib", "lib" + LibraryName + ".dylib")); + + // Stage the library along with the target, so it can be loaded at runtime. + RuntimeDependencies.Add( + "$(BinaryOutputDir)/lib" + LibraryName + ".dylib", + Path.Combine(LibraryPath, "lib", "lib" + LibraryName + ".dylib") + ); + } else { + throw new PlatformNotSupportedException( + "Platform " + Platform + " is not supported by the AwsSdk Module." + ); + } + } +} diff --git a/Source/AmazonPollyMetaHuman/AmazonPollyMetaHuman.cpp b/Source/AmazonPollyMetaHuman/AmazonPollyMetaHuman.cpp new file mode 100644 index 00000000..e55d28dd --- /dev/null +++ b/Source/AmazonPollyMetaHuman/AmazonPollyMetaHuman.cpp @@ -0,0 +1,69 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: MIT-0 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this + * software and associated documentation files (the "Software"), to deal in the Software + * without restriction, including without limitation the rights to use, copy, modify, + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "AmazonPollyMetaHuman.h" +#include "Core.h" +#include "Interfaces/IPluginManager.h" + +#define LOCTEXT_NAMESPACE "FAmazonPollyMetaHumanModule" +DEFINE_LOG_CATEGORY(LogAmazonPollyMetaHuman); + +void* MemoryManagerWrapper::AllocateMemory(std::size_t blockSize, std::size_t /*alignment*/, const char* /*allocationTag*/) +{ + return ::operator new(blockSize); +} + +void MemoryManagerWrapper::FreeMemory(void* memoryPtr) +{ + return ::operator delete(memoryPtr); +} + +FAmazonPollyMetaHumanModule::FAmazonPollyMetaHumanModule() +: + m_sdkOptions(new Aws::SDKOptions) +{ + +} + +FAmazonPollyMetaHumanModule::~FAmazonPollyMetaHumanModule() +{ + delete static_cast(m_sdkOptions); + m_sdkOptions = nullptr; +} + +void FAmazonPollyMetaHumanModule::StartupModule() +{ + Aws::SDKOptions* awsSDKOptions = static_cast(m_sdkOptions); + awsSDKOptions->memoryManagementOptions.memoryManager = &m_memoryManager; + Aws::InitAPI(*awsSDKOptions); + m_apiInitialized = true; +} + +void FAmazonPollyMetaHumanModule::ShutdownModule() +{ + if (!m_apiInitialized) { + return; + } + m_apiInitialized = false; + Aws::ShutdownAPI(*static_cast(m_sdkOptions)); +} + + +#undef LOCTEXT_NAMESPACE + +IMPLEMENT_PRIMARY_GAME_MODULE( FAmazonPollyMetaHumanModule, AmazonPollyMetaHuman, "AmazonPollyMetaHuman" ); \ No newline at end of file diff --git a/Source/AmazonPollyMetaHuman/AmazonPollyMetaHuman.h b/Source/AmazonPollyMetaHuman/AmazonPollyMetaHuman.h new file mode 100644 index 00000000..68f63209 --- /dev/null +++ b/Source/AmazonPollyMetaHuman/AmazonPollyMetaHuman.h @@ -0,0 +1,100 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: MIT-0 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this + * software and associated documentation files (the "Software"), to deal in the Software + * without restriction, including without limitation the rights to use, copy, modify, + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#pragma once + +#include "CoreMinimal.h" +#include "Modules/ModuleManager.h" +#include + +DECLARE_LOG_CATEGORY_EXTERN(LogAmazonPollyMetaHuman, Log, All); + +/** + * Memory manager wrapper to provide the AWS SDK to use Unreal's memory management + * (FMemory through overloaded new/delete operators by default) for dynamic allocations + */ +class MemoryManagerWrapper : public Aws::Utils::Memory::MemorySystemInterface +{ +public: + void* AllocateMemory( + std::size_t blockSize, std::size_t alignment, + const char* allocationTag = nullptr) override; + void FreeMemory(void* memoryPtr) override; + void Begin() override {}; + void End() override {}; +}; + +/** + * Manages the runtime resources required by the AmazonPolly Plugin. In particular, this includes + * loading and unloading of the AWS libraries during module startup and shutdown. + * + * @see IModuleInterface for details + */ +class FAmazonPollyMetaHumanModule : public IModuleInterface +{ +public: + + /** + * Constructs a FAmazonPollyMetaHumanModule instance. + */ + FAmazonPollyMetaHumanModule(); + + /** + * Destructs a FAmazonPollyMetaHumanModule instance. + */ + virtual ~FAmazonPollyMetaHumanModule(); + + /** + * Called right after the module DLL has been loaded and the module object has been created + * Load dependent modules here, and they will be guaranteed to be available during ShutdownModule. ie: + * + * FModuleManager::Get().LoadModuleChecked(TEXT("HTTP")); + * + * @see IModuleInterface for details + */ + virtual void StartupModule() override; + + /** + * Called before the module is unloaded, right before the module object is destroyed. + * During normal shutdown, this is called in reverse order that modules finish StartupModule(). + * This means that, as long as a module references dependent modules in it's StartupModule(), it + * can safely reference those dependencies in ShutdownModule() as well. + * + * @see IModuleInterface for details + */ + virtual void ShutdownModule() override; + + virtual bool IsGameModule() const override + { + return true; + } + +private: + + /** + * Reference to Aws::SDKOptions. This is needed to make sure to pass the same + * instance to Aws::InitAPI and Aws::ShutdownAPI as dictated by the + * [AWS docs](). Using type `void *` to encapsulate implementation details of + * this module (i.e. including the AWS SDK headers in this module's interface). + */ + void* m_sdkOptions{ nullptr }; + + bool m_apiInitialized{ false }; + + MemoryManagerWrapper m_memoryManager; +}; \ No newline at end of file diff --git a/Source/AmazonPollyMetaHuman/Private/CaseSensitiveKeyFunc.h b/Source/AmazonPollyMetaHuman/Private/CaseSensitiveKeyFunc.h new file mode 100644 index 00000000..6bc1c1c0 --- /dev/null +++ b/Source/AmazonPollyMetaHuman/Private/CaseSensitiveKeyFunc.h @@ -0,0 +1,58 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: MIT-0 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this + * software and associated documentation files (the "Software"), to deal in the Software + * without restriction, including without limitation the rights to use, copy, modify, + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#pragma once + +/** +* Custom KeyFunc for case sensitive FString hashing in TMap +* @see BaseKeyFuncs for details +*/ +template +struct CaseSensitiveKeyFunc : BaseKeyFuncs, FString> { + using Super = BaseKeyFuncs, FString>; + using ElementInitType = typename Super::ElementInitType; + using KeyInitType = typename Super::KeyInitType; + + /** + * Returns the key associated with a ValueType element in the map + * @param Element - the element in the map + * @return - the key associated with the element + */ + static KeyInitType GetSetKey(ElementInitType Element) { + return Element.Key; + } + + /** + * Determines if two FString keys are the same through case-sensitive comparison + * @param A - an FString key + * @param B - an FString key + * @return bool - boolean indicating if the keys are the same + */ + static bool Matches(KeyInitType A, KeyInitType B) { + return A.Compare(B, ESearchCase::CaseSensitive) == 0; + } + + /** + * Returns a hash for an FString key through case-sensitive hashing function + * @param key - the key to be hasheds + * @return uint32 - the hash of the key + */ + static uint32 GetKeyHash(KeyInitType Key) { + return FCrc::StrCrc32(*Key); + } +}; diff --git a/Source/AmazonPollyMetaHuman/Private/GenerateSpeechAction.cpp b/Source/AmazonPollyMetaHuman/Private/GenerateSpeechAction.cpp new file mode 100644 index 00000000..89df2efd --- /dev/null +++ b/Source/AmazonPollyMetaHuman/Private/GenerateSpeechAction.cpp @@ -0,0 +1,50 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: MIT-0 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this + * software and associated documentation files (the "Software"), to deal in the Software + * without restriction, including without limitation the rights to use, copy, modify, + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "GenerateSpeechAction.h" + +FGenerateSpeechAction::FGenerateSpeechAction( + const struct FLatentActionInfo& LatentActionInfo, + USpeechComponent* SpeechComponent, + const FString& Text, + const EVoiceId& VoiceId, + EGenerateSpeechExecPins& GenerateSpeechExecPins +) : + ExecutionFunction(LatentActionInfo.ExecutionFunction), + Linkage(LatentActionInfo.Linkage), + CallbackTarget(LatentActionInfo.CallbackTarget), + SpeechComponent(SpeechComponent), + GenerateSpeechExecPins(GenerateSpeechExecPins), + bIsDone(false) +{ + this->GenerateSpeechExecPins = EGenerateSpeechExecPins::Failure; + AsyncTask(ENamedThreads::AnyHiPriThreadNormalTask, [this, Text, VoiceId] () + { + this->SpeechComponent->GenerateSpeechSync(Text, VoiceId); + AsyncTask(ENamedThreads::GameThread, [this] () + { + this->GenerateSpeechExecPins = EGenerateSpeechExecPins::Success; + this->bIsDone = true; + }); + }); +} + +void FGenerateSpeechAction::UpdateOperation(FLatentResponse& Response) +{ + Response.FinishAndTriggerIf(bIsDone, ExecutionFunction, Linkage, CallbackTarget); +} \ No newline at end of file diff --git a/Source/AmazonPollyMetaHuman/Private/GenerateSpeechAction.h b/Source/AmazonPollyMetaHuman/Private/GenerateSpeechAction.h new file mode 100644 index 00000000..f98ca5da --- /dev/null +++ b/Source/AmazonPollyMetaHuman/Private/GenerateSpeechAction.h @@ -0,0 +1,66 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: MIT-0 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this + * software and associated documentation files (the "Software"), to deal in the Software + * without restriction, including without limitation the rights to use, copy, modify, + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#pragma once + +#include "Runtime/Engine/Public/LatentActions.h" +#include "SpeechComponent.h" + +/** + * Latent action corresponding to the latent USpeechComponent::GenerateSpeech function, which + * is required to avoid blocking the game thread. + */ +class FGenerateSpeechAction : public FPendingLatentAction { +public: + /** + * @brief Construct a new FGenerateSpeechAction object + * + * @param LatentActionInfo - Contains information required to update latent response and inform completion + * @param SpeechComponent - SpeechComponent instance generating speech + * @param Text - Text to generate speech for + * @param VoiceId - Id of the voice use for generated audio + * @param GenerateSpeechExecPins - Execution pin reference to be updated on completion + */ + FGenerateSpeechAction( + const struct FLatentActionInfo& LatentActionInfo, + USpeechComponent* SpeechComponent, + const FString& Text, + const EVoiceId& VoiceId, + EGenerateSpeechExecPins& GenerateSpeechExecPins + ); + void UpdateOperation(FLatentResponse& Response) override; + +private: + /** Information required to update latent response and inform completion */ + const FName ExecutionFunction; + + /** Information required to update latent response and inform completion */ + const int32 Linkage; + + /** Information required to update latent response and inform completion */ + UObject* const CallbackTarget; + + /** SpeechComponent instance generating speech */ + USpeechComponent* SpeechComponent; + + /** Execution pin reference to be updated on completion */ + EGenerateSpeechExecPins& GenerateSpeechExecPins; + + /** Flag to signal completion */ + bool bIsDone; +}; \ No newline at end of file diff --git a/Source/AmazonPollyMetaHuman/Private/PollyClient.cpp b/Source/AmazonPollyMetaHuman/Private/PollyClient.cpp new file mode 100644 index 00000000..b35a1c1f --- /dev/null +++ b/Source/AmazonPollyMetaHuman/Private/PollyClient.cpp @@ -0,0 +1,45 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: MIT-0 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this + * software and associated documentation files (the "Software"), to deal in the Software + * without restriction, including without limitation the rights to use, copy, modify, + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "PollyClient.h" +#include +#include +#include +#include + +PollyClient::PollyClient() { + Aws::Client::ClientConfiguration configuration; + configuration.userAgent = "request-source/AmazonPollyMetaHuman"; + AwsPollyClient = MakeUnique(configuration); +} + +PollyClient::~PollyClient() {}; + +PollyOutcome PollyClient::SynthesizeSpeech(const Aws::Polly::Model::SynthesizeSpeechRequest& SpeechRequest) { + PollyOutcome Outcome; + Aws::Polly::Model::SynthesizeSpeechOutcome SpeechOutcome = AwsPollyClient->SynthesizeSpeech(SpeechRequest); + if (SpeechOutcome.IsSuccess()) { + Outcome.StreamBuffer = UnrealAWSUtils::PreparePollyData(SpeechOutcome.GetResult().GetAudioStream()); + Outcome.IsSuccess = true; + } + else { + Outcome.IsSuccess = false; + Outcome.PollyErrorMsg = SpeechOutcome.GetError().GetMessage(); + } + return Outcome; +} \ No newline at end of file diff --git a/Source/AmazonPollyMetaHuman/Private/PollyClient.h b/Source/AmazonPollyMetaHuman/Private/PollyClient.h new file mode 100644 index 00000000..4ac1b8ec --- /dev/null +++ b/Source/AmazonPollyMetaHuman/Private/PollyClient.h @@ -0,0 +1,63 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: MIT-0 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this + * software and associated documentation files (the "Software"), to deal in the Software + * without restriction, including without limitation the rights to use, copy, modify, + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#pragma once + +#include +#include +#include "UnrealAWSUtils.h" +#include + +/** +* Struct containing Polly data, to be used in SynthesizeSpeech +* NOTE: This struct was created to encapsulate all of the details +* of the Polly SDK into this class. Due to being unable to create +* custom SynthesizeSpeechOutcome objects, we use this struct to aid in +* mocking for unit tests. +*/ +struct PollyOutcome { + bool IsSuccess; + TArray StreamBuffer; + Aws::String PollyErrorMsg; +}; + +/** +* Wrapper for PollyClient that calls on Polly API, encapsulates AWS Polly SDK +*/ +class PollyClient { + +private: + /** + * PollyClient used to invoke the Polly API (SynthesizeSpeech) + */ + TUniquePtr AwsPollyClient; + +public: + /* + * Creates the PollyClient + */ + PollyClient(); + + virtual ~PollyClient(); + /** + * Calls on Polly SDK and returns a PollyOutcome struct object with Polly data + * @param SpeechRequest - a configured SpeechRequest to be synthesized + * @return PollyOutcome - the struct containing the PollyData + */ + virtual PollyOutcome SynthesizeSpeech(const Aws::Polly::Model::SynthesizeSpeechRequest& SpeechRequest); +}; \ No newline at end of file diff --git a/Source/AmazonPollyMetaHuman/Private/SpeechComponent.cpp b/Source/AmazonPollyMetaHuman/Private/SpeechComponent.cpp new file mode 100644 index 00000000..afad7161 --- /dev/null +++ b/Source/AmazonPollyMetaHuman/Private/SpeechComponent.cpp @@ -0,0 +1,213 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: MIT-0 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this + * software and associated documentation files (the "Software"), to deal in the Software + * without restriction, including without limitation the rights to use, copy, modify, + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "SpeechComponent.h" +#include +#include "Json.h" +#include "UObject/Class.h" +#include "TimerManager.h" +#include "Kismet/GameplayStatics.h" +#include +#include +#include "UnrealAWSUtils.h" +#include "GenerateSpeechAction.h" + +using UnrealAWSUtils::AwsStringToFString; +using UnrealAWSUtils::FStringToAwsString; + +DEFINE_LOG_CATEGORY(LogPollyMsg); + +USpeechComponent::USpeechComponent() { + // Set this component to be initialized when the game starts, and to be ticked every frame. + // You can turn these features off to improve performance if you don't need them. + PrimaryComponentTick.bCanEverTick = false; + bWantsInitializeComponent = true; +} + +void USpeechComponent::InitializeComponent() { + Super::InitializeComponent(); + InitializePollyClient(); +} + +void USpeechComponent::GenerateSpeech( + UObject* WorldContextObject, + const FString Text, + const EVoiceId VoiceId, + struct FLatentActionInfo LatentActionInfo, + EGenerateSpeechExecPins& GenerateSpeechExecPins +) { + if (UWorld* World = GEngine->GetWorldFromContextObjectChecked(WorldContextObject)) { + FLatentActionManager& LatentActionManager = World->GetLatentActionManager(); + UObject* CallbackTarget = LatentActionInfo.CallbackTarget; + int32 UUID = LatentActionInfo.UUID; + if (LatentActionManager.FindExistingAction(CallbackTarget, UUID) == NULL) { + // LatentActionManager takes ownership of FGenerateSpeechAction (it calls delete). + LatentActionManager.AddNewAction(CallbackTarget, UUID, new FGenerateSpeechAction(LatentActionInfo, this, Text, VoiceId, GenerateSpeechExecPins)); + } + } +} + +USoundWaveProcedural* USpeechComponent::StartSpeech() { + FScopeLock lock(&Mutex); + if (VisemeEventArray.Num() == 0) { + UE_LOG(LogPollyMsg, Error, TEXT("Failed to start speech. GenerateSpeech must be invoked before StartSpeech.")); + return nullptr; + } + else { + bIsSpeaking = true; + CurrentVisemeIndex = 0; + CurrentViseme = VisemeEventArray[CurrentVisemeIndex].Viseme; + StartTimePoint = std::chrono::steady_clock::now(); + float CurrentVisemeDurationSeconds = VisemeEventArray[CurrentVisemeIndex].TimeMilliseconds / 1000.0f; + SetTimer(CurrentVisemeDurationSeconds); + return QueuePollyAudio(); + } +} + +EViseme USpeechComponent::GetCurrentViseme() { + FScopeLock lock(&Mutex); + return CurrentViseme; +} + +bool USpeechComponent::IsSpeaking() { + FScopeLock lock(&Mutex); + return bIsSpeaking; +} + +void USpeechComponent::PlayNextViseme() { + FScopeLock lock(&Mutex); + CurrentVisemeIndex++; + ClearTimer(); + if (CurrentVisemeIndex == VisemeEventArray.Num() || VisemeEventArray.Num() == 0) { + bIsSpeaking = false; + return; + } + else { + CurrentViseme = VisemeEventArray[CurrentVisemeIndex].Viseme; + auto CurrentTimePoint = std::chrono::steady_clock::now(); + float SecondsSinceStart = std::chrono::duration(CurrentTimePoint - StartTimePoint).count() / 1000.0f; + float CurrentVisemeDurationSeconds = fmaxf(VisemeEventArray[CurrentVisemeIndex].TimeMilliseconds / 1000.0f - SecondsSinceStart, 0); + SetTimer(CurrentVisemeDurationSeconds); + } +} + +void USpeechComponent::GenerateSpeechSync(const FString Text, const EVoiceId VoiceId) { + if (Text.IsEmpty()) { + UE_LOG(LogPollyMsg, Error, TEXT("Cannot generate speech (check input text).")); + return; + } + if (IsSpeaking()) { + UE_LOG(LogPollyMsg, Error, TEXT("Cannot generate speech during playback.")); + return; + } + if (SynthesizeAudio(Text, VoiceId) && SynthesizeVisemes(Text, VoiceId)) { + UE_LOG(LogPollyMsg, Display, TEXT("Polly called successfully!")); + } +} + +bool USpeechComponent::SynthesizeAudio(const FString& Text, const EVoiceId VoiceId) { + PollyOutcome PollyAudioOutcome = MyPollyClient->SynthesizeSpeech(CreatePollyAudioRequest(Text, VoiceId)); + if (PollyAudioOutcome.IsSuccess) { + FScopeLock lock(&Mutex); + Audiobuffer = PollyAudioOutcome.StreamBuffer; + } + else { + UE_LOG(LogPollyMsg, Error, TEXT("Polly failed to generate audio file. Error: %s"), *AwsStringToFString(PollyAudioOutcome.PollyErrorMsg)); + } + return PollyAudioOutcome.IsSuccess; +} + +bool USpeechComponent::SynthesizeVisemes(const FString& Text, const EVoiceId VoiceId) { + PollyOutcome PollyVisemeOutcome = MyPollyClient->SynthesizeSpeech(CreatePollyVisemeRequest(Text, VoiceId)); + if (PollyVisemeOutcome.IsSuccess) { + FScopeLock lock(&Mutex); + FString VisemeJson; + FFileHelper::BufferToString(VisemeJson, PollyVisemeOutcome.StreamBuffer.GetData(), PollyVisemeOutcome.StreamBuffer.Num()); + GenerateVisemeEvents(VisemeJson); + } + else { + UE_LOG(LogPollyMsg, Error, TEXT("Polly failed to generate visemes. Error: %s"), *AwsStringToFString(PollyVisemeOutcome.PollyErrorMsg)); + } + return PollyVisemeOutcome.IsSuccess; +} + +USoundWaveProcedural* USpeechComponent::QueuePollyAudio() { + USoundWaveProcedural* PollyAudio = NewObject(); + PollyAudio->SetSampleRate(16000); + PollyAudio->NumChannels = 1; + PollyAudio->DecompressionType = DTYPE_Procedural; + int32 BitRate = 16 * PollyAudio->NumChannels * PollyAudio->GetSampleRateForCurrentPlatform(); + PollyAudio->Duration = Audiobuffer.Num() * 8.0f / BitRate; + PollyAudio->QueueAudio(Audiobuffer.GetData(), Audiobuffer.Num()); + return PollyAudio; +} + +Aws::Polly::Model::SynthesizeSpeechRequest USpeechComponent::CreatePollyAudioRequest(const FString& Text, const EVoiceId VoiceId) const { + Aws::Polly::Model::SynthesizeSpeechRequest PollyRequest; + PollyRequest.SetText(FStringToAwsString(Text)); + PollyRequest.SetVoiceId(ToPollyVoiceId(VoiceId)); + PollyRequest.SetEngine(ToPollyVoiceEngine(VoiceId)); + PollyRequest.SetOutputFormat(Aws::Polly::Model::OutputFormat::pcm); + return PollyRequest; +} + +Aws::Polly::Model::SynthesizeSpeechRequest USpeechComponent::CreatePollyVisemeRequest(const FString& Text, const EVoiceId VoiceId) const { + Aws::Polly::Model::SynthesizeSpeechRequest PollyRequest; + PollyRequest.SetText(FStringToAwsString(Text)); + PollyRequest.SetVoiceId(ToPollyVoiceId(VoiceId)); + PollyRequest.SetEngine(ToPollyVoiceEngine(VoiceId)); + PollyRequest.SetOutputFormat(Aws::Polly::Model::OutputFormat::json); + PollyRequest.AddSpeechMarkTypes(Aws::Polly::Model::SpeechMarkType::viseme); + return PollyRequest; +} + +void USpeechComponent::GenerateVisemeEvents(FString VisemeJson) { + VisemeEventArray = {}; + TArray VisemeStrings; + VisemeJson.ParseIntoArray(VisemeStrings, TEXT("\n"), true); + for (FString VisemeSet : VisemeStrings) { + TSharedPtr JsonParsed = MakeShareable(new FJsonObject); + TSharedRef> JsonReader = TJsonReaderFactory::Create(VisemeSet); + FString OutString; + double OutNumber; + if (FJsonSerializer::Deserialize(JsonReader, JsonParsed) && JsonParsed->TryGetStringField("value", OutString) && JsonParsed->TryGetNumberField("time", OutNumber)) { + VisemeEvent CurrentVisemeEvent; + CurrentVisemeEvent.Viseme = GetVisemeValueFromString(JsonParsed->GetStringField("value")); + CurrentVisemeEvent.TimeMilliseconds = JsonParsed->GetIntegerField("time"); + VisemeEventArray.Add(CurrentVisemeEvent); + } + else { + UE_LOG(LogPollyMsg, Error, TEXT("Failed to parse json formatted viseme sequence returned by Amazon Polly.")); + VisemeEventArray = {}; + Audiobuffer.Empty(); + break; + } + } +} + +void USpeechComponent::InitializePollyClient() { + MyPollyClient = MakeUnique(); +} + +void USpeechComponent::SetTimer(float CurrentVisemeDurationSeconds) { + GetWorld()->GetTimerManager().SetTimer(CountdownTimerHandle, this, &USpeechComponent::PlayNextViseme, 1.0f, true, CurrentVisemeDurationSeconds); +} + +void USpeechComponent::ClearTimer() { + GetWorld()->GetTimerManager().ClearTimer(CountdownTimerHandle); +} \ No newline at end of file diff --git a/Source/AmazonPollyMetaHuman/Private/Tests/MockPollyClient.cpp b/Source/AmazonPollyMetaHuman/Private/Tests/MockPollyClient.cpp new file mode 100644 index 00000000..c984db0b --- /dev/null +++ b/Source/AmazonPollyMetaHuman/Private/Tests/MockPollyClient.cpp @@ -0,0 +1,32 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: MIT-0 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this + * software and associated documentation files (the "Software"), to deal in the Software + * without restriction, including without limitation the rights to use, copy, modify, + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "MockPollyClient.h" + +MockPollyClient::~MockPollyClient() {}; + +PollyOutcome MockPollyClient::SynthesizeSpeech(const Aws::Polly::Model::SynthesizeSpeechRequest& SpeechRequest) { + (void)SpeechRequest; + TFunction SynthesizeSpeechLambda; + SynthesizeSpeechBehaviors.Dequeue(SynthesizeSpeechLambda); + return SynthesizeSpeechLambda(); +}; + +void MockPollyClient::AddSynthesizeSpeechBehavior(TFunction SynthesizeSpeechLambda) { + SynthesizeSpeechBehaviors.Enqueue(SynthesizeSpeechLambda); +} diff --git a/Source/AmazonPollyMetaHuman/Private/Tests/MockPollyClient.h b/Source/AmazonPollyMetaHuman/Private/Tests/MockPollyClient.h new file mode 100644 index 00000000..6eb22ca9 --- /dev/null +++ b/Source/AmazonPollyMetaHuman/Private/Tests/MockPollyClient.h @@ -0,0 +1,46 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: MIT-0 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this + * software and associated documentation files (the "Software"), to deal in the Software + * without restriction, including without limitation the rights to use, copy, modify, + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#pragma once + +#include "PollyClient.h" + +/** +* Overrides PollyClient class methods to avoid calling on AWS SDK +* UTestableSpeechComponent uses this derived class instead of PollyClient +* to mock calls to Polly API during unit testing +*/ +class MockPollyClient : public PollyClient { + +public: + virtual ~MockPollyClient(); + /** + * Simulates a call to the Polly SDK (SynthesizeSpeech) + * @param - SpeechRequest, not used since SDK not called + * @return - a custom PollyOutcome object + */ + virtual PollyOutcome SynthesizeSpeech(const Aws::Polly::Model::SynthesizeSpeechRequest& SpeechRequest) override; + /** + * A queue containing lambdas for returning custom PollyOutcome objects in SynthesizeSpeech + */ + TQueue> SynthesizeSpeechBehaviors; + /** + * Adds a modification to behavior of SynthesizeSpeech for use in mocking calls to Polly API + */ + void AddSynthesizeSpeechBehavior(TFunction SynthesizeSpeechBehavior); +}; \ No newline at end of file diff --git a/Source/AmazonPollyMetaHuman/Private/Tests/SpeechComponent.spec.cpp b/Source/AmazonPollyMetaHuman/Private/Tests/SpeechComponent.spec.cpp new file mode 100644 index 00000000..72380db1 --- /dev/null +++ b/Source/AmazonPollyMetaHuman/Private/Tests/SpeechComponent.spec.cpp @@ -0,0 +1,653 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: MIT-0 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this + * software and associated documentation files (the "Software"), to deal in the Software + * without restriction, including without limitation the rights to use, copy, modify, + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "Misc/AutomationTest.h" +#include "TestableSpeechComponent.h" +#include + +/** +* Creates a lambda function that returns a failed PollyOutcome +* @return - the lambda function +*/ +TFunction CreatePollyErrorOutcome() { + auto ErrorOutcomeLambda = []() { + PollyOutcome Outcome; + Outcome.IsSuccess = false; + Outcome.PollyErrorMsg = "error"; + return Outcome; + }; + return ErrorOutcomeLambda; +} + +/** +* Creates a lambda function that returns a successful PollyOutcome +* @param text - text to be passed into a stream used to fill Streambuffer +* @return - the lambda function +*/ +TFunction CreatePollySuccessfulOutcome(Aws::String text) { + auto SuccessfulOutcomeLambda = [text]() { + PollyOutcome Outcome; + Outcome.IsSuccess = true; + Aws::StringStream PollyStream(text); + Outcome.StreamBuffer = UnrealAWSUtils::PreparePollyData(PollyStream); + return Outcome; + }; + return SuccessfulOutcomeLambda; +} + +BEGIN_DEFINE_SPEC(AmazonPollySpec, "AmazonPolly.Unit Tests", EAutomationTestFlags::ClientContext | EAutomationTestFlags::EditorContext | EAutomationTestFlags::ProductFilter) +UTestableSpeechComponent* TestableSpeechComponent; +END_DEFINE_SPEC(AmazonPollySpec) + +void::AmazonPollySpec::Define() { + + Describe("UnrealAWSUtils tests", [this]() { + + Describe("FStringToAwsString(UnrealString)", [this]() { + It("should convert to equivalent Aws String 'Polly'", [this]() { + // given an FString "Polly" + FString UnrealString = TEXT("Polly"); + Aws::String TestString = "Polly"; + // when FStringToAwsString is called on the FString + Aws::String Result = UnrealAWSUtils::FStringToAwsString(UnrealString); + // then the result should be an AwsString "Polly" + TestEqual("Conversion to Aws String 'Polly'", Result, TestString); + }); + + It("should convert to equivalent Aws String 'ABC123!@#'", [this]() { + // given an FString "ABC123!@#" + FString UnrealString = TEXT("ABC123!@#"); + Aws::String TestString = "ABC123!@#"; + // when FStringToAwsString is called on the FString + Aws::String Result = UnrealAWSUtils::FStringToAwsString(UnrealString); + // then the result should be an AwsString "ABC123!@#" + TestEqual("Conversion to Aws String 'ABC123!@#'", Result, TestString); + }); + + It("should convert to equivalent Aws String ''", [this]() { + // given an empty FString "" + FString UnrealString = TEXT(""); + Aws::String TestString = ""; + // when FStringToAwsString is called on the FString + Aws::String Result = UnrealAWSUtils::FStringToAwsString(UnrealString); + // then the result should be an empty AwsString "" + TestEqual("Conversion to Aws String ''", Result, TestString); + }); + + It("Move constructor on strings should not cause deallocation failures", [this]() { + // given a string long enough to cause dynamic allocations (> ~16 byte Small String Optimization) + FString UnrealString = TEXT("This is a string which will cause a dynamic allocation."); + Aws::String TestString = "This is a string which will cause a dynamic allocation."; + // when SetText is called on the PollyRequest with an RValue + { + Aws::Polly::Model::SynthesizeSpeechRequest PollyRequest; + PollyRequest.SetText(UnrealAWSUtils::FStringToAwsString(UnrealString)); + TestEqual("Set PollyRequest text through move construction.", PollyRequest.GetText(), TestString); + // then the destruction of the PollyRequest should not cause a heap error + } + // PollyRequest deallocated + }); + }); + + Describe("AwsStringToFString(AwsString)", [this]() { + It("should convert to equivalent FString 'Polly'", [this]() { + // given an AwsString "Polly" + Aws::String AwsString = "Polly"; + FString TestString = TEXT("Polly"); + // when AwsStringToFString is called on the AwsString + FString Result = UnrealAWSUtils::AwsStringToFString(AwsString); + // then the result should be a FString "Polly" + TestEqual("Conversion to FString 'Polly'", Result, TestString); + }); + + It("should convert to equivalent FString 'ABC123!@#'", [this]() { + //given an AwsString "ABC123@!#" + Aws::String AwsString = "ABC123!@#"; + FString TestString = TEXT("ABC123!@#"); + // when AwsStringToFString is called on the AwsString + FString Result = UnrealAWSUtils::AwsStringToFString(AwsString); + // then the result should be a FString "ABC123!@#" + TestEqual("Conversion to FString 'ABC123!@#', and returned" + Result, Result, TestString); + }); + + It("should convert to equivalent FString ''", [this]() { + // given an empty AwsString "" + Aws::String AwsString = ""; + FString TestString = TEXT(""); + // when AwsStringToFString is called on the AwsString + FString Result = UnrealAWSUtils::AwsStringToFString(AwsString); + // then the result should be an empty FString "" + TestEqual("Conversion to FString ''", Result, TestString); + }); + }); + + Describe("PreparePollyData(IOStream)", [this]() { + It("should prepare a buffer from a stream", [this]() { + // given a stream + Aws::StringStream ss("abc"); + // when PreparePollyData is called on the stream + TArray Buffer = UnrealAWSUtils::PreparePollyData(ss); + // then the Buffer should be filled with data from the stream + TestTrue("Buffer is filled after call", Buffer.Num() > 0); + }); + + It("should prepare a valid audio buffer from an audiostream", [this]() { + // given a valid audio stream + Aws::StringStream ss("@#ABCDE12345"); + // when PreparePollyData is called on the stream + TArray Buffer = UnrealAWSUtils::PreparePollyData(ss); + // then the Buffer should be filled with data from the stream + TestTrue("Buffer is filled after call", Buffer.Num() > 0); + // when a USoundWave object is created from data from the Buffer + USoundWaveProcedural* PollyAudio = NewObject(); + PollyAudio->SetSampleRate(16000); + PollyAudio->NumChannels = 1; + PollyAudio->DecompressionType = DTYPE_Procedural; + PollyAudio->QueueAudio(Buffer.GetData(), Buffer.Num()); + // then the USoundWave object should be playable + TestTrue("PollyAudio->IsPlayable() should return true", PollyAudio->IsPlayable()); + }); + + It("should prepare a valid viseme buffer from a stream of visemes", [this]() { + // given a valid stream of visemes + Aws::StringStream VisemeStream("{\"time\":125,\"type\":\"viseme\",\"value\":\"p\"}"); + // when PreparePollyData is called on the Stream + TArray Buffer = UnrealAWSUtils::PreparePollyData(VisemeStream); + // then the Buffer should be filled with data from the stream + TestTrue("Buffer is filled after call", Buffer.Num() > 0); + // when the Buffer is converted to a string and parsed by Json utilities + FString VisemeJson; + FFileHelper::BufferToString(VisemeJson, Buffer.GetData(), Buffer.Num()); + TSharedPtr JsonParsed = MakeShareable(new FJsonObject); + TSharedRef> JsonReader = TJsonReaderFactory::Create(VisemeJson); + FJsonSerializer::Deserialize(JsonReader, JsonParsed); + FString Viseme = JsonParsed->GetStringField("value"); + int Time = JsonParsed->GetIntegerField("time"); + // then the Json utilties should return the 'p' viseme and '125' time fields from the string + TestTrue("Returned viseme should be p", Viseme == "p"); + TestTrue("Returned time should be 125", Time == 125); + }); + }); + }); + + Describe("SpeechComponent tests", [this]() { + + Describe("Initializing a SpeechComponent", [this]() { + + It("should have an empty Audiobuffer and VisemeEventArray'", [this]() { + // given no prior setup + // when a SpeechComponent is initialized + TestableSpeechComponent = NewObject(); + // then the Audiobuffer and VisemeEventArray should be empty + TestTrue("VisemeEventArray should be empty upon initialization", TestableSpeechComponent->GetVisemeEventArray().Num() == 0); + TestTrue("Audiobuffer should be empty upon initialization", TestableSpeechComponent->GetAudiobuffer().Num() == 0); + }); + + }); + + Describe("GenerateSpeechSync(text, VoiceId) ", [this]() { + + BeforeEach([this]() { + TestableSpeechComponent = NewObject(); + TestableSpeechComponent->InitializePollyClient(); + }); + + It("should not synthesize any audio or visemes for an empty text input", [this]() { + // given an empty text passed into GenerateSpeechSync + AddExpectedError(TEXT("Cannot generate speech"), EAutomationExpectedErrorFlags::Contains); + // when GenerateSpeechSync is invoked with the empty text + TestableSpeechComponent->GenerateSpeechSync("", EVoiceId::Joanna); + HasMetExpectedErrors(); + // then an error should be logged and the Audiobuffer and VisemeEventArray should be empty + TestTrue("Audiobuffer is empty after call", TestableSpeechComponent->GetAudiobuffer().Num() == 0); + TestTrue("VisemeEventArray is empty after call", TestableSpeechComponent->GetVisemeEventArray().Num() == 0); + }); + + It("should not synthesize any audio or visemes when StartSpeech invoked (bIsSpeaking is true)", [this]() { + AddExpectedError(TEXT("Cannot generate speech during playback"), EAutomationExpectedErrorFlags::Contains); + // given a bool value of true for bIsSpeaking (StartSpeech invoked) + TestableSpeechComponent->SetSpeaking(true); + // when GenerateSpeechSync is invoked + TestableSpeechComponent->GenerateSpeechSync("sampletext", EVoiceId::Joanna); + HasMetExpectedErrors(); + // then an error should be logged and the Audiobuffer and VisemeEventArray should be empty + TestTrue("Audiobuffer is empty after call", TestableSpeechComponent->GetAudiobuffer().Num() == 0); + TestTrue("VisemeEventArray is empty after call", TestableSpeechComponent->GetVisemeEventArray().Num() == 0); + }); + + It("should log an error when an error occurs while generating audio and log the error from Polly", [this]() { + MockPollyClient* MockPollyClient = TestableSpeechComponent->GetPollyClient(); + // given an error while generating audio + // and thus a PollyOutcome object that has an IsSuccess value of false + MockPollyClient->AddSynthesizeSpeechBehavior(CreatePollyErrorOutcome()); + MockPollyClient->AddSynthesizeSpeechBehavior(CreatePollyErrorOutcome()); + AddExpectedError(TEXT("Polly failed to generate audio file. Error: error"), EAutomationExpectedErrorFlags::Contains); + // when GenerateSpeechSync is invoked + TestableSpeechComponent->GenerateSpeechSync(TEXT("sampletext"), EVoiceId::Joanna); + // then an error should be logged + HasMetExpectedErrors(); + }); + + It("should log an error when an error occurs while generating visemes and log the error from Polly", [this]() { + MockPollyClient* MockPollyClient = TestableSpeechComponent->GetPollyClient(); + // given an error while generating visemes + // and thus a PollyOutcome object that has an IsSuccess value of false + MockPollyClient->AddSynthesizeSpeechBehavior(CreatePollySuccessfulOutcome("@#ABCDE12345")); + MockPollyClient->AddSynthesizeSpeechBehavior(CreatePollyErrorOutcome()); + AddExpectedError(TEXT("Polly failed to generate visemes. Error: error"), EAutomationExpectedErrorFlags::Contains); + // when GenerateSpeechSync is invoked + TestableSpeechComponent->GenerateSpeechSync(TEXT("sampletext"), EVoiceId::Joanna); + // then an error should be logged + HasMetExpectedErrors(); + }); + + It("should populate VisemeEventArray with 1 visemes and timestamp for a viseme stream containing one viseme", [this]() { + MockPollyClient* MockPollyClient = TestableSpeechComponent->GetPollyClient(); + MockPollyClient->AddSynthesizeSpeechBehavior(CreatePollySuccessfulOutcome("@#ABCDE12345")); + // given proper calls to SynthesizeSpeech + // and thus a PollyOutcome object with IsSuccess = true and + // a Buffer generated from a proper stream of visemes + MockPollyClient->AddSynthesizeSpeechBehavior(CreatePollySuccessfulOutcome("{\"time\":125,\"type\":\"viseme\",\"value\":\"p\"}")); + // when GenerateSpeechSync is invoked + TestableSpeechComponent->GenerateSpeechSync("sampletext", EVoiceId::Joanna); + // then VisemeEventArray should be populated with 1 viseme and timestamp from the stream + TestEqual("VisemeEventArray is populated after call", TestableSpeechComponent->GetVisemeEventArray().Num(), 1); + TestEqual("viseme1", TestableSpeechComponent->GetVisemeEventArray()[0].Viseme, EViseme::P); + TestEqual("timestamp1", TestableSpeechComponent->GetVisemeEventArray()[0].TimeMilliseconds, 125); + TestTrue("All lambdas invoked during GenerateSpeechSync", MockPollyClient->SynthesizeSpeechBehaviors.IsEmpty()); + }); + + It("should populate VisemeEventArray with 16 visemes and timestamps for 'Hi! My name is Joanna.'", [this]() { + MockPollyClient* MockPollyClient = TestableSpeechComponent->GetPollyClient(); + MockPollyClient->AddSynthesizeSpeechBehavior(CreatePollySuccessfulOutcome("@#ABCDE12345")); + // given proper calls to SynthesizeSpeech + // and thus a PollyOutcome object with IsSuccess = true and + // a Buffer generated from a proper stream of visemes + MockPollyClient->AddSynthesizeSpeechBehavior(CreatePollySuccessfulOutcome("{\"time\":125,\"type\":\"viseme\",\"value\":\"k\"}\n{\"time\":237,\"type\":\"viseme\",\"value\":\"a\"}\n{\"time\":562,\"type\":\"viseme\",\"value\":\"sil\"}\n{\"time\":1330,\"type\":\"viseme\",\"value\":\"p\"}\n{\"time\":1442,\"type\":\"viseme\",\"value\":\"a\"}\n{\"time\":1505,\"type\":\"viseme\",\"value\":\"t\"}\n{\"time\":1642,\"type\":\"viseme\",\"value\":\"e\"}\n{\"time\":1692,\"type\":\"viseme\",\"value\":\"p\"}\n{\"time\":1755,\"type\":\"viseme\",\"value\":\"i\"}\n{\"time\":1817,\"type\":\"viseme\",\"value\":\"s\"}\n{\"time\":1905,\"type\":\"viseme\",\"value\":\"S\"}\n{\"time\":2030,\"type\":\"viseme\",\"value\":\"o\"}\n{\"time\":2192,\"type\":\"viseme\",\"value\":\"a\"}\n{\"time\":2230,\"type\":\"viseme\",\"value\":\"t\"}\n{\"time\":2330,\"type\":\"viseme\",\"value\":\"@\"}\n{\"time\":2542,\"type\":\"viseme\",\"value\":\"sil\"}")); + // when GenerateSpeechSync is invoked + TestableSpeechComponent->GenerateSpeechSync("sampletext", EVoiceId::Joanna); + // then VisemeEventArray should be populated with 16 visemes and timestamps from the stream + TestEqual("VisemeEventArray is populated after call", TestableSpeechComponent->GetVisemeEventArray().Num(), 16); + TestEqual("viseme1", TestableSpeechComponent->GetVisemeEventArray()[0].Viseme, EViseme::K); + TestEqual("viseme2", TestableSpeechComponent->GetVisemeEventArray()[1].Viseme, EViseme::A); + TestEqual("viseme3", TestableSpeechComponent->GetVisemeEventArray()[2].Viseme, EViseme::Sil); + TestEqual("viseme4", TestableSpeechComponent->GetVisemeEventArray()[3].Viseme, EViseme::P); + TestEqual("viseme5", TestableSpeechComponent->GetVisemeEventArray()[4].Viseme, EViseme::A); + TestEqual("viseme6", TestableSpeechComponent->GetVisemeEventArray()[5].Viseme, EViseme::LowerT); + TestEqual("viseme7", TestableSpeechComponent->GetVisemeEventArray()[6].Viseme, EViseme::LowerE); + TestEqual("viseme8", TestableSpeechComponent->GetVisemeEventArray()[7].Viseme, EViseme::P); + TestEqual("viseme9", TestableSpeechComponent->GetVisemeEventArray()[8].Viseme, EViseme::I); + TestEqual("viseme10", TestableSpeechComponent->GetVisemeEventArray()[9].Viseme, EViseme::LowerS); + TestEqual("viseme11", TestableSpeechComponent->GetVisemeEventArray()[10].Viseme, EViseme::S); + TestEqual("viseme12", TestableSpeechComponent->GetVisemeEventArray()[11].Viseme, EViseme::LowerO); + TestEqual("viseme13", TestableSpeechComponent->GetVisemeEventArray()[12].Viseme, EViseme::A); + TestEqual("viseme14", TestableSpeechComponent->GetVisemeEventArray()[13].Viseme, EViseme::LowerT); + TestEqual("viseme15", TestableSpeechComponent->GetVisemeEventArray()[14].Viseme, EViseme::At); + TestEqual("viseme16", TestableSpeechComponent->GetVisemeEventArray()[15].Viseme, EViseme::Sil); + TestEqual("TimeMilliseconds1", TestableSpeechComponent->GetVisemeEventArray()[0].TimeMilliseconds, 125); + TestEqual("TimeMilliseconds2", TestableSpeechComponent->GetVisemeEventArray()[1].TimeMilliseconds, 237); + TestEqual("TimeMilliseconds3", TestableSpeechComponent->GetVisemeEventArray()[2].TimeMilliseconds, 562); + TestEqual("TimeMilliseconds4", TestableSpeechComponent->GetVisemeEventArray()[3].TimeMilliseconds, 1330); + TestEqual("TimeMilliseconds5", TestableSpeechComponent->GetVisemeEventArray()[4].TimeMilliseconds, 1442); + TestEqual("TimeMilliseconds6", TestableSpeechComponent->GetVisemeEventArray()[5].TimeMilliseconds, 1505); + TestEqual("TimeMilliseconds7", TestableSpeechComponent->GetVisemeEventArray()[6].TimeMilliseconds, 1642); + TestEqual("TimeMilliseconds8", TestableSpeechComponent->GetVisemeEventArray()[7].TimeMilliseconds, 1692); + TestEqual("TimeMilliseconds9", TestableSpeechComponent->GetVisemeEventArray()[8].TimeMilliseconds, 1755); + TestEqual("TimeMilliseconds10", TestableSpeechComponent->GetVisemeEventArray()[9].TimeMilliseconds, 1817); + TestEqual("TimeMilliseconds11", TestableSpeechComponent->GetVisemeEventArray()[10].TimeMilliseconds, 1905); + TestEqual("TimeMilliseconds12", TestableSpeechComponent->GetVisemeEventArray()[11].TimeMilliseconds, 2030); + TestEqual("TimeMilliseconds13", TestableSpeechComponent->GetVisemeEventArray()[12].TimeMilliseconds, 2192); + TestEqual("TimeMilliseconds14", TestableSpeechComponent->GetVisemeEventArray()[13].TimeMilliseconds, 2230); + TestEqual("TimeMilliseconds15", TestableSpeechComponent->GetVisemeEventArray()[14].TimeMilliseconds, 2330); + TestEqual("TimeMilliseconds16", TestableSpeechComponent->GetVisemeEventArray()[15].TimeMilliseconds, 2542); + TestTrue("All lambdas invoked during GenerateSpeechSync", MockPollyClient->SynthesizeSpeechBehaviors.IsEmpty()); + }); + + It("should populate VisemeEventArray with 27 visemes and timestamps for '!%^&123'", [this]() { + MockPollyClient* MockPollyClient = TestableSpeechComponent->GetPollyClient(); + MockPollyClient->AddSynthesizeSpeechBehavior(CreatePollySuccessfulOutcome("@#ABCDE12345")); + // given proper calls to SynthesizeSpeech + // and thus a PollyOutcome object with IsSuccess = true and a + // Buffer generated from a proper stream of visemes generated from special characters + MockPollyClient->AddSynthesizeSpeechBehavior(CreatePollySuccessfulOutcome("{\"time\":62,\"type\":\"viseme\",\"value\":\"p\"}\n{\"time\":187,\"type\":\"viseme\",\"value\":\"E\"}\n{\"time\":237,\"type\":\"viseme\",\"value\":\"s\"}\n{\"time\":300,\"type\":\"viseme\",\"value\":\"E\"}\n{\"time\":375,\"type\":\"viseme\",\"value\":\"t\"}\n{\"time\":450,\"type\":\"viseme\",\"value\":\"t\"}\n{\"time\":562,\"type\":\"viseme\",\"value\":\"k\"}\n{\"time\":625,\"type\":\"viseme\",\"value\":\"a\"}\n{\"time\":712,\"type\":\"viseme\",\"value\":\"r\"}\n{\"time\":750,\"type\":\"viseme\",\"value\":\"@\"}\n{\"time\":937,\"type\":\"viseme\",\"value\":\"t\"}\n{\"time\":1037,\"type\":\"viseme\",\"value\":\"@\"}\n{\"time\":1062,\"type\":\"viseme\",\"value\":\"t\"}\n{\"time\":1125,\"type\":\"viseme\",\"value\":\"t\"}\n{\"time\":1200,\"type\":\"viseme\",\"value\":\"u\"}\n{\"time\":1250,\"type\":\"viseme\",\"value\":\"E\"}\n{\"time\":1312,\"type\":\"viseme\",\"value\":\"t\"}\n{\"time\":1487,\"type\":\"viseme\",\"value\":\"t\"}\n{\"time\":1562,\"type\":\"viseme\",\"value\":\"u\"}\n{\"time\":1587,\"type\":\"viseme\",\"value\":\"E\"}\n{\"time\":1625,\"type\":\"viseme\",\"value\":\"t\"}\n{\"time\":1700,\"type\":\"viseme\",\"value\":\"t\"}\n{\"time\":1750,\"type\":\"viseme\",\"value\":\"i\"}\n{\"time\":1875,\"type\":\"viseme\",\"value\":\"T\"}\n{\"time\":1937,\"type\":\"viseme\",\"value\":\"r\"}\n{\"time\":2087,\"type\":\"viseme\",\"value\":\"i\"}\n{\"time\":2275,\"type\":\"viseme\",\"value\":\"sil\"}")); + // when GenerateSpeechSync is invoked + TestableSpeechComponent->GenerateSpeechSync("sampletext", EVoiceId::Joanna); + // then VisemeEventArray should be populated with 27 visemes and timestamps from the stream + TestEqual("VisemeEventArray is populated after call", TestableSpeechComponent->GetVisemeEventArray().Num(), 27); + TestEqual("viseme1", TestableSpeechComponent->GetVisemeEventArray()[0].Viseme, EViseme::P); + TestEqual("viseme2", TestableSpeechComponent->GetVisemeEventArray()[1].Viseme, EViseme::E); + TestEqual("viseme3", TestableSpeechComponent->GetVisemeEventArray()[2].Viseme, EViseme::LowerS); + TestEqual("viseme4", TestableSpeechComponent->GetVisemeEventArray()[3].Viseme, EViseme::E); + TestEqual("viseme5", TestableSpeechComponent->GetVisemeEventArray()[4].Viseme, EViseme::LowerT); + TestEqual("viseme6", TestableSpeechComponent->GetVisemeEventArray()[5].Viseme, EViseme::LowerT); + TestEqual("viseme7", TestableSpeechComponent->GetVisemeEventArray()[6].Viseme, EViseme::K); + TestEqual("viseme8", TestableSpeechComponent->GetVisemeEventArray()[7].Viseme, EViseme::A); + TestEqual("viseme9", TestableSpeechComponent->GetVisemeEventArray()[8].Viseme, EViseme::R); + TestEqual("viseme10", TestableSpeechComponent->GetVisemeEventArray()[9].Viseme, EViseme::At); + TestEqual("viseme11", TestableSpeechComponent->GetVisemeEventArray()[10].Viseme, EViseme::LowerT); + TestEqual("viseme12", TestableSpeechComponent->GetVisemeEventArray()[11].Viseme, EViseme::At); + TestEqual("viseme13", TestableSpeechComponent->GetVisemeEventArray()[12].Viseme, EViseme::LowerT); + TestEqual("viseme14", TestableSpeechComponent->GetVisemeEventArray()[13].Viseme, EViseme::LowerT); + TestEqual("viseme15", TestableSpeechComponent->GetVisemeEventArray()[14].Viseme, EViseme::U); + TestEqual("viseme16", TestableSpeechComponent->GetVisemeEventArray()[15].Viseme, EViseme::E); + TestEqual("viseme17", TestableSpeechComponent->GetVisemeEventArray()[16].Viseme, EViseme::LowerT); + TestEqual("viseme18", TestableSpeechComponent->GetVisemeEventArray()[17].Viseme, EViseme::LowerT); + TestEqual("viseme19", TestableSpeechComponent->GetVisemeEventArray()[18].Viseme, EViseme::U); + TestEqual("viseme20", TestableSpeechComponent->GetVisemeEventArray()[19].Viseme, EViseme::E); + TestEqual("viseme21", TestableSpeechComponent->GetVisemeEventArray()[20].Viseme, EViseme::LowerT); + TestEqual("viseme22", TestableSpeechComponent->GetVisemeEventArray()[21].Viseme, EViseme::LowerT); + TestEqual("viseme23", TestableSpeechComponent->GetVisemeEventArray()[22].Viseme, EViseme::I); + TestEqual("viseme24", TestableSpeechComponent->GetVisemeEventArray()[23].Viseme, EViseme::T); + TestEqual("viseme25", TestableSpeechComponent->GetVisemeEventArray()[24].Viseme, EViseme::R); + TestEqual("viseme26", TestableSpeechComponent->GetVisemeEventArray()[25].Viseme, EViseme::I); + TestEqual("viseme27", TestableSpeechComponent->GetVisemeEventArray()[26].Viseme, EViseme::Sil); + TestEqual("TimeMilliseconds1", TestableSpeechComponent->GetVisemeEventArray()[0].TimeMilliseconds, 62); + TestEqual("TimeMilliseconds2", TestableSpeechComponent->GetVisemeEventArray()[1].TimeMilliseconds, 187); + TestEqual("TimeMilliseconds3", TestableSpeechComponent->GetVisemeEventArray()[2].TimeMilliseconds, 237); + TestEqual("TimeMilliseconds4", TestableSpeechComponent->GetVisemeEventArray()[3].TimeMilliseconds, 300); + TestEqual("TimeMilliseconds5", TestableSpeechComponent->GetVisemeEventArray()[4].TimeMilliseconds, 375); + TestEqual("TimeMilliseconds6", TestableSpeechComponent->GetVisemeEventArray()[5].TimeMilliseconds, 450); + TestEqual("TimeMilliseconds7", TestableSpeechComponent->GetVisemeEventArray()[6].TimeMilliseconds, 562); + TestEqual("TimeMilliseconds8", TestableSpeechComponent->GetVisemeEventArray()[7].TimeMilliseconds, 625); + TestEqual("TimeMilliseconds9", TestableSpeechComponent->GetVisemeEventArray()[8].TimeMilliseconds, 712); + TestEqual("TimeMilliseconds10", TestableSpeechComponent->GetVisemeEventArray()[9].TimeMilliseconds, 750); + TestEqual("TimeMilliseconds11", TestableSpeechComponent->GetVisemeEventArray()[10].TimeMilliseconds, 937); + TestEqual("TimeMilliseconds12", TestableSpeechComponent->GetVisemeEventArray()[11].TimeMilliseconds, 1037); + TestEqual("TimeMilliseconds13", TestableSpeechComponent->GetVisemeEventArray()[12].TimeMilliseconds, 1062); + TestEqual("TimeMilliseconds14", TestableSpeechComponent->GetVisemeEventArray()[13].TimeMilliseconds, 1125); + TestEqual("TimeMilliseconds15", TestableSpeechComponent->GetVisemeEventArray()[14].TimeMilliseconds, 1200); + TestEqual("TimeMilliseconds16", TestableSpeechComponent->GetVisemeEventArray()[15].TimeMilliseconds, 1250); + TestEqual("TimeMilliseconds17", TestableSpeechComponent->GetVisemeEventArray()[16].TimeMilliseconds, 1312); + TestEqual("TimeMilliseconds18", TestableSpeechComponent->GetVisemeEventArray()[17].TimeMilliseconds, 1487); + TestEqual("TimeMilliseconds19", TestableSpeechComponent->GetVisemeEventArray()[18].TimeMilliseconds, 1562); + TestEqual("TimeMilliseconds20", TestableSpeechComponent->GetVisemeEventArray()[19].TimeMilliseconds, 1587); + TestEqual("TimeMilliseconds21", TestableSpeechComponent->GetVisemeEventArray()[20].TimeMilliseconds, 1625); + TestEqual("TimeMilliseconds22", TestableSpeechComponent->GetVisemeEventArray()[21].TimeMilliseconds, 1700); + TestEqual("TimeMilliseconds23", TestableSpeechComponent->GetVisemeEventArray()[22].TimeMilliseconds, 1750); + TestEqual("TimeMilliseconds24", TestableSpeechComponent->GetVisemeEventArray()[23].TimeMilliseconds, 1875); + TestEqual("TimeMilliseconds25", TestableSpeechComponent->GetVisemeEventArray()[24].TimeMilliseconds, 1937); + TestEqual("TimeMilliseconds26", TestableSpeechComponent->GetVisemeEventArray()[25].TimeMilliseconds, 2087); + TestEqual("TimeMilliseconds27", TestableSpeechComponent->GetVisemeEventArray()[26].TimeMilliseconds, 2275); + TestTrue("All lambdas invoked during GenerateSpeechSync", MockPollyClient->SynthesizeSpeechBehaviors.IsEmpty()); + }); + + It("should populate VisemeEventArray with all possible visemes when JSON contains every possible viseme", [this]() { + MockPollyClient* MockPollyClient = TestableSpeechComponent->GetPollyClient(); + MockPollyClient->AddSynthesizeSpeechBehavior(CreatePollySuccessfulOutcome("@#ABCDE12345")); + // given proper calls to SynthesizeSpeech and thus a PollyOutcome object with IsSuccess = true and + // containing a Buffer generated from a stream with all possible visemes + MockPollyClient->AddSynthesizeSpeechBehavior(CreatePollySuccessfulOutcome("{\"time\":125,\"type\":\"viseme\",\"value\":\"p\"}\n{\"time\":200,\"type\":\"viseme\",\"value\":\"E\"}\n{\"time\":237,\"type\":\"viseme\",\"value\":\"t\"}\n{\"time\":450,\"type\":\"viseme\",\"value\":\"i\"}\n{\"time\":500,\"type\":\"viseme\",\"value\":\"k\"}\n{\"time\":625,\"type\":\"viseme\",\"value\":\"S\"}\n{\"time\":875,\"type\":\"viseme\",\"value\":\"T\"}\n{\"time\":1062,\"type\":\"viseme\",\"value\":\"f\"}\n{\"time\":1200,\"type\":\"viseme\",\"value\":\"a\"}\n{\"time\":1487,\"type\":\"viseme\",\"value\":\"e\"}\n{\"time\":1875,\"type\":\"viseme\",\"value\":\"s\"}\n{\"time\":1962,\"type\":\"viseme\",\"value\":\"r\"}\n{\"time\":2787,\"type\":\"viseme\",\"value\":\"u\"}\n{\"time\":3312,\"type\":\"viseme\",\"value\":\"@\"}\n{\"time\":4625,\"type\":\"viseme\",\"value\":\"o\"}\n{\"time\":4937,\"type\":\"viseme\",\"value\":\"O\"}\n{\"time\":5212,\"type\":\"viseme\",\"value\":\"sil\"}")); + // when GenerateSpeechSync is invoked + TestableSpeechComponent->GenerateSpeechSync("sampletext", EVoiceId::Joanna); + // then VisemeEventArray should be populated with 17 visemes and contain all possible visemes + TestEqual("VisemeEventArray is populated after call", TestableSpeechComponent->GetVisemeEventArray().Num(), 17); + TestEqual("p", TestableSpeechComponent->GetVisemeEventArray()[0].Viseme, EViseme::P); + TestEqual("E", TestableSpeechComponent->GetVisemeEventArray()[1].Viseme, EViseme::E); + TestEqual("t", TestableSpeechComponent->GetVisemeEventArray()[2].Viseme, EViseme::LowerT); + TestEqual("i", TestableSpeechComponent->GetVisemeEventArray()[3].Viseme, EViseme::I); + TestEqual("k", TestableSpeechComponent->GetVisemeEventArray()[4].Viseme, EViseme::K); + TestEqual("S", TestableSpeechComponent->GetVisemeEventArray()[5].Viseme, EViseme::S); + TestEqual("T", TestableSpeechComponent->GetVisemeEventArray()[6].Viseme, EViseme::T); + TestEqual("f", TestableSpeechComponent->GetVisemeEventArray()[7].Viseme, EViseme::F); + TestEqual("a", TestableSpeechComponent->GetVisemeEventArray()[8].Viseme, EViseme::A); + TestEqual("e", TestableSpeechComponent->GetVisemeEventArray()[9].Viseme, EViseme::LowerE); + TestEqual("s", TestableSpeechComponent->GetVisemeEventArray()[10].Viseme, EViseme::LowerS); + TestEqual("r", TestableSpeechComponent->GetVisemeEventArray()[11].Viseme, EViseme::R); + TestEqual("u", TestableSpeechComponent->GetVisemeEventArray()[12].Viseme, EViseme::U); + TestEqual("@", TestableSpeechComponent->GetVisemeEventArray()[13].Viseme, EViseme::At); + TestEqual("o", TestableSpeechComponent->GetVisemeEventArray()[14].Viseme, EViseme::LowerO); + TestEqual("O", TestableSpeechComponent->GetVisemeEventArray()[15].Viseme, EViseme::O); + TestEqual("sil", TestableSpeechComponent->GetVisemeEventArray()[16].Viseme, EViseme::Sil); + TestTrue("All lambdas invoked during GenerateSpeechSync", MockPollyClient->SynthesizeSpeechBehaviors.IsEmpty()); + }); + + // This test is to ensure viseme data doesn't stick around in between runs of StartSpeech, which can cause issues during playback with repeated states/animations + It("should synthesize visemes for '!@#ABC000', replacing the previous synthesized data", [this]() { + MockPollyClient* MockPollyClient = TestableSpeechComponent->GetPollyClient(); + // given proper calls to SynthesizeSpeech and thus two PollyVisemeOutcome objects with IsSuccess = true and + // containing buffers generated from two different proper streams of visemes + MockPollyClient->AddSynthesizeSpeechBehavior(CreatePollySuccessfulOutcome("@#ABCDE12345")); + MockPollyClient->AddSynthesizeSpeechBehavior(CreatePollySuccessfulOutcome("{\"time\":125,\"type\":\"viseme\",\"value\":\"k\"}\n{\"time\":237,\"type\":\"viseme\",\"value\":\"a\"}\n{\"time\":562,\"type\":\"viseme\",\"value\":\"sil\"}\n{\"time\":1330,\"type\":\"viseme\",\"value\":\"p\"}\n{\"time\":1442,\"type\":\"viseme\",\"value\":\"a\"}\n{\"time\":1505,\"type\":\"viseme\",\"value\":\"t\"}\n{\"time\":1642,\"type\":\"viseme\",\"value\":\"e\"}\n{\"time\":1692,\"type\":\"viseme\",\"value\":\"p\"}\n{\"time\":1755,\"type\":\"viseme\",\"value\":\"i\"}\n{\"time\":1817,\"type\":\"viseme\",\"value\":\"s\"}\n{\"time\":1905,\"type\":\"viseme\",\"value\":\"S\"}\n{\"time\":2030,\"type\":\"viseme\",\"value\":\"o\"}\n{\"time\":2192,\"type\":\"viseme\",\"value\":\"a\"}\n{\"time\":2230,\"type\":\"viseme\",\"value\":\"t\"}\n{\"time\":2330,\"type\":\"viseme\",\"value\":\"@\"}\n{\"time\":2542,\"type\":\"viseme\",\"value\":\"sil\"}")); + MockPollyClient->AddSynthesizeSpeechBehavior(CreatePollySuccessfulOutcome("@#ABCDE12345")); + MockPollyClient->AddSynthesizeSpeechBehavior(CreatePollySuccessfulOutcome("{\"time\":62,\"type\":\"viseme\",\"value\":\"p\"}\n{\"time\":187,\"type\":\"viseme\",\"value\":\"E\"}\n{\"time\":237,\"type\":\"viseme\",\"value\":\"s\"}\n{\"time\":300,\"type\":\"viseme\",\"value\":\"E\"}\n{\"time\":375,\"type\":\"viseme\",\"value\":\"t\"}\n{\"time\":450,\"type\":\"viseme\",\"value\":\"t\"}\n{\"time\":562,\"type\":\"viseme\",\"value\":\"k\"}\n{\"time\":625,\"type\":\"viseme\",\"value\":\"a\"}\n{\"time\":712,\"type\":\"viseme\",\"value\":\"r\"}\n{\"time\":750,\"type\":\"viseme\",\"value\":\"@\"}\n{\"time\":937,\"type\":\"viseme\",\"value\":\"t\"}\n{\"time\":1037,\"type\":\"viseme\",\"value\":\"@\"}\n{\"time\":1062,\"type\":\"viseme\",\"value\":\"t\"}\n{\"time\":1125,\"type\":\"viseme\",\"value\":\"t\"}\n{\"time\":1200,\"type\":\"viseme\",\"value\":\"u\"}\n{\"time\":1250,\"type\":\"viseme\",\"value\":\"E\"}\n{\"time\":1312,\"type\":\"viseme\",\"value\":\"t\"}\n{\"time\":1487,\"type\":\"viseme\",\"value\":\"t\"}\n{\"time\":1562,\"type\":\"viseme\",\"value\":\"u\"}\n{\"time\":1587,\"type\":\"viseme\",\"value\":\"E\"}\n{\"time\":1625,\"type\":\"viseme\",\"value\":\"t\"}\n{\"time\":1700,\"type\":\"viseme\",\"value\":\"t\"}\n{\"time\":1750,\"type\":\"viseme\",\"value\":\"i\"}\n{\"time\":1875,\"type\":\"viseme\",\"value\":\"T\"}\n{\"time\":1937,\"type\":\"viseme\",\"value\":\"r\"}\n{\"time\":2087,\"type\":\"viseme\",\"value\":\"i\"}\n{\"time\":2275,\"type\":\"viseme\",\"value\":\"sil\"}")); + // when GenerateSpeechSync is invoked for the first time + TestableSpeechComponent->GenerateSpeechSync("sampletext", EVoiceId::Joanna); + // then VisemeEventArray should be filled with 16 visemes from the first PollyVisemeOutcome object + TestTrue("VisemeEventArray is filled after call", TestableSpeechComponent->GetVisemeEventArray().Num() == 16); + // when GenerateSpeechSync is invoked for the second time + TestableSpeechComponent->GenerateSpeechSync("sampletext", EVoiceId::Joanna); + // then VisemeEventArray should only contain the 27 visemes from the second PollyVisemeOutcome object + TestTrue("VisemeEventArray empties previous data and fills with new data after second call", TestableSpeechComponent->GetVisemeEventArray().Num() == 27); + TestTrue("All lambdas invoked during GenerateSpeechSync", MockPollyClient->SynthesizeSpeechBehaviors.IsEmpty()); + }); + + It("should log an error for non-Json file", [this]() { + AddExpectedError(TEXT("Failed to parse json formatted viseme sequence returned by Amazon Polly"), EAutomationExpectedErrorFlags::Contains); + MockPollyClient* MockPollyClient = TestableSpeechComponent->GetPollyClient(); + MockPollyClient->AddSynthesizeSpeechBehavior(CreatePollySuccessfulOutcome("@#ABCDE12345")); + // given a proper call to SynthesizeSpeech + // and thus a PollyOutcome object with IsSuccess = true and a Buffer generated from + // an improper stream that does not contain a JSON + MockPollyClient->AddSynthesizeSpeechBehavior(CreatePollySuccessfulOutcome("NOT A JSON")); + // when GenerateSpeechSync is invoked + TestableSpeechComponent->GenerateSpeechSync("sampletext", EVoiceId::Joanna); + // then an error should be logged and VisemeEventArray and Audiobuffer should be empty + TestTrue("VisemeEventArray is empty after call", TestableSpeechComponent->GetVisemeEventArray().Num() == 0); + TestTrue("Audiobuffer is empty after call", TestableSpeechComponent->GetAudiobuffer().Num() == 0); + TestTrue("All lambdas invoked during GenerateSpeechSync", MockPollyClient->SynthesizeSpeechBehaviors.IsEmpty()); + HasMetExpectedErrors(); + }); + + It("should log an error for an invalid Json file", [this]() { + AddExpectedError(TEXT("Failed to parse json formatted viseme sequence returned by Amazon Polly"), EAutomationExpectedErrorFlags::Contains); + MockPollyClient* MockPollyClient = TestableSpeechComponent->GetPollyClient(); + MockPollyClient->AddSynthesizeSpeechBehavior(CreatePollySuccessfulOutcome("@#ABCDE12345")); + // given a proper call to SynthesizeSpeech + // and thus a PollyOutcome object with IsSuccess = true and a Buffer generated from + // an improper stream that contains an improperly formatted JSON + MockPollyClient->AddSynthesizeSpeechBehavior(CreatePollySuccessfulOutcome("{\"random\":125,\"field\":\"hi\",\"mom\":\"k\"}")); + // when GenerateSpeechSync is invoked + TestableSpeechComponent->GenerateSpeechSync("sampletext", EVoiceId::Joanna); + // then an error should be logged and VisemeEventArray and Audiobuffer should be empty + TestTrue("VisemeEventArray is empty after call", TestableSpeechComponent->GetVisemeEventArray().Num() == 0); + TestTrue("Audiobuffer is empty after call", TestableSpeechComponent->GetAudiobuffer().Num() == 0); + TestTrue("All lambdas invoked during GenerateSpeechSync", MockPollyClient->SynthesizeSpeechBehaviors.IsEmpty()); + HasMetExpectedErrors(); + }); + + It("should log an error for an invalid viseme value", [this]() { + AddExpectedError(TEXT("Tried to read an invalid viseme value. Returning Sil as default."), EAutomationExpectedErrorFlags::Contains); + MockPollyClient* MockPollyClient = TestableSpeechComponent->GetPollyClient(); + MockPollyClient->AddSynthesizeSpeechBehavior(CreatePollySuccessfulOutcome("@#ABCDE12345")); + // given a proper call to SynthesizeSpeech + // and thus a PollyOutcome object with IsSuccess = true and a Buffer generated from + // an improper stream that contains a properly formatted JSON with + // an invalid viseme value + MockPollyClient->AddSynthesizeSpeechBehavior(CreatePollySuccessfulOutcome("{\"time\":125,\"type\":\"viseme\",\"value\":\"J\"}")); + // when GenerateSpeechSync is invoked + TestableSpeechComponent->GenerateSpeechSync("sampletext", EVoiceId::Joanna); + // then an error should be logged and the returned viseme should be the default viseme Sil + TestEqual("Sil returned when an invalid viseme is read", TestableSpeechComponent->GetVisemeEventArray()[0].Viseme, EViseme::Sil); + TestTrue("All lambdas invoked during GenerateSpeechSync", MockPollyClient->SynthesizeSpeechBehaviors.IsEmpty()); + HasMetExpectedErrors(); + }); + + It("should synthesize audio for 'Hi! My name is Chandler!'", [this]() { + MockPollyClient* MockPollyClient = TestableSpeechComponent->GetPollyClient(); + // given a proper call to SynthesizeSpech + // and thus a PollyOutcome object with IsSuccess = true and a Buffer generated from + // a proper audio stream + MockPollyClient->AddSynthesizeSpeechBehavior(CreatePollySuccessfulOutcome("Hi! My name is Chandler!")); + MockPollyClient->AddSynthesizeSpeechBehavior(CreatePollySuccessfulOutcome("{\"time\":125,\"type\":\"viseme\",\"value\":\"p\"}")); + // when GenerateSpeechSync is invoked + TestableSpeechComponent->GenerateSpeechSync("Hi! My name is Chandler!", EVoiceId::Joey); + // then the Audiobuffer should be filled with the Buffer data + TestTrue("StringStream is a multiple of 4", (TestableSpeechComponent->GetAudiobuffer().Num() % 4) == 0); + TestTrue("AudioBuffer is filled after call", TestableSpeechComponent->GetAudiobuffer().Num() > 0); + // when a USoundWave object is constructed from the Audiobuffer + USoundWaveProcedural* PollyAudio = NewObject(); + PollyAudio->SetSampleRate(16000); + PollyAudio->NumChannels = 1; + PollyAudio->DecompressionType = DTYPE_Procedural; + PollyAudio->QueueAudio(TestableSpeechComponent->GetAudiobuffer().GetData(), TestableSpeechComponent->GetAudiobuffer().Num()); + // then the USoundWave object should be valid and playable + TestTrue("PollyAudio->IsPlayable() should return true", PollyAudio->IsPlayable()); + TestTrue("All lambdas invoked during GenerateSpeechSync", MockPollyClient->SynthesizeSpeechBehaviors.IsEmpty()); + }); + + It("should synthesize audio for '@#ABCDE12345'", [this]() { + MockPollyClient* MockPollyClient = TestableSpeechComponent->GetPollyClient(); + // given a proper call to SynthesizeSpech + // and thus a PollyOutcome object with IsSuccess = true and a Buffer generated from + // a proper audio stream + MockPollyClient->AddSynthesizeSpeechBehavior(CreatePollySuccessfulOutcome("@#ABCDE12345")); + MockPollyClient->AddSynthesizeSpeechBehavior(CreatePollySuccessfulOutcome("{\"time\":125,\"type\":\"viseme\",\"value\":\"p\"}")); + // when GenerateSpeechSync is invoked + TestableSpeechComponent->GenerateSpeechSync("@#ABCDE12345", EVoiceId::Kimberly); + // then the Audiobuffer should be filled with the Buffer data + TestTrue("StringStream is a multiple of 4", (TestableSpeechComponent->GetAudiobuffer().Num() % 4) == 0); + TestTrue("AudioBuffer is filled after call", TestableSpeechComponent->GetAudiobuffer().Num() > 0); + // when a USoundWave object is constructed from the Audiobuffer + USoundWaveProcedural* PollyAudio = NewObject(); + PollyAudio->SetSampleRate(16000); + PollyAudio->NumChannels = 1; + PollyAudio->DecompressionType = DTYPE_Procedural; + PollyAudio->QueueAudio(TestableSpeechComponent->GetAudiobuffer().GetData(), TestableSpeechComponent->GetAudiobuffer().Num()); + // then the USoundWave object should be valid and playable + TestTrue("PollyAudio->IsPlayable() should return true", PollyAudio->IsPlayable()); + TestTrue("All lambdas invoked during GenerateSpeechSync", MockPollyClient->SynthesizeSpeechBehaviors.IsEmpty()); + }); + + // This test is to ensure audio data doesn't stick around in between runs of StartSpeech, which can cause issues during playback with repeated audio + It("should replace the previous synthesized data", [this]() { + MockPollyClient* MockPollyClient = TestableSpeechComponent->GetPollyClient(); + // given proper calls to SynthesizeSpech + // and thus two PollyOutcome objects with IsSuccess = true and buffers generated from + // two proper audio streams + MockPollyClient->AddSynthesizeSpeechBehavior(CreatePollySuccessfulOutcome("Hi! My name is Chandler!")); + MockPollyClient->AddSynthesizeSpeechBehavior(CreatePollySuccessfulOutcome("{\"time\":125,\"type\":\"viseme\",\"value\":\"p\"}")); + MockPollyClient->AddSynthesizeSpeechBehavior(CreatePollySuccessfulOutcome("Hi! My name is Chandler!")); + MockPollyClient->AddSynthesizeSpeechBehavior(CreatePollySuccessfulOutcome("{\"time\":125,\"type\":\"viseme\",\"value\":\"p\"}")); + // when GenerateSpeechSync is invoked for the first time + TestableSpeechComponent->GenerateSpeechSync("Hi! My name is Chandler!", EVoiceId::Joey); + // then the Audiobuffer should be filled with the buffer data from + // the first PollyOutcome object + TestTrue("AudioBuffer size is 24, the size of the first audio stream", TestableSpeechComponent->GetAudiobuffer().Num() == 24); + // when GenerateSpeechSync is invoked for the second time + TestableSpeechComponent->GenerateSpeechSync("Hi! My name is Chandler!", EVoiceId::Joey); + // then the Audiobuffer data from the first call to GenerateSpeechSync should be replaced + // by the Audiobuffer data from the second call to GenerateSpech + TestTrue("AudioBuffer size is 24, the size of the second audio stream, and does not contain a duplicate of the audio stream data from the first call", TestableSpeechComponent->GetAudiobuffer().Num() == 24); + TestTrue("All lambdas invoked during GenerateSpeechSync", MockPollyClient->SynthesizeSpeechBehaviors.IsEmpty()); + }); + }); + + Describe("StartSpeech()", [this]() { + + BeforeEach([this]() { + TestableSpeechComponent = NewObject(); + TestableSpeechComponent->InitializePollyClient(); + }); + + It("should iterate through entire VisemeEventArray, set CurrentViseme state to last Viseme, and generate a valid SoundWave object", [this]() { + MockPollyClient* MockPollyClient = TestableSpeechComponent->GetPollyClient(); + MockPollyClient->AddSynthesizeSpeechBehavior(CreatePollySuccessfulOutcome("Hi! My name is Chandler!")); + // given a proper call to SynthesizeSpeech + // and thus a proper PollyOutcome object with IsSuccess = true and contains + // a Buffer containing data from a valid viseme stream + MockPollyClient->AddSynthesizeSpeechBehavior(CreatePollySuccessfulOutcome("{\"time\":125,\"type\":\"viseme\",\"value\":\"p\"}\n{\"time\":200,\"type\":\"viseme\",\"value\":\"E\"}\n{\"time\":237,\"type\":\"viseme\",\"value\":\"t\"}\n{\"time\":450,\"type\":\"viseme\",\"value\":\"i\"}\n{\"time\":500,\"type\":\"viseme\",\"value\":\"k\"}")); + // given a call to GenerateSpeechSync + TestableSpeechComponent->GenerateSpeechSync("sampletext", EVoiceId::Joanna); + TestTrue("All lambdas invoked during GenerateSpeechSync", MockPollyClient->SynthesizeSpeechBehaviors.IsEmpty()); + // when StartSpeech is invoked + USoundWaveProcedural* PollyAudio = TestableSpeechComponent->StartSpeech(); + // then the USoundWave object constructed from the Audiobuffer data should be playable + // and have a duration of 24*8 / (16000 * 16) = 0.00075 + // and the CurrentViseme state should be set to the first Viseme, P + // and the CurrentVisemeIndex should be 0 + TestTrue("PollyAudio->IsPlayable() should return true", PollyAudio->IsPlayable()); + TestTrue("PollyAudio->Duration should return 0.00075", PollyAudio->Duration == 0.00075f); + TestTrue("CurrentVisemeIndex should be 0", TestableSpeechComponent->GetCurrentVisemeIndex() == 0); + TestEqual("CurrentViseme should be the first Viseme, P", TestableSpeechComponent->GetCurrentViseme(), EViseme::P); + // when PlayNextViseme() is invoked by the timer + TestableSpeechComponent->PlayNextViseme(); + // then the CurrentViseme State should be set to the second Viseme, E + // and the CurrentVisemeIndex should be 1 + TestTrue("CurrentVisemeIndex should be 1", TestableSpeechComponent->GetCurrentVisemeIndex() == 1); + TestEqual("CurrentViseme should be the second Viseme, E", TestableSpeechComponent->GetCurrentViseme(), EViseme::E); + // when PlayNextViseme() is invoked by the timer + TestableSpeechComponent->PlayNextViseme(); + // then the CurrentViseme State should be set to the third Viseme, LowerT + // and the CurrentVisemeIndex should be 2 + TestTrue("CurrentVisemeIndex should be 2", TestableSpeechComponent->GetCurrentVisemeIndex() == 2); + TestEqual("CurrentViseme should be the second Viseme, LowerT", TestableSpeechComponent->GetCurrentViseme(), EViseme::LowerT); + // when PlayNextViseme() is invoked by the timer + TestableSpeechComponent->PlayNextViseme(); + // then the CurrentViseme State should be set to the fourth Viseme, I + // and the CurrentVisemeIndex should be 3 + TestTrue("CurrentVisemeIndex should be 3", TestableSpeechComponent->GetCurrentVisemeIndex() == 3); + TestEqual("CurrentViseme should be the third Viseme, I", TestableSpeechComponent->GetCurrentViseme(), EViseme::I); + // when PlayNextViseme() is invoked by the timer + TestableSpeechComponent->PlayNextViseme(); + // then the CurrentViseme State should be set to the last Viseme, K + // and the CurrentVisemeIndex should be 4 + TestTrue("CurrentVisemeIndex should be 4", TestableSpeechComponent->GetCurrentVisemeIndex() == 4); + TestEqual("CurrentViseme should be the final Viseme, K", TestableSpeechComponent->GetCurrentViseme(), EViseme::K); + // when PlayNextViseme() is invoked by the timer for the final time + TestableSpeechComponent->PlayNextViseme(); + // then the CurrentVisemeState should still be the last Viseme, K + // and the CurrentVisemeIndex should be the size of the VisemeEventArray, 5 + TestTrue("CurrentVisemeIndex should be the size of the VisemeEventArray, 5", TestableSpeechComponent->GetCurrentVisemeIndex() == TestableSpeechComponent->GetVisemeEventArray().Num()); + TestEqual("CurrentViseme should still be the final Viseme, K", TestableSpeechComponent->GetCurrentViseme(), EViseme::K); + }); + + It("should iterate through entire VisemeEventArray, set CurrentViseme state to last Viseme for a single viseme, and generate a valid SoundWave object", [this]() { + MockPollyClient* MockPollyClient = TestableSpeechComponent->GetPollyClient(); + MockPollyClient->AddSynthesizeSpeechBehavior(CreatePollySuccessfulOutcome("Hi! My name is Chandler!")); + // given a proper call to SynthesizeSpeech + // and thus a proper PollyOutcome object with IsSuccess = true and contains + // a Buffer containing data from a valid viseme stream with a single viseme + MockPollyClient->AddSynthesizeSpeechBehavior(CreatePollySuccessfulOutcome("{\"time\":125,\"type\":\"viseme\",\"value\":\"p\"}")); + // given a call to GenerateSpeechSync + TestableSpeechComponent->GenerateSpeechSync("sampletext", EVoiceId::Joey); + TestTrue("All lambdas invoked during GenerateSpeechSync", MockPollyClient->SynthesizeSpeechBehaviors.IsEmpty()); + // when StartSpeech is invoked + USoundWaveProcedural* PollyAudio = TestableSpeechComponent->StartSpeech(); + // then the USoundWave object constructed from the Audiobuffer data should be playable + // and the CurrentViseme state should be set to the first and final Viseme, P + // and the CurrentVisemeIndex should be 0 + TestTrue("PollyAudio->IsPlayable() should return true", PollyAudio->IsPlayable()); + TestTrue("CurrentVisemeIndex should be 0", TestableSpeechComponent->GetCurrentVisemeIndex() == 0); + TestEqual("CurrentViseme should be the final Viseme, P", TestableSpeechComponent->GetCurrentViseme(), EViseme::P); + // when PlayNextViseme() is invoked by the timer + TestableSpeechComponent->PlayNextViseme(); + // then the CurrentViseme state should still be the viseme P + // and the CurrentVisemeIndex should be the size of the VisemeEventArray + TestEqual("CurrentViseme should still be the final Viseme, P", TestableSpeechComponent->GetCurrentViseme(), EViseme::P); + TestTrue("CurrentVisemeIndex should be the size of the VisemeEventArray, 1", TestableSpeechComponent->GetCurrentVisemeIndex() == TestableSpeechComponent->GetVisemeEventArray().Num()); + }); + + It("should not StartSpeech before GenerateSpeechSync invoked (empty VisemeEventArray)", [this]() { + AddExpectedError(TEXT("Failed to start speech"), EAutomationExpectedErrorFlags::Contains); + auto result = TestableSpeechComponent->StartSpeech(); + TestTrue("StartSpeech returns a nullptr on error", nullptr == result); + HasMetExpectedErrors(); + }); + }); + }); +} diff --git a/Source/AmazonPollyMetaHuman/Private/Tests/TestableSpeechComponent.cpp b/Source/AmazonPollyMetaHuman/Private/Tests/TestableSpeechComponent.cpp new file mode 100644 index 00000000..f5ab6fc4 --- /dev/null +++ b/Source/AmazonPollyMetaHuman/Private/Tests/TestableSpeechComponent.cpp @@ -0,0 +1,73 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: MIT-0 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this + * software and associated documentation files (the "Software"), to deal in the Software + * without restriction, including without limitation the rights to use, copy, modify, + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "TestableSpeechComponent.h" + +void UTestableSpeechComponent::InitializePollyClient() { + MyPollyClient = MakeUnique(); +} + +void UTestableSpeechComponent::GenerateSpeechSync(const FString text, const EVoiceId VoiceId) { + Super::GenerateSpeechSync(text, VoiceId); +} + +void UTestableSpeechComponent::SetTimer(float CurrentVisemeDurationSeconds) { + // We override SetTimer() to do nothing, since we don't create any actual timers + // during unit testing (creation of timers in tests causes crashes, as tests only occur in a single frame) + // PlayNextViseme() will be called manually during unit testing to mock functionality of timer, + // which recursively calls on PlayNextViseme() on every call to SetTimer +} + +void UTestableSpeechComponent::ClearTimer() { + // We override ClearTimer() to do nothing, since we don't create any actual timers + // during unit testing (creation of timers in tests causes crashes, as tests only occur in a single frame) +} + +MockPollyClient* UTestableSpeechComponent::GetPollyClient() { + // Normally we'd use dynamic casting here but RTTI is disabled by default by Unreal, + // which is needed to invoke dynamic_cast on Polymorphic objects + return StaticCast(MyPollyClient.Get()); +} + +void UTestableSpeechComponent::PlayNextViseme() { + Super::PlayNextViseme(); +} + +EViseme UTestableSpeechComponent::GetCurrentViseme() { + return CurrentViseme; +} + +TArray UTestableSpeechComponent::GetVisemeEventArray() { + return VisemeEventArray; +} + +int UTestableSpeechComponent::GetCurrentVisemeIndex() { + return CurrentVisemeIndex; +} + +TArray UTestableSpeechComponent::GetAudiobuffer() { + return Audiobuffer; +} + +bool UTestableSpeechComponent::IsSpeaking() { + return bIsSpeaking; +} + +void UTestableSpeechComponent::SetSpeaking(bool boolean) { + bIsSpeaking = boolean; +} diff --git a/Source/AmazonPollyMetaHuman/Private/Tests/TestableSpeechComponent.h b/Source/AmazonPollyMetaHuman/Private/Tests/TestableSpeechComponent.h new file mode 100644 index 00000000..3c604304 --- /dev/null +++ b/Source/AmazonPollyMetaHuman/Private/Tests/TestableSpeechComponent.h @@ -0,0 +1,84 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: MIT-0 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this + * software and associated documentation files (the "Software"), to deal in the Software + * without restriction, including without limitation the rights to use, copy, modify, + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#pragma once + +#include "SpeechComponent.h" +#include "MockPollyClient.h" +#include "TestableSpeechComponent.generated.h" + +/** +* Testable version of SpeechComponent that overrides SpeechComponent methods to avoid use of dependencies during unit testing. +*/ +UCLASS(ClassGroup = (Custom)) +class UTestableSpeechComponent : public USpeechComponent { + + GENERATED_BODY() + +public: + /* + * Initializes the MockPollyClient + */ + virtual void InitializePollyClient() override; + /* + * Overrides GenerateSpeechSync to change accessibility to public so it can be invoked + * from the spec tests. See USpeechComponent::GenerateSpeechSync for details. + */ + virtual void GenerateSpeechSync(const FString text, const EVoiceId VoiceId) override; + /** + * Overrides PlayNextViseme to change accessibility to public so it can be invoked + * from the spec tests. See USpeechComponent::GenerateSpeechSync for details. + */ + virtual void PlayNextViseme() override; + /** + * Overrides SetTimer to avoid creation of actual timer to avoid use of FTimerManager dependencies and crashes during unit testing + */ + virtual void SetTimer(float CurrentVisemeDurationSeconds) override; + /** + * Does nothing, no actual timers created during unit testing + */ + virtual void ClearTimer() override; + /** + * Gets the PollyClient state, downcasting it to a MockPollyClient + */ + MockPollyClient* GetPollyClient(); + /** + * Getter for CurrentViseme + */ + EViseme GetCurrentViseme(); + /** + * Getter for VisemeEventArray + */ + TArray GetVisemeEventArray(); + /** + * Getter for CurrentVisemeIndex + */ + int GetCurrentVisemeIndex(); + /** + * Getter for Audiobuffer + */ + TArray GetAudiobuffer(); + /** + * Getter for bIsSpeaking + */ + bool IsSpeaking(); + /** + * Setter for bIsSpeaking + */ + void SetSpeaking(bool boolean); +}; \ No newline at end of file diff --git a/Source/AmazonPollyMetaHuman/Private/UnrealAWSUtils.cpp b/Source/AmazonPollyMetaHuman/Private/UnrealAWSUtils.cpp new file mode 100644 index 00000000..358d426e --- /dev/null +++ b/Source/AmazonPollyMetaHuman/Private/UnrealAWSUtils.cpp @@ -0,0 +1,47 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: MIT-0 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this + * software and associated documentation files (the "Software"), to deal in the Software + * without restriction, including without limitation the rights to use, copy, modify, + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "UnrealAWSUtils.h" + +Aws::String UnrealAWSUtils::FStringToAwsString(const FString& UnrealString) { + return Aws::String(TCHAR_TO_UTF8(UnrealString.GetCharArray().GetData()), UnrealString.Len()); +} + +FString UnrealAWSUtils::AwsStringToFString(const Aws::String& AwsString) { + return FString(UTF8_TO_TCHAR(AwsString.c_str())); +} + +/* +* Returns the size of a Polly stream for use in allocating size in buffers +* @param PollyStream - the Polly stream +* @return size - the size of the Polly stream +*/ +long GetStreamSize(Aws::IOStream& PollyStream) { + PollyStream.seekg(0, PollyStream.end); + long size = PollyStream.tellg(); + PollyStream.seekg(0); + return size; +} + +TArray UnrealAWSUtils::PreparePollyData(Aws::IOStream& PollyStream) { + TArray Buffer; + long size = GetStreamSize(PollyStream); + Buffer.AddUninitialized(size); + PollyStream.read(reinterpret_cast(Buffer.GetData()), size); + return Buffer; +} \ No newline at end of file diff --git a/Source/AmazonPollyMetaHuman/Private/UnrealAWSUtils.h b/Source/AmazonPollyMetaHuman/Private/UnrealAWSUtils.h new file mode 100644 index 00000000..2bd7321e --- /dev/null +++ b/Source/AmazonPollyMetaHuman/Private/UnrealAWSUtils.h @@ -0,0 +1,45 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: MIT-0 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this + * software and associated documentation files (the "Software"), to deal in the Software + * without restriction, including without limitation the rights to use, copy, modify, + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#pragma once +#include "CoreMinimal.h" +#include + +namespace UnrealAWSUtils { + /** + * Converts FString to AwsString. + * NOTE: When setting text for a PollyRequest, this method should not be invoked inline. + * This causes crashes for longer text inputs. Create a Aws::String object and pass it + * into the PollyRequest. + * @param UnrealString - FString to be converted + * @return The converted AwsString + */ + Aws::String FStringToAwsString(const FString& UnrealString); + /** + * Converts AwsString to FString. + * @param AwsString - AwsString to be converted + * @return The converted FString + */ + FString AwsStringToFString(const Aws::String& AwsString); + /** + * Reads a Polly stream to fill a buffer. + * @param PollyStream - the stream returned by the call to Polly + * @return - the filled buffer + */ + TArray PreparePollyData(Aws::IOStream& PollyStream); +} diff --git a/Source/AmazonPollyMetaHuman/Private/Viseme.cpp b/Source/AmazonPollyMetaHuman/Private/Viseme.cpp new file mode 100644 index 00000000..c1c8ea0e --- /dev/null +++ b/Source/AmazonPollyMetaHuman/Private/Viseme.cpp @@ -0,0 +1,60 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: MIT-0 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this + * software and associated documentation files (the "Software"), to deal in the Software + * without restriction, including without limitation the rights to use, copy, modify, + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "Viseme.h" +#include "CaseSensitiveKeyFunc.h" + +DEFINE_LOG_CATEGORY(LogAmazonPollyViseme); + +/* +* Maps the FString representation of a viseme to its corresponding EViseme enum +* NOTE: A custom case-sensitive key-func is implemented to compare FStrings, as Visemes +* have both capital and lowercase versions, and the default FString comparison +* (uses ==) is case-insensitive +* @param String - an FString of the viseme +* @return - the EViseme enum corresponding to the FString +*/ +EViseme GetVisemeValueFromString(const FString& String) +{ + static TMap> VisemeMap = { + {TEXT("p"),EViseme::P}, + {TEXT("t"),EViseme::LowerT}, + {TEXT("S"),EViseme::S}, + {TEXT("T"),EViseme::T}, + {TEXT("f"),EViseme::F}, + {TEXT("k"),EViseme::K}, + {TEXT("i"),EViseme::I}, + {TEXT("r"),EViseme::R}, + {TEXT("s"),EViseme::LowerS}, + {TEXT("u"),EViseme::U}, + {TEXT("@"),EViseme::At}, + {TEXT("a"),EViseme::A}, + {TEXT("e"),EViseme::LowerE}, + {TEXT("E"),EViseme::E}, + {TEXT("o"),EViseme::LowerO}, + {TEXT("O"),EViseme::O}, + {TEXT("sil"),EViseme::Sil} + }; + auto Viseme = VisemeMap.Find(String); + if (!Viseme) + { + UE_LOG(LogAmazonPollyViseme, Error, TEXT("Tried to read an invalid viseme value. Returning Sil as default. Invalid value: %s"), *String); + return EViseme::Sil; + } + return *Viseme; +}; \ No newline at end of file diff --git a/Source/AmazonPollyMetaHuman/Private/VoiceId.cpp b/Source/AmazonPollyMetaHuman/Private/VoiceId.cpp new file mode 100644 index 00000000..08e12b37 --- /dev/null +++ b/Source/AmazonPollyMetaHuman/Private/VoiceId.cpp @@ -0,0 +1,123 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: MIT-0 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this + * software and associated documentation files (the "Software"), to deal in the Software + * without restriction, including without limitation the rights to use, copy, modify, + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "VoiceId.h" + +DEFINE_LOG_CATEGORY(LogAmazonPollyVoiceId); + +/* +* Returns a VoiceId enum to its corresponding VoiceId object with the same name +* @param VoiceId - enum to be mapped to the VoiceId object +* @return Aws::Polly::Model::VoiceId - VoiceId object to be used in configuring PollyRequest +*/ +Aws::Polly::Model::VoiceId ToPollyVoiceId(const EVoiceId VoiceId) +{ + switch (VoiceId) + { + case EVoiceId::Nicole: + return Aws::Polly::Model::VoiceId::Nicole; + case EVoiceId::Russell: + return Aws::Polly::Model::VoiceId::Russell; + case EVoiceId::Amy: + case EVoiceId::AmyNeural: + return Aws::Polly::Model::VoiceId::Amy; + case EVoiceId::Emma: + case EVoiceId::EmmaNeural: + return Aws::Polly::Model::VoiceId::Emma; + case EVoiceId::Brian: + case EVoiceId::BrianNeural: + return Aws::Polly::Model::VoiceId::Brian; + case EVoiceId::Aditi: + return Aws::Polly::Model::VoiceId::Aditi; + case EVoiceId::Raveena: + return Aws::Polly::Model::VoiceId::Raveena; + case EVoiceId::Ivy: + case EVoiceId::IvyNeural: + return Aws::Polly::Model::VoiceId::Ivy; + case EVoiceId::Joanna: + case EVoiceId::JoannaNeural: + return Aws::Polly::Model::VoiceId::Joanna; + case EVoiceId::Kendra: + case EVoiceId::KendraNeural: + return Aws::Polly::Model::VoiceId::Kendra; + case EVoiceId::Kimberly: + case EVoiceId::KimberlyNeural: + return Aws::Polly::Model::VoiceId::Kimberly; + case EVoiceId::Salli: + case EVoiceId::SalliNeural: + return Aws::Polly::Model::VoiceId::Salli; + case EVoiceId::Joey: + case EVoiceId::JoeyNeural: + return Aws::Polly::Model::VoiceId::Joey; + case EVoiceId::Justin: + case EVoiceId::JustinNeural: + return Aws::Polly::Model::VoiceId::Justin; + case EVoiceId::Matthew: + case EVoiceId::MatthewNeural: + return Aws::Polly::Model::VoiceId::Matthew; + case EVoiceId::Geraint: + return Aws::Polly::Model::VoiceId::Geraint; + default: + UE_LOG(LogAmazonPollyVoiceId, Error, TEXT("ToPollyVoiceId: Invalid VoiceId (EVoiceId Index: %d)."), VoiceId); + return Aws::Polly::Model::VoiceId::NOT_SET; + } +} + +/* +* Returns neural or standard voice engine depending on the voiceId +* @param VoiceId - enum to be mapped to the voice engine +* @return Aws::Polly::Model::Engine - Engine object to be used in configuring PollyRequest +*/ +Aws::Polly::Model::Engine ToPollyVoiceEngine(const EVoiceId VoiceId) +{ + switch (VoiceId) + { + case EVoiceId::Nicole: + case EVoiceId::Russell: + case EVoiceId::Amy: + case EVoiceId::Emma: + case EVoiceId::Brian: + case EVoiceId::Aditi: + case EVoiceId::Raveena: + case EVoiceId::Ivy: + case EVoiceId::Joanna: + case EVoiceId::Kendra: + case EVoiceId::Kimberly: + case EVoiceId::Salli: + case EVoiceId::Joey: + case EVoiceId::Justin: + case EVoiceId::Matthew: + case EVoiceId::Geraint: + return Aws::Polly::Model::Engine::standard; + case EVoiceId::AmyNeural: + case EVoiceId::EmmaNeural: + case EVoiceId::BrianNeural: + case EVoiceId::IvyNeural: + case EVoiceId::JoannaNeural: + case EVoiceId::KendraNeural: + case EVoiceId::KimberlyNeural: + case EVoiceId::SalliNeural: + case EVoiceId::JoeyNeural: + case EVoiceId::JustinNeural: + case EVoiceId::MatthewNeural: + return Aws::Polly::Model::Engine::neural; + default: + UE_LOG(LogAmazonPollyVoiceId, Error, TEXT("ToPollyVoiceEngine: Invalid VoiceId (EVoiceId Index: %d)."), VoiceId); + return Aws::Polly::Model::Engine::standard; + } +} \ No newline at end of file diff --git a/Source/AmazonPollyMetaHuman/Public/SpeechComponent.h b/Source/AmazonPollyMetaHuman/Public/SpeechComponent.h new file mode 100644 index 00000000..2e40fe4f --- /dev/null +++ b/Source/AmazonPollyMetaHuman/Public/SpeechComponent.h @@ -0,0 +1,228 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: MIT-0 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this + * software and associated documentation files (the "Software"), to deal in the Software + * without restriction, including without limitation the rights to use, copy, modify, + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#pragma once + +#include "CoreMinimal.h" +#include "Components/ActorComponent.h" +#include "Sound/SoundWaveProcedural.h" +#include +#include "PollyClient.h" +#include +#include "Runtime/Engine/Public/LatentActions.h" +#include "Viseme.h" +#include "VoiceId.h" +#include "SpeechComponent.generated.h" + +DECLARE_LOG_CATEGORY_EXTERN(LogPollyMsg, Log, All); + +/** +* Represents the multiple output pins that can be invoked +* on completion of the latent GenerateSpeech function. +*/ +UENUM(BlueprintType) +enum class EGenerateSpeechExecPins : uint8 { + Success UMETA(DisplayName = "Success"), + Failure UMETA(DisplayName = "Failure") +}; + +/** +* Struct containing a single viseme and its corresponding timestamp returned by Polly +* to be used in setting CurrentViseme and CurrentVisemeDurationSeconds states +*/ +struct VisemeEvent { + EViseme Viseme; + int TimeMilliseconds; +}; + +UCLASS(ClassGroup=(Custom), meta=(BlueprintSpawnableComponent)) +class AMAZONPOLLYMETAHUMAN_API USpeechComponent : public UActorComponent +{ + GENERATED_BODY() + +public: + /** + * Default constructor. + */ + USpeechComponent(); + /** + * Initializes the component. See UActorComponent::InitializeComponent for details. + */ + virtual void InitializeComponent() override; + /** + * Blueprint function for calling Polly API to generate Viseme/Audio data. + * One of the GenerateSpeech* functions must be called before StartSpeech() function. + * @param WorldContextObject description + * @param Text - the text to be synthesized by Polly (the maximum length of input text can be up to 3000 characters) + * @param VoiceId - enum for VoiceId for use in calling Polly + * @param LatentInfo description + * @param parameter-name description + */ + UFUNCTION( + BlueprintCallable, + Category = "Amazon Polly", + Meta = ( + Latent, + LatentInfo = "LatentInfo", + HidePin = "WorldContextObject", + DefaultToSelf = "WorldContextObject", + ExpandEnumAsExecs = "EGenerateSpeechExecPins" + ) + ) + void GenerateSpeech( + UObject* WorldContextObject, + const FString Text, + const EVoiceId VoiceId, + struct FLatentActionInfo LatentInfo, + EGenerateSpeechExecPins& EGenerateSpeechExecPins + ); + /** + * Starts the Animation playback and returns an Audio object to be played in Blueprints. + * GenerateSpeech function must be called beforehand. + * @return A USoundWaveProcedural object containing the audio synthesized from Polly + */ + UFUNCTION(BlueprintCallable, Category = "Amazon Polly") + USoundWaveProcedural* StartSpeech(); + /** + * Returns the current viseme corresponding to the last invocation of StartSpeech. Assuming + * the sound returned by StartSpeech began playback immediately following its creation, the + * current viseme returned by this function should be synchronized to the current sound + * being played. + * + * @return the current viseme + */ + UFUNCTION(BlueprintPure, Category = "Amazon Polly") + EViseme GetCurrentViseme(); + /** + * Returns true if the speech component is still playing a viseme sequence + * + * @return true if the speech component is still playing a viseme sequence + */ + UFUNCTION(BlueprintPure, Category = "Amazon Polly") + bool IsSpeaking(); + +protected: + /** + * Blueprint function for calling Polly API to generate Viseme/Audio data. + * One of the GenerateSpeech* functions must be called before StartSpeech() function. + * @param text - the text to be synthesized by Polly (the maximum length of input text can be up to 3000 characters) + * @param VoiceId - enum for VoiceId for use in calling Polly + */ + virtual void GenerateSpeechSync(const FString text, const EVoiceId VoiceId); + /** + * Each time this method is called it plays back the next viseme in the speech. + */ + virtual void PlayNextViseme(); + /** + * Enum representing a single viseme state, to be used in setting a Viseme variable in Blueprints + */ + EViseme CurrentViseme; + /** + * Enum representing a VoiceId to set a voice when calling Polly + */ + EVoiceId Voice_ID; + /** + * Boolean flag to keep GenerateSpeech from being invocated while the Actor is speaking + */ + bool bIsSpeaking = false; + /** + * Index variable used to iterate through VisemeDataArray in UpdateVisemeAndDurationStates function + */ + int CurrentVisemeIndex; + /** + * Buffer containing audio data from Polly stream + */ + TArray Audiobuffer; + /** + * PollyClient state for calling Polly SDK + */ + TUniquePtr MyPollyClient; + /** + * Array containing custom data structure that holds viseme and time data for each Viseme from Polly + */ + TArray VisemeEventArray; + +private: + /** + * Calls the PollyClient to generate Polly Audio data + * @param text - the text synthesized by Polly + * @param VoiceId - the voice of the synthesized audio + * @return bool - boolean indicating success/failure of Polly call + */ + bool SynthesizeAudio(const FString& text, const EVoiceId VoiceId); + /** + * Calls the PollyClient to generate Polly Viseme data + * @param text - the text synthesized by Polly + * @param VoiceId - the voice of the synthesized data + * @return bool - boolean indicating success/failure of Polly call + */ + bool SynthesizeVisemes(const FString& text, const EVoiceId VoiceId); + /** + * Returns a PollyRequest that is configured to return pcm audio data with a given text and VoiceId + * @param text - the text to be synthesized (SetText) + * @param VoiceId - the VoiceId for the synthesized audio + * @return PollyRequest - the configured PollyRequest + */ + Aws::Polly::Model::SynthesizeSpeechRequest CreatePollyAudioRequest(const FString& text, const EVoiceId VoiceId) const; + /** + * Returns a PollyRequest that is configured to return viseme and timestamp data in a json format + * @param text - the text to be synthesized (SetText) + * @param VoiceId - the VoiceId for the synthesized audio + * @return PollyRequest - the configured PollyRequest + */ + Aws::Polly::Model::SynthesizeSpeechRequest CreatePollyVisemeRequest(const FString& text, const EVoiceId VoiceId) const; + /** + * Fills the VisemeEventArray with VisemeEvent objects containing visemes and corresponding timestamps + * @param VisemeJson - FString containing Polly json viseme data ( example: {"time":125,"type":"viseme","value":"k"} ) + */ + void GenerateVisemeEvents(FString VisemeJson); + /** + * Returns a USoundWave object containing the Polly Audio for playback in Blueprints + * @return USoundWaveProcedural - Sound wave object containing Polly Audio + */ + USoundWaveProcedural* QueuePollyAudio(); + /** + * Timer handle for use in creating/clearing timers + */ + FTimerHandle CountdownTimerHandle; + /* + * Clock representing the start time of the StartSpeech call + */ + std::chrono::steady_clock::time_point StartTimePoint; + /* + * Sets a timer with a delay for next call to PlayNextViseme + * @param CurrentVisemeDurationSeconds - the delay + */ + virtual void SetTimer(float CurrentVisemeDurationSeconds); + /* + * Clears the timer + */ + virtual void ClearTimer(); + /* + * Initializes the UnrealPollyClient + */ + virtual void InitializePollyClient(); + /* + * Mutex for thread-safe mutation of internal state. + */ + FCriticalSection Mutex; + // FGenerateSpeechAction is a friend class so that it can invoke the + // protected GenerateSpeechSync function in a separate thread, which + // is required to make GenerateSpeech a non-blocking latent function. + friend class FGenerateSpeechAction; +}; diff --git a/Source/AmazonPollyMetaHuman/Public/Viseme.h b/Source/AmazonPollyMetaHuman/Public/Viseme.h new file mode 100644 index 00000000..ed01cca7 --- /dev/null +++ b/Source/AmazonPollyMetaHuman/Public/Viseme.h @@ -0,0 +1,59 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: MIT-0 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this + * software and associated documentation files (the "Software"), to deal in the Software + * without restriction, including without limitation the rights to use, copy, modify, + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#pragma once + +DECLARE_LOG_CATEGORY_EXTERN(LogAmazonPollyViseme, Log, All); + +/** +* Enum representing a single viseme to be used in +* setting of CurrentViseme state and for selecting +* the correct pose in the Anim Graph through a Blend Enum function +*/ +UENUM(BlueprintType) +enum class EViseme : uint8 +{ + Sil UMETA(DisplayName = "Sil"), + P UMETA(DisplayName = "P"), + LowerT UMETA(DisplayName = "LowerT"), + S UMETA(DisplayName = "S"), + T UMETA(DisplayName = "T"), + F UMETA(DisplayName = "F"), + K UMETA(DisplayName = "K"), + I UMETA(DisplayName = "I"), + R UMETA(DisplayName = "R"), + LowerS UMETA(DisplayName = "LowerS"), + U UMETA(DisplayName = "U"), + At UMETA(DisplayName = "@"), + A UMETA(DisplayName = "A"), + E UMETA(DisplayName = "E"), + LowerE UMETA(DisplayName = "LowerE"), + O UMETA(DisplayName = "O"), + LowerO UMETA(DisplayName = "LowerO") +}; + +/** + * Returns the enum represetnation of the viseme given + * the string representation of the viseme. Note that the + * string representation is that returned by Amazon Polly, + * not the DisplayName corresponding to the EViseme. + * + * @param String the string representation of the viseme + * @return EViseme the enum represetnation of the viseme + */ +EViseme GetVisemeValueFromString(const FString& String); \ No newline at end of file diff --git a/Source/AmazonPollyMetaHuman/Public/VoiceId.h b/Source/AmazonPollyMetaHuman/Public/VoiceId.h new file mode 100644 index 00000000..803ff1af --- /dev/null +++ b/Source/AmazonPollyMetaHuman/Public/VoiceId.h @@ -0,0 +1,77 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: MIT-0 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this + * software and associated documentation files (the "Software"), to deal in the Software + * without restriction, including without limitation the rights to use, copy, modify, + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#pragma once + +#include + +DECLARE_LOG_CATEGORY_EXTERN(LogAmazonPollyVoiceId, Log, All); + +/** +* Enum representing a VoiceId to set a voice when calling Polly +* to allow selection of a VoiceId within Blueprints +* when calling GenerateSpeech. +* Visit https://docs.aws.amazon.com/polly/latest/dg/voicelist.html for more voice options. +*/ +UENUM(BlueprintType) +enum class EVoiceId : uint8 +{ + Nicole UMETA(DisplayName = "Nicole (Standard, Female, English, Australian)"), + Russell UMETA(DisplayName = "Russell (Standard, Male, English, Australian)"), + Amy UMETA(DisplayName = "Amy (Standard, Female, English, British)"), + AmyNeural UMETA(DisplayName = "Amy (Neural, Female, English, British)"), + Emma UMETA(DisplayName = "Emma (Standard, Female, English, British)"), + EmmaNeural UMETA(DisplayName = "Emma (Neural, Female, English, British)"), + Brian UMETA(DisplayName = "Brian (Standard, Male, English, British)"), + BrianNeural UMETA(DisplayName = "Brian (Neural, Male, English, British)"), + Aditi UMETA(DisplayName = "Aditi (Standard, Female, English, Indian)"), + Raveena UMETA(DisplayName = "Raveena (Standard, Female, English, Indian)"), + Ivy UMETA(DisplayName = "Ivy (Standard, Female Child, English, US)"), + IvyNeural UMETA(DisplayName = "Ivy (Neural, Female Child, English, US)"), + Joanna UMETA(DisplayName = "Joanna (Standard, Female, English, US)"), + JoannaNeural UMETA(DisplayName = "Joanna (Neural, Female, English, US)"), + Kendra UMETA(DisplayName = "Kendra (Standard, Female, English, US)"), + KendraNeural UMETA(DisplayName = "Kendra (Neural, Female, English, US)"), + Kimberly UMETA(DisplayName = "Kimberly (Standard, Female, English, US)"), + KimberlyNeural UMETA(DisplayName = "Kimberly (Neural, Female, English, US)"), + Salli UMETA(DisplayName = "Salli (Standard, Female, English, US)"), + SalliNeural UMETA(DisplayName = "Salli (Neural, Female, English, US)"), + Joey UMETA(DisplayName = "Joey (Standard, Male, English, US)"), + JoeyNeural UMETA(DisplayName = "Joey (Neural, Male, English, US)"), + Justin UMETA(DisplayName = "Justin (Standard, Male Child, English, US)"), + JustinNeural UMETA(DisplayName = "Justin (Neural, Male Child, English, US)"), + Matthew UMETA(DisplayName = "Matthew (Standard, Male, English, US)"), + MatthewNeural UMETA(DisplayName = "Matthew (Neural, Male, English, US)"), + Geraint UMETA(DisplayName = "Geraint (Standard, Male, English, Welsh)") +}; + +/** + * Returns the Amazon Polly VoiceId enum corresponding to the + * given module specific EVoiceId enum. + * + * @param VoiceId the module specific EVoiceId enum + * @return Aws::Polly::Model::VoiceId the Amazon Polly VoiceId enum + */ +Aws::Polly::Model::VoiceId ToPollyVoiceId(const EVoiceId VoiceId); + +/** + * Returns neural or standard voice engine depending on the voiceId + * @param VoiceId - enum to be mapped to the voice engine + * @return Aws::Polly::Model::Engine - Engine object to be used in configuring PollyRequest + */ +Aws::Polly::Model::Engine ToPollyVoiceEngine(const EVoiceId VoiceId); \ No newline at end of file diff --git a/Source/AmazonPollyMetaHuman/ThirdParty/AwsSdk/BuildAwsSdkMac.sh b/Source/AmazonPollyMetaHuman/ThirdParty/AwsSdk/BuildAwsSdkMac.sh new file mode 100755 index 00000000..2c1f33d5 --- /dev/null +++ b/Source/AmazonPollyMetaHuman/ThirdParty/AwsSdk/BuildAwsSdkMac.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" +SDK_REPO_DIR="$SCRIPT_DIR/aws-sdk-cpp" +SDK_BUILD_DIR="$SDK_REPO_DIR/_build" +SDK_INSTALL_DIR="$SDK_REPO_DIR/_install" +MODULE_MAC_DIR="$SCRIPT_DIR/Mac" + +# Clone the repo +cd "$SCRIPT_DIR" +git clone --recurse-submodules https://github.com/aws/aws-sdk-cpp.git + +# Create build and install directories where we will build and install the SDK to +cd "$SDK_REPO_DIR" +mkdir "$SDK_BUILD_DIR" +mkdir "$SDK_INSTALL_DIR" + +# Build the SDK +cd "$SDK_BUILD_DIR" +cmake "$SDK_REPO_DIR" -DCMAKE_INSTALL_PREFIX="$SDK_INSTALL_DIR" -DBUILD_ONLY="polly" -DCUSTOM_MEMORY_MANAGEMENT=ON +make + +# Install the SDK +make install + +# Remove any previous builds from the platform specific directory +mkdir $MODULE_MAC_DIR +rm -rf "$MODULE_MAC_DIR"/* + +# Copy the new build to the platform specific directory +cp -R "$SDK_INSTALL_DIR"/include "$MODULE_MAC_DIR"/include +mkdir "$MODULE_MAC_DIR"/lib +ls -1 "$SDK_INSTALL_DIR"/lib/*.dylib | xargs -L1 -I{} cp {} "$MODULE_MAC_DIR"/lib/ + +# Remove the cloned repo, build, and install directory. +rm -rf "$SDK_REPO_DIR" diff --git a/Source/AmazonPollyMetaHuman/ThirdParty/AwsSdk/BuildAwsSdkWin64.bat b/Source/AmazonPollyMetaHuman/ThirdParty/AwsSdk/BuildAwsSdkWin64.bat new file mode 100644 index 00000000..fdc2a4ab --- /dev/null +++ b/Source/AmazonPollyMetaHuman/ThirdParty/AwsSdk/BuildAwsSdkWin64.bat @@ -0,0 +1,72 @@ +SET EXITCODE=0 + +SET SCRIPT_DIR=%~dp0 +SET SDK_REPO_DIR=%SCRIPT_DIR%aws-sdk-cpp\ +SET SDK_BUILD_DIR=%SDK_REPO_DIR%_build\ +SET SDK_INSTALL_DIR=%SDK_REPO_DIR%_install\ +SET MODULE_WIN64_DIR=%SCRIPT_DIR%Win64\ + +@REM Find and run VsDevCmd.bat to add the msbuild command to Path +SET VS_INSTALLPATH= +IF EXIST "%programfiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" ( + FOR /F "tokens=* USEBACKQ" %%F IN ( + `"%programfiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -version 16.0 -property installationPath` + ) DO ( + SET VS_INSTALLPATH=%%F + ) +) +CALL "%VS_INSTALLPATH%\Common7\Tools\VsDevCmd.bat" + +@REM Clone the repo +IF NOT EXIST "%SDK_REPO_DIR%" ( + PUSHD "%SCRIPT_DIR%" + git clone -c core.longpaths=true --recurse-submodules https://github.com/aws/aws-sdk-cpp.git + IF %ERRORLEVEL% NEQ 0 ( POPD & GOTO FAILED ) + POPD + + PUSHD "%SDK_REPO_DIR%" + IF %ERRORLEVEL% NEQ 0 ( POPD & GOTO FAILED ) + POPD +) + +@REM Create build and install directories where we will build and install the SDK to +IF EXIST "%SDK_BUILD_DIR%" ( RMDIR /Q /S "%SDK_BUILD_DIR%" ) +MKDIR "%SDK_BUILD_DIR%" +IF EXIST "%SDK_INSTALL_DIR%" ( RMDIR /Q /S "%SDK_INSTALL_DIR%" ) +MKDIR "%SDK_INSTALL_DIR%" + +@REM Build and install the SDK +PUSHD "%SDK_BUILD_DIR%" +cmake .. -G "Visual Studio 16 2019" -DBUILD_ONLY=polly -DCUSTOM_MEMORY_MANAGEMENT=ON -DCMAKE_INSTALL_PREFIX="%SDK_INSTALL_DIR%" +IF %ERRORLEVEL% NEQ 0 ( POPD & GOTO FAILED ) +msbuild ALL_BUILD.vcxproj /p:Configuration=Release /p:DebugSymbols=true +IF %ERRORLEVEL% NEQ 0 ( POPD & GOTO FAILED ) +msbuild INSTALL.vcxproj /p:Configuration=Release /p:DebugSymbols=true +IF %ERRORLEVEL% NEQ 0 ( POPD & GOTO FAILED ) +POPD + +@REM Remove any previous builds from the platform specific directory +IF EXIST "%MODULE_WIN64_DIR%" ( RMDIR /Q /S "%MODULE_WIN64_DIR%" ) +IF %ERRORLEVEL% NEQ 0 ( GOTO FAILED ) +MKDIR "%MODULE_WIN64_DIR%" +IF %ERRORLEVEL% NEQ 0 ( GOTO FAILED ) + +@REM Copy the new build to the platform specific directory +xcopy "%SDK_INSTALL_DIR%include" "%MODULE_WIN64_DIR%include" /E/H/C/I +MKDIR "%MODULE_WIN64_DIR%"bin +MKDIR "%MODULE_WIN64_DIR%"lib +xcopy "%SDK_INSTALL_DIR%"bin\*.dll "%MODULE_WIN64_DIR%bin" /E/H/C/I +xcopy "%SDK_BUILD_DIR%"bin\Release\*.pdb "%MODULE_WIN64_DIR%bin" /E/H/C/I +@REM Some of the libs are built to the bin folder for some weird reason +xcopy "%SDK_INSTALL_DIR%"bin\*.lib "%MODULE_WIN64_DIR%lib" +xcopy "%SDK_INSTALL_DIR%"lib\*.lib "%MODULE_WIN64_DIR%lib" + +@REM Remove the cloned repo, build, and install directory. +RMDIR /Q /S "%SDK_REPO_DIR%" + +GOTO SUCCESS + +:FAILED +set EXITCODE=1 +:SUCCESS +EXIT /B %EXITCODE% \ No newline at end of file diff --git a/Source/AmazonPollyMetaHumanEditor.Target.cs b/Source/AmazonPollyMetaHumanEditor.Target.cs new file mode 100644 index 00000000..dac30645 --- /dev/null +++ b/Source/AmazonPollyMetaHumanEditor.Target.cs @@ -0,0 +1,31 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: MIT-0 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this + * software and associated documentation files (the "Software"), to deal in the Software + * without restriction, including without limitation the rights to use, copy, modify, + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +using UnrealBuildTool; +using System.Collections.Generic; + +public class AmazonPollyMetaHumanEditorTarget : TargetRules +{ + public AmazonPollyMetaHumanEditorTarget(TargetInfo Target) : base(Target) + { + Type = TargetType.Editor; + DefaultBuildSettings = BuildSettingsVersion.V2; + + ExtraModuleNames.AddRange( new string[] { "AmazonPollyMetaHuman" } ); + } +}