Ë
    »Aæj  ã                  ó  — U d Z ddlmZ ddlZddlZddlZddlZddlZddlm	Z	 ddl
ZddlZ ej                  d«      ZdZdd„Z	 	 d	 	 	 dd„Zdd	„Zddd
„Zdd„Zdd„Zddd„Zi Zded<   dd„Zdd„Z	 	 	 	 	 	 d d„Zd!d„Zy)"zgSpeech activity (Silero VAD via faster-whisper) and ASR (cloud Whisper, local faster-whisper fallback).é    )ÚannotationsN)ÚPathÚdubevali€>  c                óÎ   — t        j                  t        | «      d¬«      \  }}|j                  dkD  r|j	                  d¬«      }|t
        k7  rt        | › dt
        › d|› �«      ‚|S )NÚfloat32)Údtypeé   )Úaxisz	 must be z Hz mono, got )ÚsfÚreadÚstrÚndimÚmeanÚSRÚ
ValueError)ÚpathÚxÚsrs      ú2/root/repos/pocs/video-evals/src/dubeval/speech.pyÚloadr      s\   € Ü�G‰G”C˜“I YÔ/�E€A€rØ‡v�v�‚zØ�F‰F˜ˆF‹NˆØ	ŒR‚xÜ˜D˜6 ¬2¨$¨n¸R¸DÐAÓBÐBØ€Hó    c                óŽ   — ddl m}m}  ||||d¬«      } || |«      D �cg c]  }|d   t        z  |d   t        z  f‘Œ c}S c c}w )Nr   )Ú
VadOptionsÚget_speech_timestampsé   )Ú	thresholdÚmin_silence_duration_msÚmin_speech_duration_msÚspeech_pad_msÚstartÚend)Úfaster_whisper.vadr   r   r   )r   r   Úmin_silence_msÚmin_speech_msr   r   ÚoptsÚts           r   Úvad_segmentsr'      sI   € çDá 	À>Ø-:È"ôN€Dá6KÈAÈtÓ6TÖU°ˆQˆw‰Zœ"‰_˜a ™h¬™mÒ,ÒUÐUùÒUs    Ac                óÞ   — g }t        | «      D ]A  \  }}|r'||d   d   z
  |k  rt        |d   d   |«      |d   d<   Œ/|j                  ||g«       ŒC |D ��cg c]	  \  }}||f‘Œ c}}S c c}}w )Néÿÿÿÿr	   )ÚsortedÚmaxÚappend)ÚsegsÚgapÚoutÚsÚes        r   Úmerger2   %   s~   € Ø€CÜ�t“ò ‰ˆˆ1Ù�1�s˜2‘w˜q‘z‘> SÒ(Ü˜S ™W Q™Z¨Ó+ˆC�‰G�AŠJà�J‰J˜˜1�vÕð	ð
  #×#‘t�q˜!ˆQ�ŠFÓ#Ð#ùÓ#s   ÁA)c           
     óò   — t        j                  t        t        j                  ||z  «      «      dz   t        «      }| D ]5  \  }}d|t        ||z  «      t        t        j                  ||z  «      «       Œ7 |S )Nr	   T)ÚnpÚzerosÚintÚceilÚbool)r-   ÚdurationÚhopÚmr0   r1   s         r   Úmaskr<   /   sg   € Ü
