ó
    ¡ü8j�#  ã                  óF  • S r SSKJr  SSKrSSKJr  SSKJr  SSKJ	r	J
r
Jr  SSKJr   " S	 S
\R                  5      r " S S\R                  5      r " S S\R                  5      r\" \" \	5      \" \5      -  5      r\" \" \
5      5      r " S S\R                  5      rg)u   V3 face model â€” split-branch causal TCN with FiLM conditioning.

Architecture:

    audio (T, 80) âŠ• cond (T, 19)  â†’  Linear(99 â†’ hidden)
                                      â”‚
                                      â–¼
            shared backbone: 6Ã— DilatedCausalConv1d (d=1..32) + FiLM
                                      â”‚
                       â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
                       â–¼                             â–¼
       lipsync branch                       expression branch
       2Ã— TCN (d=64,128)                    2Ã— TCN (d=64,128)
                       â–¼                             â–¼
       Linear(hidden â†’ 31)                  Linear(hidden â†’ 21)
       sigmoid                              sigmoid
                       â”‚                             â”‚
                       â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
                                  â–¼
                       combined (T, 52) blendshape output
                       (lipsync values at LIPSYNC + SHARED indices,
                        expression values at EXPRESSION_ONLY indices)

Freezing:
    model.freeze_lipsync()  â†’  shared backbone + lipsync branch + lipsync
                                head are no_grad. Expression branch +
                                head remain trainable. Lipsync output
                                becomes bit-for-bit deterministic from
                                audio input.

~3.7 M params at hidden=192, ~1.2 ms/frame CPU.
Quantization-friendly (Conv1d + Linear + GELU + sigmoid, no attention).
é    )ÚannotationsN)Únn)Ú
functional)ÚLIPSYNC_ONLYÚEXPRESSION_ONLYÚSHARED_CHANNELSé   )ÚV3FaceConfigc                  ó:   ^ • \ rS rSrSrSU 4S jjrSS jrSrU =r$ )ÚFiLMé/   uw   Per-frame Feature-wise Linear Modulation conditioning.

Predicts (Î³, Î²) from `cond` and applies `x * (1 + Î³) + Î²`.
c                ó,  >• [         TU ]  5         [        R                  " USU-  5      U l        [        R
                  R                  U R                  R                  5        [        R
                  R                  U R                  R                  5        g )Né   )	ÚsuperÚ__init__r   ÚLinearÚprojÚinitÚzeros_ÚweightÚbias)ÚselfÚcond_dimÚ
