From 3c6cf1d400041508d7dbcce64e07f9d1334bc877 Mon Sep 17 00:00:00 2001 From: Justin John <34035011+justinjohn0306@users.noreply.github.com> Date: Fri, 13 Oct 2023 08:26:49 +0530 Subject: [PATCH] Add files via upload --- .../__pycache__/generate_batch.cpython-38.pyc | Bin 0 -> 3495 bytes .../generate_facerender_batch.cpython-38.pyc | Bin 0 -> 4073 bytes .../test_audio2coeff.cpython-38.pyc | Bin 0 -> 3921 bytes .../__pycache__/audio2exp.cpython-38.pyc | Bin 0 -> 1294 bytes .../__pycache__/networks.cpython-38.pyc | Bin 0 -> 2149 bytes .../src/audio2exp_models/audio2exp.py | 41 +++++ .../src/audio2exp_models/networks.py | 74 +++++++++ .../__pycache__/audio2pose.cpython-38.pyc | Bin 0 -> 2866 bytes .../__pycache__/audio_encoder.cpython-38.pyc | Bin 0 -> 2176 bytes .../__pycache__/cvae.cpython-38.pyc | Bin 0 -> 4699 bytes .../__pycache__/discriminator.cpython-38.pyc | Bin 0 -> 2464 bytes .../__pycache__/networks.cpython-38.pyc | Bin 0 -> 4751 bytes .../__pycache__/res_unet.cpython-38.pyc | Bin 0 -> 1924 bytes .../src/audio2pose_models/audio2pose.py | 94 +++++++++++ .../src/audio2pose_models/audio_encoder.py | 64 ++++++++ .../SadTalker/src/audio2pose_models/cvae.py | 149 ++++++++++++++++++ .../src/audio2pose_models/discriminator.py | 76 +++++++++ .../src/audio2pose_models/networks.py | 140 ++++++++++++++++ .../src/audio2pose_models/res_unet.py | 65 ++++++++ 19 files changed, 703 insertions(+) create mode 100644 animation/SadTalker/src/__pycache__/generate_batch.cpython-38.pyc create mode 100644 animation/SadTalker/src/__pycache__/generate_facerender_batch.cpython-38.pyc create mode 100644 animation/SadTalker/src/__pycache__/test_audio2coeff.cpython-38.pyc create mode 100644 animation/SadTalker/src/audio2exp_models/__pycache__/audio2exp.cpython-38.pyc create mode 100644 animation/SadTalker/src/audio2exp_models/__pycache__/networks.cpython-38.pyc create mode 100644 animation/SadTalker/src/audio2exp_models/audio2exp.py create mode 100644 animation/SadTalker/src/audio2exp_models/networks.py create mode 100644 animation/SadTalker/src/audio2pose_models/__pycache__/audio2pose.cpython-38.pyc create mode 100644 animation/SadTalker/src/audio2pose_models/__pycache__/audio_encoder.cpython-38.pyc create mode 100644 animation/SadTalker/src/audio2pose_models/__pycache__/cvae.cpython-38.pyc create mode 100644 animation/SadTalker/src/audio2pose_models/__pycache__/discriminator.cpython-38.pyc create mode 100644 animation/SadTalker/src/audio2pose_models/__pycache__/networks.cpython-38.pyc create mode 100644 animation/SadTalker/src/audio2pose_models/__pycache__/res_unet.cpython-38.pyc create mode 100644 animation/SadTalker/src/audio2pose_models/audio2pose.py create mode 100644 animation/SadTalker/src/audio2pose_models/audio_encoder.py create mode 100644 animation/SadTalker/src/audio2pose_models/cvae.py create mode 100644 animation/SadTalker/src/audio2pose_models/discriminator.py create mode 100644 animation/SadTalker/src/audio2pose_models/networks.py create mode 100644 animation/SadTalker/src/audio2pose_models/res_unet.py diff --git a/animation/SadTalker/src/__pycache__/generate_batch.cpython-38.pyc b/animation/SadTalker/src/__pycache__/generate_batch.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5a80ca8fe5b37543fd7866d2c7262b6d9e6d22af GIT binary patch literal 3495 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 HszLpKjr~}k literal 0 HcmV?d00001 diff --git a/animation/SadTalker/src/__pycache__/generate_facerender_batch.cpython-38.pyc b/animation/SadTalker/src/__pycache__/generate_facerender_batch.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6f4e38c308dd40f08e904beddcc767040b6410f9 GIT binary patch literal 4073 zcmai0&2Jn@6|d@#nVwINzsHWf@p_Xb1KP0J1QvqjT`5r@5?I+y!Y(6+rZd&!v^`(0 zE@LOEzTgCw!;0*Uec&xSg8~l ze%<}cVKT?qKWK6Gm&f8`eDOAbV1jp8GaGr+!rJQCU8m`A!r2|Sn``E}`DVWBH9dpl zokFu<_=?yo0ap{AC_LxQvM7qubJnbgvZ!FJimI5vI3f6b)|foTeQcw_Q}=E+*a{nV zYDN9D8g;k)AokmxexR;@kQS5-dU3liyZ<73#{Tosoz!W`{@|E###-eJYv8+p1$?*g z#cdnU;YnGsZ9cRNv^6{8!df6`FR-MN?HMess}V~klrwZSKjKME<%W4(!)#J{dh(FQ z!my|(bxD_m)3%SSWKvHKOTslYEdwei0$O%KlQXIEReEuFG&5x7gie*C$oBHglDhd=X&qI#!>oz9BNw6 z>hhtL%qx<4{zT@wu8(CtvJr*b~eiA=OUVVjFq~8K`obZHG?OnNg_r{M^gJxU*-LBJBMLDyTCvaA57;N{ zQ}#LAV#(52;$&GbLo2hmudbI5InG{6-cqJB63FTvSWiB?%zcJBH^S!?OsQ+=yl!G`SJYB|~$`&|Cmbenj&aH2D$D zWkYk>&@6#w0-?OTaa=*j9sd_UiJ)Z1h&|S@k1Y%tg0PZ^(sJD2ldaH?DCkqCz1Qia z#a2ITxBcs)+daMmqT{C8!nJb9vjEiJYBy;h*Y9zIC+Bp6`Wmyk5IV2fYfOoUyXW$ zJ>`?GjWuf7I#am8Ok^0N^^7Du7(kRb>i7J(6?9;>SVgc&w=Xcq-az(SAb_4ozY}AF z`!W#GUM!a(MAL)QWKudJP(kXT-dvMa+L}1)nZAnC+1DM=7g0+!tIz{k)35LQ zy@9+)C#?{88{lguKgICPqgyvOAI71KH@EkozRlbH{T?|~ym_nNHTn(3=KVlC2s%5V ze2*?UU2ev*wK;yh-ws-#golLEH&pm~Tq`7crm~iLWp>-QsIVNkEG5qi#@w?PQ+fjy4L9O6reH;%zwcLz;hw zz;y!O1pxLln*S7_SsBY=Vp7r*GKqdkGZIUF0Ps1!I0wM^3N&qSEqeI)M|&q4Ca=?M z8@<>9`y*3aS(W~hIr^DrHdt6k{c65QzC-N@cY zHRTN}kO0OCE0`E7)Dy07IgE?zzJM?&z*c6JhIM)p>|%GL9zbva{6nxKL#VI|D-}^u zd{bNEQ#(mg#&7VQ8tA=q43x#^c~*h}ZkSuhZkdIQU2;bKX(=ma6zK=XNXXu(Os+vR z%cphI-^zsA#9^7K$h9AlWTyW|P%I+gYFrZj6?2gaDMoJ*@n7K4Xn1S|qoGyeJC>BB zH`A_6B@P0>(l8q}(VXqp$&6@lU>srX*m4uJmUc(&&6wV%X3x<7OxZ)6ftJ%9g;Y-G z?la*ed6mPtun)CnS!1DAgFILRS3a^2`8-~}`**w@bIo@gw4+Pf7I0RQDzSSvPWBk~ z?vZ9P%;?24BMqIr_$A-HsfroRAvC6nq)Tqx|5R@{>(8%f?!0q;cfRf#2n8}>=EY>} zEqvzJD5Z8M>}78CW1zC=ze2N{0BIqFQ=3|r+QH*k{+f`vAnOg>fsA^pQE5(%ioOW9 zWEf`2fl8G82%tHE!segd`h>Rb(N^WmR&UTOj;P|ju1S4qE<-eHqm2PdiE;R5X?$Q1 ztCK~nP~s_{oQc1mU@7p$>i`Vpfl5PGE~vCjaR<0MpEKpf!>o=1LH`--l~FRXA~J=Q zq_Z0Njg1XS3FMBX#!^ybG-`4cL+V0XgQrG`seSM6&$C`HAMcoER#FZ;ZS>^#h{Z$C zHh6k9>dWubE>$CwFijYm8_&GRyv?M4Zw+0|UMF0q0u!$QPysAMYQQYlj!VzC#e1IX G<^Kneoe(|% literal 0 HcmV?d00001 diff --git a/animation/SadTalker/src/__pycache__/test_audio2coeff.cpython-38.pyc b/animation/SadTalker/src/__pycache__/test_audio2coeff.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2c2726877d509a40e17371f5f8f8b98c650f6fa6 GIT binary patch literal 3921 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 bdVTUY2p@`eTi@a$D5ovZ2Lb6n;WqyZO4J0) literal 0 HcmV?d00001 diff --git a/animation/SadTalker/src/audio2exp_models/__pycache__/audio2exp.cpython-38.pyc b/animation/SadTalker/src/audio2exp_models/__pycache__/audio2exp.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e28abe8401f16067cd5c2eee501ab0780e77ebad GIT binary patch literal 1294 zcmZ`&OK;pZ5avr-t*qTV`ZQ4VmI7O#Irz{5K@g;Hnw)ABNOBRjB@~gnmZQg-TGw`gb_9+_9L}eY!;ddVqm+O($M^J~f{;J(fkka|&->(}v}Yl4nE-6}=%U((Hhr@mwhOoJ`_1)RGAe!X2t+ z4+7SEfFM-0C^CG-!4_v?RqGE{ImUXOk!htLvG;UYY^A1nWLp7`-Trmd+Fa(9UJuS^JKLp_FA^ zSS#f_^4Cwh52i1zHg5kjFE0mq?b`2m{tJU;*plIC_Y9A90ApoU9^89aGE;CC<2t&e#+3<8Q0jGY|;*h56XWN_+y*3~L8~7H^}7 zVCKpXAPac^S&=|R@;|wuADnYFR9vNM>q4wjPtJu;ed31~e6{5xzcr`d0LQ}}mAU93 z_7SWd{mLr3%6tY#KHdvy)vD@9HqbvqVZZC%;fbE6R}Fp;xY4uqW0=hoQ@E;=bGLpE zw*CQYZi5SBJc+W?vzdhBQz-o6q_VxJ_6txI_BlkRXy-bJqe>t5!U>VC7!C+qixc!fESJ1om@qge5ekDHH5t_9@??pRwC)%re19_FnMQ@wJ$+ zY(k$-V!SnN(P+3esYGEeYm74~50^!~$@JPZ_W(bPF0VwX>srbiY>umw zi8Ypxf|OJE1suFb|E0ci+7ovUz*n;mZ>-R(uI{RS)mGK_&HYX%WN5>a_vNI`*q@}V zHV4XGbiEHDnBY0<%|<@7EXLW;?m3(+R?dc2&*JP`CT!vS#)KoSf&0wvd9b*`gT6xJa*h1ex*WW=@>=_&II;dN}bIvO3+(vh5UR$+YJGDD;p}Vy;;S;N7 zu?NkcFwBD5gKX74WGGmdUGV*=ZCpJbNo9gK&WfyxV`bqH6L#gJu`H@A$(2op_SZ?3 zKHM+Wa95Zxg{$#{yiAXc^P~L!zOj?EGJ%ph6XPT|{#eTxrYJOymieKv)2uK~T8=Bz zK9;JGd91TjX*^x2Oi1I85+SnUNUh;9)u9)iL>+149iPy6!A&cU(>&2SjxX5XzwCY9 zzptgz{lQpQS^t~zq{z!e=>A?g9KjDQMZcSfgCxgucZNw;T&jJo(ta`)S-C5pjN)M_ zWUl*#tWHXGtanCFl?Ml?>rDv8*SW(tdGL?tgxuq&8?#L9EJBu2$QF&FMSTxle+*Hx zb5`>SKSMeOTx}y!{4>^Qmb#5qo08RKwbey2cA28`i5x{)zYK>$iL=O7>lh4wVr+y` zZPS)U+$6JqSSmzIkkgt1$vF8NSRN0p)AhO6^G%U;@8H6tycfw(#<2-wio`gl`C1%5 zLLO%;O*GV-^g?HzgH+}@O6BtX8(3B3L{lv;CYt_6z}LgZl0tc@Eiv*T%u9@LVg13E zI9YoIPJFY`&4!~~{;ZM_3iqd7LZPQ*HC9E+SKgrcb#zLGz5$JpbIvC~euElE;5Fcp zF1?hCh;>@coE$pFPvv*p8^wl%3vV_>vUY-dB>8oc# zvDR2R^IO-T(|V&%IzTxwfhX35-!Oq+S%cubg(CC^q1c#!@2K3O&HX8bYWg+_3KpvD zH4JKt#5ITmRO8E*rY@&=S#kZ_068h#}-aG5|>GqWxyM+3pZs{iSmsnyCT~`nbsGswipIZW; z7uLi&12+TYs}`rWuUKrHbt-q@fyuFYMD^ml05P1owM!H+z?bJHNCKmM6W^?fedg63 z^5^b1!JYn#)}#S=utheE0`(DmGS1^no`8mlZhbK0!vwIoLo04os`MeaIjQg&AbaG` z0(gs-Z6yzltCA`!du`0)`C-GKDhlTc{2SyGLo}h7QO|Z0;#>R{KYjgbIOiOs-g^0( zOBQ(-3*^L{MYe7$vfwX$ilKL{aeSvJb`Hly3jYdxrl^EWcxf>Fp7DNY7_BL)=7trY Zm-S(SFJ{E|B^9ZruWta~*Q~AU{{g%><4yno literal 0 HcmV?d00001 diff --git a/animation/SadTalker/src/audio2exp_models/audio2exp.py b/animation/SadTalker/src/audio2exp_models/audio2exp.py new file mode 100644 index 0000000..9e79a92 --- /dev/null +++ b/animation/SadTalker/src/audio2exp_models/audio2exp.py @@ -0,0 +1,41 @@ +from tqdm import tqdm +import torch +from torch import nn + + +class Audio2Exp(nn.Module): + def __init__(self, netG, cfg, device, prepare_training_loss=False): + super(Audio2Exp, self).__init__() + self.cfg = cfg + self.device = device + self.netG = netG.to(device) + + def test(self, batch): + + mel_input = batch['indiv_mels'] # bs T 1 80 16 + bs = mel_input.shape[0] + T = mel_input.shape[1] + + exp_coeff_pred = [] + + for i in tqdm(range(0, T, 10),'audio2exp:'): # every 10 frames + + current_mel_input = mel_input[:,i:i+10] + + #ref = batch['ref'][:, :, :64].repeat((1,current_mel_input.shape[1],1)) #bs T 64 + ref = batch['ref'][:, :, :64][:, i:i+10] + ratio = batch['ratio_gt'][:, i:i+10] #bs T + + audiox = current_mel_input.view(-1, 1, 80, 16) # bs*T 1 80 16 + + curr_exp_coeff_pred = self.netG(audiox, ref, ratio) # bs T 64 + + exp_coeff_pred += [curr_exp_coeff_pred] + + # BS x T x 64 + results_dict = { + 'exp_coeff_pred': torch.cat(exp_coeff_pred, axis=1) + } + return results_dict + + diff --git a/animation/SadTalker/src/audio2exp_models/networks.py b/animation/SadTalker/src/audio2exp_models/networks.py new file mode 100644 index 0000000..f052e18 --- /dev/null +++ b/animation/SadTalker/src/audio2exp_models/networks.py @@ -0,0 +1,74 @@ +import torch +import torch.nn.functional as F +from torch import nn + +class Conv2d(nn.Module): + def __init__(self, cin, cout, kernel_size, stride, padding, residual=False, use_act = True, *args, **kwargs): + super().__init__(*args, **kwargs) + self.conv_block = nn.Sequential( + nn.Conv2d(cin, cout, kernel_size, stride, padding), + nn.BatchNorm2d(cout) + ) + self.act = nn.ReLU() + self.residual = residual + self.use_act = use_act + + def forward(self, x): + out = self.conv_block(x) + if self.residual: + out += x + + if self.use_act: + return self.act(out) + else: + return out + +class SimpleWrapperV2(nn.Module): + def __init__(self) -> None: + super().__init__() + self.audio_encoder = nn.Sequential( + Conv2d(1, 32, kernel_size=3, stride=1, padding=1), + Conv2d(32, 32, kernel_size=3, stride=1, padding=1, residual=True), + Conv2d(32, 32, kernel_size=3, stride=1, padding=1, residual=True), + + Conv2d(32, 64, kernel_size=3, stride=(3, 1), padding=1), + Conv2d(64, 64, kernel_size=3, stride=1, padding=1, residual=True), + Conv2d(64, 64, kernel_size=3, stride=1, padding=1, residual=True), + + Conv2d(64, 128, kernel_size=3, stride=3, padding=1), + Conv2d(128, 128, kernel_size=3, stride=1, padding=1, residual=True), + Conv2d(128, 128, kernel_size=3, stride=1, padding=1, residual=True), + + Conv2d(128, 256, kernel_size=3, stride=(3, 2), padding=1), + Conv2d(256, 256, kernel_size=3, stride=1, padding=1, residual=True), + + Conv2d(256, 512, kernel_size=3, stride=1, padding=0), + Conv2d(512, 512, kernel_size=1, stride=1, padding=0), + ) + + #### load the pre-trained audio_encoder + #self.audio_encoder = self.audio_encoder.to(device) + ''' + wav2lip_state_dict = torch.load('/apdcephfs_cq2/share_1290939/wenxuazhang/checkpoints/wav2lip.pth')['state_dict'] + state_dict = self.audio_encoder.state_dict() + + for k,v in wav2lip_state_dict.items(): + if 'audio_encoder' in k: + print('init:', k) + state_dict[k.replace('module.audio_encoder.', '')] = v + self.audio_encoder.load_state_dict(state_dict) + ''' + + self.mapping1 = nn.Linear(512+64+1, 64) + #self.mapping2 = nn.Linear(30, 64) + #nn.init.constant_(self.mapping1.weight, 0.) + nn.init.constant_(self.mapping1.bias, 0.) + + def forward(self, x, ref, ratio): + x = self.audio_encoder(x).view(x.size(0), -1) + ref_reshape = ref.reshape(x.size(0), -1) + ratio = ratio.reshape(x.size(0), -1) + + y = self.mapping1(torch.cat([x, ref_reshape, ratio], dim=1)) + out = y.reshape(ref.shape[0], ref.shape[1], -1) #+ ref # resudial + return out diff --git a/animation/SadTalker/src/audio2pose_models/__pycache__/audio2pose.cpython-38.pyc b/animation/SadTalker/src/audio2pose_models/__pycache__/audio2pose.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2be515b59c512876ab7e4998e6093e49382460db GIT binary patch literal 2866 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 literal 0 HcmV?d00001 diff --git a/animation/SadTalker/src/audio2pose_models/__pycache__/cvae.cpython-38.pyc b/animation/SadTalker/src/audio2pose_models/__pycache__/cvae.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..90306be36db3f2bcad9426aa657478c6f5b9c61c GIT binary patch literal 4699 zcmbW5OLH5?5yxj|u}=UbL{enrC=T8bfKPVD*l#rAxl1U6v*{m>23J@OD z>_U>^WmPJa%O~G*%mFwmA0Xw=GN)AK!W} zC>MnFjMbg@nXrZPj0q>=E%(^0d(gPTgT~7>J~X~4LQ~8&MPY2SYUv9+nQc`K#k*Zd z=S~#wcB7=hNuOUPel6TB+_eWp=`+s?bcLj+$AG<47jWUbiM? zPbzB=$zH4qadQwUp7fM0qQ}ifq};d>CP^fNs;SJTcv|-w?J$mmZogBvd)??kFL}=7 zES~eCzIJVI7qiBDt$v&|_ttw)y6s*l;=Q$A=TJs?qS)IG#ZK6M7|Ay}VY54}?!~gP z7xqQ7clEFrM?t42qISI3cpOG6haahue(Kfifi|8NyAX^o8m|~LhCGLIgA^w(da-oH zKY@r?-4LwKKV|!dFa&?*)=goG0xS$W3mdY^;6=xqY)<+pf>A*S?}u#f{aS+SZQlQg_x@cUHG+JN4q$?q;yIvAVsDapzWd z*KghmYMVELn_F4OxvA>bZZ=ps+qDmZjoOwfw!CtrzjqHY5wmdeSOp&Suu z4ZZa^YVRwvv42pX&-(@K@FRF3O%m7V^R6eA@@v?sD#9-V?JH5N&S`%NqRxH1lVg)rzT2p7?|5!U`u3VzIA}Exc>f5)s!@c zGNY%5%9mkRbc1&DVN|u`H%QMrePy?M2aiLk%s3I~co=8