�‰””R—W‘W˜X¨™^Ó,Ó-°Ñ1´4Ó8€AØò 5‰ˆˆ1Ø04ˆŒ#ˆa�#‰g‹,”sœ2Ÿ7™7 1 s¡7Ó+Ó,Ñ-ð5à€Hr   c                óp   — t        j                  ddddt        | «      ddddd	d
dgdd¬«      j                  S )NÚffmpegz-vÚerrorz-iz-acÚ1z-b:aÚ48kz-fÚmp3ú-T)ÚcheckÚcapture_output)Ú
subprocessÚrunr   Ústdout)Úwavs    r   Ú_to_mp3rJ   9   sB   € Ü�>‰>˜8 T¨7°D¼#¸c»(ÀEÈ3ÐPVÐX]Ð_cÐejÐloÐpØ $°Tô;ß;A¹6ðBr   c                óN  — ddl m}  |t        j                  j	                  d«      xs4 t        j                  j	                  d«      xs t        j                  d   t        j                  j	                  d«      xs@ t        j                  j	                  d«      xs t        j                  j	                  d«      d	d
¬«      }t        j                  t        | «      «      }d|_        |rd|ini } |j                  j                  j                  d||dddgdœ|¤Ž}t        |d«      r|j                  «       n
t        |«      }|j	                  d«      xs g D �	cg c]1  }	t        |	d   «      t        |	d   «      |	d   j!                  «       dœ‘Œ3 }
}	|j	                  d«      xs g D �cg c]1  }t        |d   «      t        |d   «      |d   j!                  «       dœ‘Œ3 }}|
s|rt#        |«      }
|
st%        d|› d�«      ‚d|› �|j	                  d«      |
|dœS c c}	w c c}w )Nr   )ÚOpenAIÚDUBEVAL_ASR_API_KEYÚOMNIROUTE_API_KEYÚOPENAI_API_KEYÚDUBEVAL_ASR_BASE_URLÚOMNIROUTE_BASE_URLÚOPENAI_BASE_URLi,  é   )Úapi_keyÚbase_urlÚtimeoutÚmax_retriesz	audio.mp3ÚlanguageÚverbose_jsonÚwordÚsegment)ÚmodelÚfileÚresponse_formatÚtimestamp_granularitiesÚ
model_dumpÚsegmentsr    r!   Útext©r    r!   rb   Úwords©r    r!   rZ   z
ASR model z returned no segments or wordszcloud:©ÚenginerX   ra   rd   © )ÚopenairL   ÚosÚenvironÚgetÚioÚBytesIOrJ   ÚnameÚaudioÚtranscriptionsÚcreateÚhasattrr`   ÚdictÚfloatÚstripÚ_segments_from_wordsÚRuntimeError)rI   rX   r\   rL   ÚclientÚbufÚkwÚrÚdr0   ra   Úwrd   s                r   Ú_cloudr   >   sõ  € ÝáœBŸJ™JŸN™NÐ+@ÓAò 4ÄRÇZÁZÇ^Á^ÐTgÓEhò 4Ü—z‘zÐ"2Ñ3ÜŸZ™ZŸ^™^Ð,BÓCò 9ÄrÇzÁzÇ~Á~ÐVjÓGkò 9Ü—z‘z—~‘~Ð&7Ó8À#ÐSTôV€Fô �*‰*”W˜S“\Ó
"€CØ€C„HÙ#+ˆ*�hÑ	°€BØ*ˆ�‰×#Ñ#×*Ñ*ð 	^°¸SÐR`ØDJÈIÐCVñ	^ØZ\ñ	^€Aä! ! \Ô2ˆ�‰Œ¼¸Q»€AàŸ™˜zÓ*Ò0¨bö2Øô    '¡
Ó+´E¸!¸E¹(³OÈQÈvÉYÏ_É_ÓM^Ó_ð 2€Hð 2ð —e‘e˜G“nÒ*¨ö,Øô ˜Q˜w™ZÓ(´°q¸±x³È!ÈFÉ)Ï/É/ÓJ[Ó\ð ,€Eð ,á™Ü'¨Ó.ˆÙÜ˜Z¨ wÐ.LÐMÓNÐNØ˜u˜gÐ&°A·E±E¸*Ó4EÐS[ÐfkÑlÐlùò2ùò,s   Å6HÆ,6H"c                ó¾   — g }| D ]U  }|r3|d   |d   d   z
  |k  r"|d   |d   d<   |d   dxx   ||d   z   z  cc<   Œ8|j                  |d   |d   |d   dœ«       ŒW |S )Nr    r)   r!   rb   rZ   rc   )r,   )rd   r.   Újoinerr/   r~   s        r   rw   rw   V   s…   € Ø€CØò RˆÙ�1�W‘:  B¡¨¡Ñ.°#Ò5Ø˜u™XˆC�‰G�E‰NØ�‰G�F‹O˜v¨¨&©	Ñ1Ñ1ŒOà�J‰J  7¡°A°e±HÀaÈÁiÑPÕQðRð €Jr   zdict[tuple[str, int], object]Ú_MODELSc                ób   — ddl m} | |ft        vr || dd|¬«      t        | |f<   t        | |f   S )Nr   )ÚWhisperModelÚcpuÚint8)ÚdeviceÚcompute_typeÚcpu_threads)Úfaster_whisperr„   r‚   )r\   Úthreadsr„   s      r   Úwhisper_modelrŒ   d   s>   € Ý+àˆwÐœwÑ&Ù$0°¸uÐSYÐgnÔ$oŒ�˜Ð Ñ!Ü�E˜7Ð#Ñ$Ð$r   c           	     óÌ  — t        ||«      }|j                  t        | «      |dddd¬«      \  }}g g }}|D ]”  }	|j                  |	j                  |	j
                  |	j                  j                  «       dœ«       ||	j                  xs g D �
cg c]4  }
|
j                  |
j
                  |