hidden_dimÚ	__class__s      €ÚX/home/ubuntu/service/kemix-engine/package/face/animasync-face-v3/models/v3_face/model.pyr   ÚFiLM.__init__5   sV   ø€ Ü‰ÑÔÜ—I’I˜h¨¨J©Ó7ˆŒ	ä
�‰�‰�t—y‘y×'Ñ'Ô(Ü
�‰�‰�t—y‘y—~‘~Õ&ó    c                ó^   • U R                  U5      nUR                  SSS9u  pEUSU-   -  U-   $ )Nr   éÿÿÿÿ©Údimg      ð?)r   Úchunk)r   ÚxÚcondÚgbÚgammaÚbetas         r   ÚforwardÚFiLM.forward<   s7   € Ø�Y‰Y�t‹_ˆØ—h‘h˜q b�hÐ)‰ˆØ�C˜%‘KÑ  4Ñ'Ð'r   )r   )r   Úintr   r+   ©r$   útorch.Tensorr%   r-   Úreturnr-   ©	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r)   Ú__static_attributes__Ú__classcell__©r   s   @r   r   r   /   s   ø† ñ÷
'÷(ò (r   r   c                  ó:   ^ • \ rS rSrSrSU 4S jjrSS jrSrU =r$ )ÚCausalConv1déB   z6Left-padded 1D conv that never looks at future frames.c                ót   >• [         TU ]  5         US-
  U-  U l        [        R                  " XUUSS9U l        g )Nr	   r   )ÚdilationÚpadding)r   r   Úleft_padr   ÚConv1dÚconv)r   ÚchannelsÚkernel_sizer<   r   s       €r   r   ÚCausalConv1d.__init__E   s7   ø€ Ü‰ÑÔØ$ q™¨HÑ4ˆŒÜ—I’I˜h°+Ø'/¸ñ<ˆ�	r   c                óh   • [         R                  " XR                  S45      nU R                  U5      $ )Nr   )ÚFÚpadr>   r@   )r   r$   s     r   r)   ÚCausalConv1d.forwardK   s'   € Ü�EŠE�!—m‘m QÐ'Ó(ˆØ�y‰y˜‹|Ðr   )r@   r>   )rA   r+   rB   r+   r<   r+   )r$   r-   r.   r-   r/   r7   s   @r   r9   r9   B   s   ø† Ù@÷<÷ò r   r9   c                  óB   ^ • \ rS rSrSr    SU 4S jjrSS jrSrU =r$ )ÚTCNBlockéP   u9   Residual block: 2Ã— CausalConv1d + FiLM + GELU + dropout.c                ó(  >• [         TU ]  5         [        XU5      U l        [        XU5      U l        [
        R                  " U5      U l        [
        R                  " U5      U l        [        XA5      U l
        [
        R                  " U5      U l        g ©N)r   r   r9   Úconv1Úconv2r   Ú	LayerNormÚnorm1Únorm2r   ÚfilmÚDropoutÚdropout)r   r   rB   r<   r   rT   r   s         €r   r   ÚTCNBlock.__init__S   sf   ø€ ä‰ÑÔÜ! *¸8ÓDˆŒ
Ü! *¸8ÓDˆŒ
Ü—\’\ *Ó-ˆŒ
Ü—\’\ *Ó-ˆŒ
Ü˜Ó.ˆŒ	Ü—z’z 'Ó*ˆ�r   c                óä  • UnUR                  SS5      nU R                  U5      nUR                  SS5      nU R                  U5      n[        R                  " U5      nU R                  U5      nUR                  SS5      nU R                  U5      nUR                  SS5      nU R                  U5      nU R                  XB5      n[        R                  " U5      nU R                  U5      nX4-   $ )Nr	   r   )	Ú	transposerM   rP   rE   ÚgelurT   rN   rQ   rR   )r   r$   r%   ÚresidualÚhs        r   r)   ÚTCNBlock.forward]   sÅ   € Øˆà�K‰K˜˜1ÓˆØ�J‰J�q‹MˆØ�K‰K˜˜1ÓˆØ�J‰J�q‹MˆÜ�FŠF�1‹IˆØ�L‰L˜‹Oˆà�K‰K˜˜1ÓˆØ�J‰J�q‹MˆØ�K‰K˜˜1ÓˆØ�J‰J�q‹MˆØ�I‰I�aÓˆÜ�FŠF�1‹IˆØ�L‰L˜‹Oˆà‰|Ðr   )rM   rN   rT   rR   rP   rQ   )
r   r+   rB   r+   r<   r+   r   r+   rT   Úfloatr,   r/   r7   s   @r   rI   rI   P   s%   ø† ÙCð+Øð+Ø).÷+÷ò r   rI   c                  ó€   ^ • \ rS rSrSrS
U 4S jjrSS jrSS jr\SS j5       r	\SS j5       r
\SS j5       rS	rU =r$ )ÚV3FaceModeléy   u?   Split-branch causal TCN: (audio, cond) â†’ (T, 52) blendshapes.c                óJ  >• [         TU ]  5         Xl        U R                  S[        R
                  " [        [        R                  S95        U R                  S[        R
                  " [        [        R                  S95        [        [        5      n[        [        5      nX#-   UR                  :X  d   SU SU SUR                   35       e[        R                  " UR                  UR                  -   UR                  5      U l        [        R"                  " UR$                   Vs/ s H9  n['        UR                  UR(                  XAR                  UR*                  5      PM;     sn5      U l        [        R"                  " UR.                   Vs/ s H9  n['        UR                  UR(                  XAR                  UR*                  5      PM;     sn5      U l        [        R                  " UR                  U5      U l        [        R"                  " UR.                   Vs/ s H9  n['        UR                  UR(                  XAR                  UR*                  5      PM;     sn5      U l        [        R                  " UR                  U5      U l        g s  snf s  snf s  snf )NÚlipsync_idx)ÚdtypeÚexpression_idxzchannel split mismatch: z + z != )r   r   ÚcfgÚregister_bufferÚtorchÚtensorÚLIPSYNC_BRANCH_CHANNELSÚlongÚEXPRESSION_BRANCH_CHANNELSÚlenÚ
output_dimr   r   Ú	audio_dimr   r   Ú
input_projÚ
ModuleListÚshared_dilationsrI   rB   rT   Úshared_blocksÚbranch_dilationsÚlipsync_blocksÚlipsync_headÚexpression_blocksÚexpression_head)r   rd   Ú	n_lipsyncÚn_expressionÚdr   s        €r   r   ÚV3FaceModel.__init__|   s   ø€ Ü‰ÑÔØŒð 	×Ñ˜]Ü"Ÿ\š\Ô*AÌÏÉÑTô	Và×ÑÐ-Ü"Ÿ\š\Ô*DÌEÏJÉJÑWô	Yô Ô/Ó0ˆ	ÜÔ5Ó6ˆØÑ'¨3¯>©>Ó9ð 	XØ& y k°°\°NÀ$ÀsÇ~Á~ÐFVÐWó	XÐ9ô Ÿ)š) C§M¡M°C·L±LÑ$@À#Ç.Á.ÓQˆŒÜŸ]š]à×)Ò)ó,
â)�ô �S—^‘^ S§_¡_°a¿¹ÀsÇ{Á{ÖSÙ)ñ,
ó ˆÔô !Ÿmšmà×)Ò)ó-
â)�ô �S—^‘^ S§_¡_°a¿¹ÀsÇ{Á{ÖSÙ)ñ-
ó ˆÔô ŸIšI c§n¡n°iÓ@ˆÔô "$§¢à×)Ò)ó0
â)�ô �S—^‘^ S§_¡_°a¿¹ÀsÇ{Á{ÖSÙ)ñ0
ó "ˆÔô  "Ÿyšy¨¯©¸ÓFˆÕùò#,
ùò-
ùò0
s   Ä)A JÆA JÈ#A J c                óŠ  • [         R                  " X/SS9nU R                  U5      nU R                   H  nU" X25      nM     UnU R                   H  nU" XR5      nM     [         R
                  " U R                  U5      5      nUnU R                   H  nU" Xr5      nM     [         R
                  " U R                  U5      5      nUR                  S   UR                  S   p©[         R                  " XšU R                  R                  UR                  UR                  S9nXkSU R                  4'   X‹SU R                   4'   U$ )zo
