Ë
    ¢BæjÝ  ã                  óR   — d Z ddlmZ ddlZddlZddlZddlmZ dd„Zd	d„Z	d
dd„Z
y)a  dubeval: find timing gaps, lag and translation defects in dubbed videos vs their original.

Language agnostic: source and target languages are detected per audio stream (Whisper LID) unless
declared. One original can be compared against many dub files, each with many audio streams.
é    )ÚannotationsN)ÚPathc                ó8  — | j                   }d| j                  › d| j                  d   › d| j                  d   › d�d|j                  › d|j                  › d	|j
                  d
›d|j                  › d|j                  › d�dd›ddd›ddd›ddd›ddd›d�
g}| j                  D ]e  }|j                  |j                  d›d|j                  d›d|j                  d›d|j                  d›d|j                  d›d|j                  › �«       Œg dj!                  |«      S )Nz== z  [Úfileú a:Úaudio_indexú]zscore z/100 | issues z | overlap z.0%z | median onset zs | p90 |onset| ÚsÚidÚ5ú Ústartz>12ÚendÚsevÚ8ÚcategoryÚ22z descriptionú
)ÚsummaryÚpairÚtargetÚscoreÚseverity_countsÚspeech_overlap_ratioÚmedian_onset_deltaÚp90_abs_onset_deltaÚissuesÚappendr   Ústart_tcÚend_tcÚseverityr   ÚdescriptionÚjoin)Úreportr
   ÚoutÚxs       ú4/root/repos/pocs/video-evals/src/dubeval/__init__.pyÚ_tabler(      s>  € Ø�‰€AØ�—‘�˜S §¡¨vÑ!6Ð 7°s¸6¿=¹=ÈÑ;WÐ:XÐXYÐZØ�A—G‘G�9˜N¨1×+<Ñ+<Ð*=¸[È×I_ÑI_Ð`cÐHdð eØ×/Ñ/Ð0Ð0@À×AVÑAVÐ@WÐWXðZà�1ˆX�Q�w˜s�m 1 U¨3 K¨q°°q°	¸¸:Àb¸/ÈÐVðX€Cð �]‰]ò oˆØ�
‰
�a—d‘d˜1�X˜Q˜qŸz™z¨#Ð.¨a°·±¸¨~¸Q¸q¿z¹zÈ!¸nÈAÈaÏjÉjÐY[È_Ð\]Ð^_×^kÑ^kÐ]lÐmÕnðoà�9‰9�S‹>Ðó    c                ó�   — | xs dj                  d«      D �cg c]#  }|j                  «       sŒ|j                  «       ‘Œ% c}S c c}w )NÚ ú,)ÚsplitÚstrip)Úvr&   s     r'   Ú_listr0      s1   € Ø !¢ RŸ™¨sÓ3ÖA˜!°q·w±wµyˆA�G‰G�IÒAÐAùÒAs
   ˜A®Ac                ó†	  — ddl m} ddlm}m} t        j                  dt        t
        j                  ¬«      }|j                  dt        ¬«       |j                  dt        d	d
¬«       |j                  ddt        t        d«      ¬«       |j                  dt        d¬«       |j                  dd¬«       |j                  dd¬«       |j                  dt        d¬«       |j                  dt        d¬«       |j                  ddd¬«       |j                  d d!d"¬«       |j                  d#d$d%¬«       |j                  d&d'd(¬)«       |j                  d*d'¬+«       |j                  d,t        d-¬«       |j                  | «      }t        j                  t        j                  d.t         j"                  ¬/«       d0D ]4  }t        j$                  |«      j'                  t        j(                  «       Œ6 t+        |j,                  «      }	 |j.                  r|j.                  gng |z   D ]
  } ||«       Œ 	 |j6                  xs d1j9                  «       d2k(  rg nt+        |j6                  «      }
 ||j.                  ||j:                  |j<                  |j>                  j9                  «       d2k(  rd n|j>                  |j@                  |
|jB                  |jD                   |jF                  ¬3«
      } ||jH                  |jJ                  |jL                  xs |jN                  jQ                  d4«      |«      }|jN                  jS                  |jU                  d5¬6«      «       |jV                  D ]S  }tY        t[        |«      d7¬8«       |j\                  D ],  }tY        d9|j^                  › d:�|t         j"                  ¬;«       Œ. ŒU |j`                  D ]/  }tY        d<|d=   › d>|d?   › d@|dA   › �t         j"                  ¬;«       Œ1 |jb                  D ])  }tY        dB|dC   › d@|dD   › �t         j"                  ¬;«       Œ+ tY        dE|jN                  › dFte        |jV                  «      › dG�t         j"                  ¬;«       |jb                  r|jV                  sdS dHS # t0        $ r%}	|j3                  t5        |	«      «       Y d }	~	�Œ‡d }	~	ww xY w)INé   )Úresolve)ÚConfigÚrunÚdubeval)Úprogr"   Úformatter_classÚoriginal)ÚtypeÚdubbedú+zone or more dubbed videos)r:   ÚnargsÚhelpz-oz--outzreport.json)r:   Údefaultz--workzcache dir (default: <out>.work))r:   r>   z