j                  j                  «       dœ‘Œ6 c}
z  }Œ– d|› �|j                  ||dœS c c}
w )	NTr	   F)rX   Úword_timestampsÚ
vad_filterÚ	beam_sizeÚcondition_on_previous_textrc   re   zlocal:rf   )rŒ   Ú
transcriber   r,   r    r!   rb   rv   rd   rZ   rX   )rI   rX   r\   r‹   r;   r-   Úinfora   rd   r0   r~   s              r   Ú_localr”   l   sÕ   € Ü�e˜WÓ%€AØ—‘œc #›h°È4Ð\`Ø()Àeð ó M�J€Dˆ$à˜"ˆe€HØò cˆØ�‰ !§'¡'°!·%±%ÀÇÁÇÁÃÑPÔQØÐTU×T[ÑT[ÒTaÐ_aÖbÈq˜AŸG™G¨A¯E©E¸1¿6¹6¿<¹<»>ÓJÒbÑb‰ðcð ˜u˜gÐ&°D·M±MÈxÐbgÑhÐhùò cs   Â9C!c                ó’  — |j                  «       r#t        j                  |j                  «       «      S |j                  }|€+|j                  |j                  › d|j                  › d�«       d}|r	 t        | ||«      }|€t        | |||«      }|j                  |d	<   |j                  s"|d
   D ]  }
