+
    0vj              
          R t ^ RIt^ RIt^ RIt]P                  P                  RR4      t]P                  P                  ]4      t
]P                  P                  ]
4       R^uttR!R lt]R8X  Ed   ]P"                  ! 4       t]P'                  R4       ]P'                  RR	R
7       ]P'                  R]^ RR7       ]P'                  RRR
7       ]P'                  R]RR7       ]P-                  4       t];QJ d-    . R ]P2                  P5                  R4       4       F  NK  	  5M&! R ]P2                  P5                  R4       4       4      t]P6                  '       dp   ]P6                  P5                  R4       U u. uFI  p ];QJ d#    . R V P5                  R4       4       F  NK  	  5M! R V P5                  R4       4       4      NKK  	  up MRt]! ]P:                  ]]P<                  ]]P>                  R7      w  t t!]! ]P:                  ]]P<                  R]]P>                  R7      w  t"t#] f   ]$! R]!R R24      h]"e   ]"R MRt%]&! ]P:                   R] R R]% R ]!R 24       R# R# u up i )"u  립싱크 정합의 **강건한** 통계 = 발화구간/무음구간 입 모션 비.

왜 상관계수를 주 지표로 안 쓰나: 연속 상관(openness·motion vs 포락선)은 같은 자료에서 서로 다른 부호를
낸다 — 입 크기·머리 움직임·박스 포화에 흔들리기 때문이다(실측: ⑤-b 는 상관으론 음수인데 구간별로 보면
화자 귀속이 완벽했다). 반면 "**소리 날 때 무음 때보다 얼마나 더 움직이나**" 는 스케일 불변이고
사람이 읽는 립싱크 개념에 직접 대응한다.

네거티브 = 그 오디오의 시간 역전으로 구간을 다시 잡는다(구간 길이·개수 분포는 같고 위치만 틀어진다).
Nanz
analyze.pyi>  c                B   \         P                  W4      w  rgpWrR pVe+   VR\        ^\        V\        ,          4      V,
          4       pVfl   \         P                  V 4      pV'       d   VRRR1,          P                  4       p\         P                  V4       U	u. uF  qR,          V	R,          3NK  	  pp	MCV'       d<   Ve   TM\        R V 4       4      p
V UUu. uF  w  rW,
          W,
          3NK  	  ppp\        P                  ! \        V4      \        4      pV FT  w  rRV\        ^ \        V\        ,          4      V,
          4      \        ^ \        V\        ,          4      V,
          4      % KV  	  VP                  4       '       g   VP                  4       '       g   R\        VP                  4       4      3# \        W},          P                  4       W}( ,          P                  4       ,          4      \        VP                  4       4      3# u up	i u uppi )u  windows=[(start_s, end_s), …] 를 주면 그 구간을 '발화' 로 쓴다(가창처럼 유성구간이 전부라
자동 검출이 성립 안 할 때). 미지정이면 산출 오디오의 유성구간을 쓴다.

★end_s 필수 상황: LTX 는 **영상이 오디오보다 길다**(⑤-c 는 6.04s 영상에 5.18s 오디오).
  그 꼬리를 무음으로 세면 같은 클립이 1.43 과 4.17 사이를 오간다. 경로끼리 비교할 땐
  **오디오 길이로 잘라** 같은 구간을 봐야 한다.
Nstart_send_sc              3   *   "   T F	  w  rVx  K  	  R # 5iN ).0_bs   &  =/Users/inhohur/ai/experiments/h3-r2v-lipsync/lipsync_ratio.py	<genexpr>ratio.<locals>.<genexpr>(   s     2I1s   T)r   mouth_seriesmaxintFPSpcmcopyvoiced_segmentsnpzeroslenboolallanyfloatmean)videoboxskipreversewindowsr   r
   motionxsspanar   voiceds   &&&&&&        r   ratior*      s    ??5.LAqE]F8QECK 04 789FF5M$B$A797I7I!7LM7L!iL!G*-7LM	 )us2I2I/I4;<GDADHdh'G<XXc&k4(FJNs1c!c'lT)*3q#a#g,2E+FG zz||6::<<U6;;=)))$$&)=)=)??@%BVVV N
 =s   HH__main__r   r    zx0,y0,x1,y1)helpz--skipu7   앞 N 프레임 제외(LTX 는 f0 가 입력 이미지))typedefaultr,   z	--windowsu   발화 구간 'a-b,c-d' (초). 가창처럼 유성비율이 1.0 이라 자동 검출이 성립하지 않을 때 whisper word 타임스탬프로 준다z--endu   이 초 이후 프레임 제외 — 영상이 오디오보다 긴 경로(LTX)와 비교할 땐 **오디오 길이로 잘라야** 같은 구간을 본다)r-   r,   c              #   8   "   T F  p\        V4      x  K  	  R # 5ir   r   )r	   vs   & r   r   r   <   s     3"2Qa"2   ,c              3   8   "   T F  p\        V4      x  K  	  R # 5ir   r0   )r	   ts   & r   r   r   =   s     1Lq%((Lr2   -)r#   r   T)r"   r#   r   u   ❌ 유성비율 z.2fu    — 대조할 무음 구간이 없어 이 지표는 성립하지 않는다. --windows 로 발화 구간을 직접 줘라(가창은 whisper word 타임스탬프 사용).u+   성립 X(역전 구간이 전체를 덮음)u     발화/무음 모션비 = u      (역전 네거티브 u   )   유성비율 )    FNN)'__doc__argparsenumpyr   importlib.util	importlibutilspec_from_file_locationspecmodule_from_specr   loaderexec_moduleSRr   r*   __name__ArgumentParserapadd_argumentr   r   
parse_argsr(   tupler    splitr#   winr   r!   endrfracrrr
   
SystemExitnegprint)ws   0r   <module>rT      s4     ~~--dLA^^$$T*    
CW< z		 	 	"BOOGOOEO.OOH38qOrOOK 'xO yOOG% /xO y
A
%3!%%++c"23%%3!%%++c"23
3Ciii <=99??3;OP;OaEE1AGGCL1EE1AGGCL11;OP! AGGS!&&#QUUCGAt!''3cOEBy,T#J 7x y z 	zRH-ZC	QWWI1!C8PQTPUUfgklofp
qr)  Qs   =I,	AI,