Args:
    audio: (B, T, audio_dim)
    cond:  (B, T, cond_dim)
Returns:
    blendshapes: (B, T, 52) in [0, 1]
r    r!   r   r	   )Údevicerb   .)rf   Úcatrn   rq   rs   Úsigmoidrt   ru   rv   ÚshapeÚzerosrd   rl   r|   rb   ra   rc   )r   Úaudior%   r$   ÚblockÚlxÚlipsync_outÚexÚexpression_outÚBÚTÚouts               r   r)   ÚV3FaceModel.forward    s  € ô �IŠI�u�m¨Ñ,ˆØ�O‰O˜AÓˆà×'Ô'ˆEÙ�a“ŠAñ (ð ˆØ×(Ô(ˆEÙ�r“ŠBñ )ä—m’m D×$5Ñ$5°bÓ$9Ó:ˆð ˆØ×+Ô+ˆEÙ�r“ŠBñ ,äŸš t×';Ñ';¸BÓ'?Ó@ˆð �{‰{˜1‰~˜uŸ{™{¨1™~ˆ1Ü�kŠk˜! §¡× 3Ñ 3Ø!&§¡°[×5FÑ5FñHˆà%0ˆC�×!Ñ!Ð!Ñ"Ø(6ˆC�×$Ñ$Ð$Ñ%Øˆ
r   c                óþ  • SnU R                   R                  5        H  nSUl        XR                  5       -  nM     U R                   H3  nUR                  5        H  nSUl        XR                  5       -  nM     M5     U R
                   H3  nUR                  5        H  nSUl        XR                  5       -  nM     M5     U R                  R                  5        H  nSUl        XR                  5       -  nM     U$ )uQ  Freeze shared backbone + lipsync branch + lipsync head.

Sets `requires_grad=False` on every parameter that contributes to
the lipsync output path. After this, lipsync output is bit-for-bit
deterministic from audio + cond â€” the expression branch can be
retrained without ANY drift in lipsync.

Returns the number of frozen parameters.
r   F)rn   Ú
parametersÚrequires_gradÚnumelrq   rs   rt   )r   ÚfrozenÚpr‚   s       r   Úfreeze_lipsyncÚV3FaceModel.freeze_lipsyncÂ   sà   € ð ˆØ—‘×+Ñ+Ö-ˆAØ#ˆAŒOØ—g‘g“iÑŠFñ .ð ×'Ô'ˆEØ×%Ñ%Ö'�Ø"'�”ØŸ'™'›)Ñ#’ó (ñ (ð ×(Ô(ˆEØ×%Ñ%Ö'�Ø"'�”ØŸ'™'›)Ñ#’ó (ñ )ð ×"Ñ"×-Ñ-Ö/ˆAØ#ˆAŒOØ—g‘g“iÑŠFñ 0ð ˆr   c                óB   • [        S U R                  5        5       5      $ )Nc              3  ó@   #   • U  H  oR                  5       v •  M     g 7frL   )rŽ   ©Ú.0r�   s     r   Ú	<genexpr>Ú'V3FaceModel.n_params.<locals>.<genexpr>ß   s   é € Ð8Ò&7 —7‘7—9�9Ò&7ùs   ‚©ÚsumrŒ   ©r   s    r   Ún_paramsÚV3FaceModel.n_paramsÝ   s   € äÑ8 d§o¡oÔ&7Ó8Ó8Ð8r   c                óB   • [        S U R                  5        5       5      $ )Nc              3  óf   #   • U  H'  oR                   (       d  M  UR                  5       v •  M)     g 7frL   )r�   rŽ   r•   s     r   r—   Ú*V3FaceModel.n_trainable.<locals>.<genexpr>ã   s    é € ÐKÒ&7 ¿?½?“9�1—7‘7—9�9Ò&7ùs   ‚1š1r™   r›   s    r   Ún_trainableÚV3FaceModel.n_trainableá   s   € äÑK d§o¡oÔ&7ÓKÓKÐKr   c                ó&   • U R                   S-  S-  $ )zFloat32 disk size in MB.é   i   )rœ   r›   s    r   Úsize_mbÚV3FaceModel.size_mbå   s   € ð �}‰}˜qÑ  KÑ0Ð0r   )rd   ru   rv   rn   rs   rt   rq   )rd   r
   )r�   r-   r%   r-   r.   r-   )r.   r+   )r.   r\   )r0   r1   r2   r3   r4   r   r)   r‘   Úpropertyrœ   r¡   r¥   r5   r6   r7   s   @r   r^   r^   y   sV   ø† ÙI÷"GôH ôDð6 ó9ó ð9ð óLó ðLð ó1ó ö1r   r^   )r4   Ú
__future__r   rf   r   Útorch.nnr   rE   Úscripts.compiler.constantsr   r   r   Úconfigr
   ÚModuler   r9   rI   ÚsortedÚsetrh   rj   r^   © r   r   Ú<module>r°      s—   ðñ õB #ã Ý Ý $÷ñ õ !ô(ˆ2�9‰9ô (ô&�2—9‘9ô ôˆr�y‰yô ñJ !¡ \Ó!2±S¸Ó5IÑ!IÓJÐ Ù#¡C¨Ó$8Ó9Ð ôo1�"—)‘)õ o1r   