wJ?rDkMw7|O5{;cVlb zzKVvJ&K1LP@{Pf~UjOMnr;fp?UHly5z$P33tQ&L^#sx-)Kydt;XuY;Zu-IlZ8lTSh^zJs>7 z1VQ$4@mInfJ{cxMxn4W-VU9w!Jqx*{L0|h6w7Zd>*d_Nq&1iBO?nK_ zq;b2VEpz$qc*qL*?&T}h*O$q=S5BOYd)1YscX`q;BX4ywWB#DQrF)oqFi}^H?DcSM zb@>JsefDh>k|<8-MaDYd*aJ_$0Mb@nVnr7Y09N<`@wVTlaw!NN^}}}7qJ2Lz#R|>; zLkLyQ4@o0xx5o!XTYz4Ac4UY;W!#$5c=;9Aa$U`$2DGOxdh2xQqwwD-t*LCm9+td- z{tbfg_#%rn!mSAMH$-pTLh%DhNiUV}5L`vwQ1%{K&!W9(jnwZmTG)VJSsK#_Z+PO}!Bp_Gd^c z@>XZkIx|8_K`oE&>%KS&DmAScbTX_*+8%fYznS&-!6bh01k+N~fI$@&hjb=9jhYEM1ja^l0>sru> z!fsqI=d~PF<3>$r<=r0BDTAG*Pm{{BkNeFquKF465MCyMLC1h>-OIG@Z;_xKD5I&I zaSU+B;iV7CpM`^H7%`zX202jVaCIb+V4;e$#Z%BGaphm3~e zqJTk+T*DoI4ndxFii+CmAfnkqs)-gP2ExKGJQTb%hwz>e@zhD3p_w8%0Y9At9^7Kb z26@#G=>gi^)Sa}u@CrL6>Us&14bT?pL+TwAD7E>FANd&Nr9MU#QS#FwN~KAuoEpPo zT1v~p`wRSv5*i#ge@j`KO=>33%qVRP4iaU`XkX`<%A15$?Q-&`*f7GWDVm)spCY?j zLZ0#m8XwflzxZdaX| zqEESFe#$NCcZ>S*`>}Gfr8T?C)yqdVFkUYFK>67)@+eh!iabGCPXjbe7kvh*l0bM9 zcTA4Oba0_mz%?sI$)x0<1dmxXd`O>HjKS>KPx83)+?H1`Q2vO-RT7k7=xODTsiYn9 z3{Z)9)ELu=22jsu3`FJB_5Z;1>zLsbOp8!VVEQjq{%4p@A!;l!I4c3vIiQ39SS55W z!KHG1wg{cLJ#tEoPZNN2b9|DMa#7IubcMCVk{OJ|$B_JM-rJt^o&`>I&qq6Xn*&Hz zrdk3ha(;X?0hI*MGUd^_Hiz1LvM@Z4kyD&5j&Vvf(9SG>Mx{4NkOky52<61hgHEq0 zs!L}Ws@?kxKjn2Ar+xTsD!oJET@tG#Za^p#S*RppAbZZHRz>Z!87Z?<@g8-jQz73c zL5HMT%nky%<$q?N-|QadIj{T`_53x74H7Q_p@2Sf@e?4d7?&p?tQZ&hBA?MH%yamc zqmUAT2@3y)$^?ZR=p$I+D~UoNrMxdeAwiBHh!j%T2LKaltc7nOjBpXSUHBSL3M~uY zOC0`&Ucv$F5SH(u<}Q`)k@!7{fW#k2?2$MiF~y7ix*?o>j5`l{8f64E z(}!&-1TFw+bA<}8pgx!#TRMlC3{Ov~9ZAotu|o6a#9ET1sg|_s*5|Vnx!YaY?{^y% zP{MYeW=s{zc(48{{x7hi5q|Rj0xJj?flgA0c>42S*_%3r)mf&dqkiCt?dpxw+LU`e Y%Yoh|Q^pjkUBvVf$n83FugzWgH}s7tcmMzZ literal 0 HcmV?d00001 diff --git a/animation/SadTalker/src/audio2pose_models/__pycache__/discriminator.cpython-38.pyc b/animation/SadTalker/src/audio2pose_models/__pycache__/discriminator.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c993870aeb1798c688d1f0a9eaa636dc787eb2a3 GIT binary patch literal 2464 zcmaJ?&2JPp6t_K}JG%)XKt(wfRA@)gwB*pL6tzG;O4Kl*d>p!3X*7(TWHz(28+(>O zH0hy4;*>w2J?$QI??2HV_yc_HDYu?cCHmg%F1t}nJ@T{P&-Sz5=WI?*c?4Q(|GH?w z>`!DSn+eQ4=qdoh38yKk4@TNzj8M`t>Lx{mrKH8`jFRsOH@JC3xG7lEdTG>cKrC(p zVh<6A({hz9J^6 zTOhHfYYXk{SY`?*2@(Cm_*m>&|lmHk=B4;}qR~%8-Cjh;K*>28re> ziDvVB8T@8GO(G>7fHhkQB%a#-^%rcvf9Eqjor&!zPo9ZTrR|Q;PLg%fC>9$&mFHlu zKdUX(?FgyeFif%}4?~HUY8$;c&$SuDsH+d6Jl;X4B9y_Xr<SM_DX}=!Kx2ue3U; zXo)Nrd`Zf-97ws%C(Z+N<|ObY-mA~;MoBBlwnLO2rJ=U>MY6q<>&mK#c3-TC)lF@d z)QIBT_q3@*x>c{>`@;MM=vGa#Fy4u>Or%QJ+TDE2dAz-!sR*B^tGhzNmQW=JLfa~r z2?x7$BF^DPi^KX{1ybo{%^3!kxyZ5>hpqU6m(|MUa`cBd!_??N&z$ zr37!RM|>kn;fl{%QId_>hLUk3>hh#L-)Somw%Qz?+2DzaCF&jJZ8_I@AZd(EUX?BLR5M$V1=9HXB{4d)nO3((a=AO-1> zg7)bl%^@(GEH|3wOD4YnoE5ZZaaijQ$3vQV1046m%pRO9u*5J3W{Dvzv7D5#>pSuS z%(a)OWEe!H-OI?6S8&OJkZg5xAwL4{gvqN2(&zFfj018D5ofC{_an(~1EXp{2=%}! zm%(lxJ-B#A@8MRzQYOhDozT+DK@gM)w0vS?7GzONgrW9A^iem(c`Xe0x=}hL@hyM%y6}Ss~D#uQ4H$6b0)*=Q^_Kxko33pV>8dn|Es#7$` zhR-DGDnA915QxPDekWvH@qANW$94P<$xlW*|BYe<_%(^9F1@6Ucxzi*j~*{Bt=6X& zSJoHSRvxVc_ctD|)xFiF`#<~`t}U%@4l15EFkhZTY3Y~x^h)q#b0b`Mcs~f1R@dca z5UUL(_8_1!9_80a@XfOHcj^Ap>6pZKp{rRS7?L)mut`6lGxQ?8`1irJ_j>F7*@>aL zfHLm@fege>F$>F)_2F08H+l@*V)j{?g~ligdnSi^5DCc4O zgs^emd<6^NKvxh5kTSl4Cv@>v9`RDS+fTqjZepF_0 e>C#fh#C7jHrro=PWd9cPv(&<+v*5JZFaH4qc1{KW literal 0 HcmV?d00001 diff --git a/animation/SadTalker/src/audio2pose_models/__pycache__/networks.cpython-38.pyc b/animation/SadTalker/src/audio2pose_models/__pycache__/networks.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..45ac321062bc5b2ba8f2a2f2e7d155ea0eb02c9c GIT binary patch literal 4751 zcmb7HTW=f36`t7}mlP%2tSURM(|g*mXk0`s`j7@~WH~NS*s2lPKufUMu69<^O5~EB zSzSUcbKvEM6kSvsv5R$rBgk-UlR0ZE;&7}+Mgl!~LPZziBs2`(| zvKAMt<$TJvx!}Ti6}DXA3hxzbd7m-tBj%EUq3S?}eCi9fX*wHNWws_Jj3 z3RdtTd+D4xBgR?bo_TouAs=!42O~)KDnmYW1RuIXPdKN(dGE};cj!IsUtFs3RP?RDdVw$gOP@+g+#4m!$w#u+TnY@!@+9+1)UxSPUgwTKRU(4lrcie3P@_Ki8T{0^Lmu4I29` z8XH*WvEVccxipDc@w*tLmQY#TjPWwKH9pq$*r2nm({$R@7#o{Rl7-K?{1N`-8&u6A z!5Hl=$Sn%^;O6D0N(9Jzv$H04Bt^VQQ%gHmjA{}{W(vKfVl+QyMiCfpB<`+)8x3Pm zabrafmvfr?Hg8_qwu~?R0yY(9U+!bglbV zlHE85=jy6V#X(YJyCP{;+evdB*c<|J%w#G@X|}UlsHRuCVwO{;p>&90w&lsVNay+E`}nllKxN5% zk^lrOKnhUf;eUgQHL-knvvn{x}evAeFOzdjbr=Q{k5b5Uwfwp3>dJW?}Az z4!5$736f1mdz5qQx=Lc?q1$l+5RNmmKV!iuDxmztBtBz}`)1NSU(GPokUsh9pmBME z`EEw1pc5E3o0D%zN~o^QwsQKGQ3{_VcG3Mwj3TXFAEW4yyR-y3ddQc2Ns`xWNBg7l zO|s{uwW6T=ST8r(*7d>YA6WRR<*vDr8e%~*MfX)ow7ijH5~?zsz)!EnhFhSwN z-gVu{T^8XCH&qHGX3T;KA^ubdL8K>e8vr)zHc)&_f-8Z79L)v_3K_ckBt9;aw7R)z zrg;LiNo{)~wLN6vK-1`Se zb@0U8LCvMnUdHI8hQW+0n7LEiG#fUz-tc|P>c6G1V(wXW9=eS?je4Wec&AbO5>Hdo AzW@LL literal 0 HcmV?d00001 diff --git a/animation/SadTalker/src/audio2pose_models/__pycache__/res_unet.cpython-38.pyc b/animation/SadTalker/src/audio2pose_models/__pycache__/res_unet.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..177f47d21ba047153d82d1078da3905bb98521d3 GIT binary patch literal 1924 zcmZ`)OK&4Z5bo}IdTi%KAiDvU@Defti#W?`h0uy1aba^v$Yo?P8m2qRB=higk4ZL~ zNJtxLPx%KN?BiaM_%nUwl)r!wP&H#a4iRHjb#;IBn(C_Ye!J}vc+%7N#qTa5f8b{R zF=6uy@U=XB1_Y7^&%-spVUgd`Gy!%}c^f!H(_chVO8?M>^Iu*pr z?()VZ@y!>+B)$a^J?%iG{Y(_s6g*sSAbX7L7i0tuBLk%AgK`rHSM@8P1u1Arp0g1f zgK}Yv%)&UfN?Jk|_u;KEk1IGE+4aeog6xbz6SOLw+nQsuB!T;Xe#Q_hXcXSe(tsEi z#IUc>u2~^)2DozzX;lcE0m5z}?P8%mn;{l=D{qUH4QSWi)}~&KS-hpnw)R@bo7yhV z#e;k*Tg>&wcBQhdb4A30Umf?Axwn8CR<>Bn8{5^oKBGwmE5sOMm0ul`F@s9H#tGbR zV@FoEink@PRiLw)CqiZ-2~>P8v@-}fkF&!LyJmAbwkl-Ig>2zjySB4yJGp?{HEpTk zKuC$5uiYSsv$zNX&9Y2;d*bO(WJMe%+Q#LGC6WW}L`Pu;71ho`oD@Q;msB@`AWA}|g5V|j^T+K+ z{e1;M|9Gg1xc_Z_nk9M2Rew8A2au`~yuTOnAHoD`{Bat_+0C}EWYiCbJkEQAT!|pf zxkywWtb!p-ZFlfYE<*(zAk_s%=mIn8Ds54l-uuh8LH@@!*XcTgAAM&=CS9TS-{(ua z_4IeAR~TXWrw?8|-tab%`VCk~Mx>-Tg(HgV8o7XO8?lm&>4gE3Q5qn@ERM|51jz!) zDlL=>``9V1(mbrbPgm^12FxvOz#NborGrwX<&?%u%LU9UUBDV3HOmG{l~$u4tf^sVe zp2B}fjZ}RiA7a4vq&*{%BtbBj4rU-Rr)scm5ES0OOV>B5la4Dtg1vUDDs{6=uE5rR v08QGx)1+PK&(mC