--src-langz4original language (BCP-47/ISO/name); default: detect)r>   z
--tgt-langzcomma-separated dub languages to evaluate, e.g. 'es-419,pt-BR'; default: every dub stream not in the source language (detected)z--orig-audioz"audio stream index in the originalz--dub-audioz8audio stream index in each dub (disables auto-selection)z--asr-modelzgroq/whisper-large-v3z$cloud ASR model; 'none' = local only)r?   r>   z--local-asr-modelÚsmallz-faster-whisper model (LID + CPU ASR fallback)z--llm-modelzgemini-flash,auto/best-fastz<comma-separated judge models tried in order; 'none' disablesz
--separateÚ
store_truez4Demucs vocal/bed split (CPU: ~3 min per 5 min audio))Úactionr>   z--no-visual)rB   z	--threadsé   z%(asctime)s %(message)s)ÚlevelÚformatÚstream)ÚhttpxÚhttpcoreÚopenaiÚhuggingface_hubÚfaster_whisperr+   Únone)
Úsrc_langÚ	tgt_langsÚ
orig_audioÚ	dub_audioÚasr_cloud_modelÚasr_local_modelÚ
llm_modelsÚseparateÚvisualÚthreadsz.worké   )Úindentz

)r   z	warning [z]:)r   zskipped r   r   Úindexz: ÚreasonzFAILED ÚdubÚerrorzwrote z (z	 pair(s))r   )3Úlangr3   Úpipeliner4   r5   ÚargparseÚArgumentParserÚ__doc__ÚRawDescriptionHelpFormatterÚadd_argumentr   ÚintÚ
parse_argsÚloggingÚbasicConfigÚINFOÚsysÚstderrÚ	getLoggerÚsetLevelÚWARNINGr0   Útgt_langrM   Ú
ValueErrorr\   ÚstrÚ	llm_modelÚlowerrO   rP   Ú	asr_modelÚlocal_asr_modelrT   Ú	no_visualrV   r9   r;   Úworkr%   Úwith_suffixÚ
write_textÚmodel_dump_jsonÚreportsÚprintr(   Úwarningsr   Úskipped_tracksÚfailedÚlen)Úargvr3   r4   r5   ÚpÚaÚnoisyÚtgtÚlabelÚeÚllmÚcfgÚbatchÚrÚwr
   Úfs                    r'   Úmainr�      sá  € Ýß%ä×Ñ Y¼GÜ08×0TÑ0Tô	V€Aà‡N�N�:¤D€NÔ)Ø‡N�N�8¤$¨cÐ8S€NÔTØ‡N�N�4˜¤t´T¸-Ó5H€NÔIØ‡N�N�8¤$Ð-N€NÔOØ‡N�N�<Ð&\€NÔ]Ø‡N�N�<ð 'h€Nô ià‡N�N�>¬Ð2V€NÔWØ‡N�N�=¤sÐ1k€NÔlØ‡N�N�=Ð*AÐHn€NÔoØ‡N�NÐ&°Ð>m€NÔnØ‡N�N�=Ð*GØVð ô Xà‡N�N�<¨Ð;q€NÔrØ‡N�N�=¨€NÔ6Ø‡N�N�;¤S°!€NÔ4Ø	�‰�TÓ€AÜ×ÑœgŸl™lÐ3LÔUX×U_ÑU_Õ`ØUò ;ˆÜ×Ñ˜%Ó ×)Ñ)¬'¯/©/Õ:ð;ô �—
‘
Ó
€CðØ&'§j¢j�q—z‘z‘l°b¸CÑ?ò 	ˆEÙ�E�Nñ	ð —‘Ò" ×)Ñ)Ó+¨vÒ5‰"¼5ÀÇÁÓ;M€CÙ
˜!Ÿ*™*°ÀÇÁÐXY×XcÑXcØ)*¯©×):Ñ):Ó)<ÀÒ)F¡ÈAÏKÉKØ!"×!2Ñ!2¸sÈQÏZÉZØŸK™K˜°·±ô<€Cñ �—
‘
˜AŸH™H a§f¡fÒ&J°·±×0AÑ0AÀ'Ó0JÈCÓP€EØ‡E�E×Ñ�U×*Ñ*°!Ð*Ó4Ô5Ø�]‰]ò >ˆÜŒf�Q‹i˜VÕ$Ø—‘ò 	>ˆAÜ�I˜aŸf™f˜X RÐ(¨!´#·*±*Ö=ñ	>ð>ð ×!Ñ!ò UˆÜ�˜˜6™˜ 3 q¨¡z l°"°Q°x±[°MÐBÌÏÉÖTðUà�\‰\ò CˆÜ�˜˜%™�z  A g¡J <Ð0´s·z±zÖBðCä	ˆF�1—5‘5�'˜œC §¡Ó.Ð/¨yÐ
9ÄÇ
Á
ÕKØ—’ U§]¢]ˆ1Ð9¸Ð9øô% ò Ø	�‰”�A“�Šûðús   È+R Ò	S ÒR;Ò;S )Úreturnrp   )r/   z
str | NonerŽ   z	list[str])N)r€   zlist[str] | NonerŽ   rd   )ra   Ú
__future__r   r_   rf   ri   Úpathlibr   r(   r0   r�   © r)   r'   ú<module>r’      s+   ðñõ
 #ã Û Û 
Ý óóBõ1:r)   