|
d   j                  dd«      |
d<   Œ |j!                  t        j"                  |d¬«      «       |S # t        $ rI}	|j                  d|› d|j                  › d|› d|	› �«       t        j                  |d   «       Y d}	~	ŒÂd}	~	ww xY w)z\lang: dubeval.lang.Lang. Languages Whisper doesn't list are transcribed with auto-detection.Nz (z6) is not a Whisper language; ASR runs with auto-detectzcloud ASR (z, z) failed, using local z: r)   r�   ra   rb   ú Ú F)Úensure_ascii)ÚexistsÚjsonÚloadsÚ	read_textÚwhisperr,   ro   Útagr   Ú	ExceptionÚlogÚwarningr”   r�   ÚspacedÚreplaceÚ
write_textÚdumps)rI   ÚlangÚcacheÚcloud_modelÚlocal_modelr‹   ÚwarningsÚcodeÚresultr1   r0   s              r   r’   r’   w   s:  € ð ‡|�|„~Ü�z‰z˜%Ÿ/™/Ó+Ó,Ð,Ø�<‰<€DØ€|Ø�‰˜4Ÿ9™9˜+ R¨¯© zÐ1gÐhÔiØ€FÙð	&Ü˜C  {Ó3ˆFð €~Ü˜˜T ;°Ó8ˆØ—{‘{€Fˆ8ÑØ�;Š;Ø˜
Ñ#ò 	3ˆAØ˜&™	×)Ñ)¨#¨rÓ2ˆAˆfŠIð	3à	×Ñ”T—Z‘Z °UÔ;Ô<Ø€Møô ò 	&Ø�O‰O˜k¨+¨°b¸¿¹¸
ÐBXÐYdÐXeÐegÐhiÐgjÐkÔlÜ�K‰K˜ ™×%Ñ%ûð	&ús   Á2C4 Ã4	EÃ=?EÅEc                óä   ‡‡— | j                  dd«      }| d   r,|j                  ˆˆfd„| d   D «       «      j                  «       S |j                  ˆˆfd„| d   D «       «      j                  «       S )zOWords whose midpoint falls in [start, end); falls back to overlapping segments.r�   r–   rd   c              3  ó^   •K  — | ]$  }‰|d    |d   z   dz  cxk  r‰k  sŒn n|d   –— Œ& y­w)r    r!   rS   rZ   Nrh   )Ú.0r~   r!   r    s     €€r   ú	<genexpr>ztext_in.<locals>.<genexpr>”   s8   øè ø€ Òd A¸À1ÀWÁ:ÐPQÐRWÑPXÑCXÐ\]ÑB]Ô9cÐ`cÖ9c�a˜•iÑdùs   ƒ- -c              3  óL   •K  — | ]  }|d    ‰kD  sŒ|d   ‰k  sŒ|d   –— Œ y­w)r!   r    rb   Nrh   )r¯   r0   r!   r    s     €€r   r°   ztext_in.<locals>.<genexpr>•   s,   øè ø€ Ò^ ¸¸%¹À5Ó8HÈQÈwÉZÐZ]ÓM]�!�F•)Ñ^ùs   ƒ$‘$š
$ra   )rl   Újoinrv   )Úasrr    r!   Újs    `` r   Útext_inrµ   �   s^   ù€ à�‰�˜#Ó€AØ
ˆ7‚|Ø�v‰vÔd¨¨W©ÔdÓd×jÑjÓlÐlØ�6‰6Ô^ S¨¡_Ô^Ó^×dÑdÓfÐfr   )r   r   Úreturnú
np.ndarray)g      à?éú   é–   )
r   r·   r   ru   r#   r6   r$   r6   r¶   úlist[tuple[float, float]])r-   rº   r.   ru   r¶   rº   )g{®Gáz„?)r-   rº   r9   ru   r:   ru   r¶   r·   )rI   r   r¶   Úbytes)rI   r   rX   ú
str | Noner\   r   r¶   rt   )g333333ã?r–   )rd   ú
list[dict]r.   ru   r�   r   r¶   r½   )r\   r   r‹   r6   )
rI   r   rX   r¼   r\   r   r‹   r6   r¶   rt   )rI   r   r§   r   r¨   r¼   r©   r   r‹   r6   rª   z	list[str]r¶   rt   )r³   rt   r    ru   r!   ru   r¶   r   )Ú__doc__Ú
__future__r   rm   rš   Úloggingrj   rF   Úpathlibr   Únumpyr4   Ú	soundfiler   Ú	getLoggerr    r   r   r'   r2   r<   rJ   r   rw   r‚   Ú__annotations__rŒ   r”   r’   rµ   rh   r   r   ú<module>rÆ      s·   ðÚ mÝ "ã 	Û Û Û 	Û Ý ã Û à€g×Ñ˜	Ó"€à
€óð ORØ&)ðVØ #ðVØ.GóVó$ôóBó
mô0ð *,€Ð	&Ó +ó%óiðØðØ'0ðØ59óô2gr   