Ë
    È:jQ  ã                   ó¢  — d dl Z d dlmZ d dlmZmZ d dlmZmZ d dl	Z
d dlZd dlmc mZ ddlmZ dZdZd	Zd
Zeez  Z eee«      Zedz  Z eee«      Z eee«      Zefdedefd„Zefddœdedefd„Z ed¬«      dedej>                  fd„«       Z 	 	 	 ddeee
jB                  ej>                  f   dededeeeejD                  f      fd„Z#y)é    N)Ú	lru_cache)ÚCalledProcessErrorÚrun)ÚOptionalÚUnioné   )Ú	exact_divi€>  i�  é    é   é   ÚfileÚsrc                 ó|  — ddddd| dddd	d
ddt        |«      dg}	 t        |dd¬«      j                  }t        j                  |t        j                  «      j                  «       j                  t        j                  «      dz  S # t        $ r,}t	        d|j
                  j                  «       › �«      |‚d}~ww xY w)a?  
    Open an audio file and read as mono waveform, resampling as necessary

    Parameters
    ----------
    file: str
        The audio file to open

    sr: int
        The sample rate to resample the audio if necessary

    Returns
    -------
    A NumPy array containing the audio waveform, in float32 dtype.
    Úffmpegz-nostdinz-threadsÚ0z-iz-fÚs16lez-acÚ1z-acodecÚ	pcm_s16lez-arú-T)Úcapture_outputÚcheckzFailed to load audio: Ng      à@)Ústrr   Ústdoutr   ÚRuntimeErrorÚstderrÚdecodeÚnpÚ
frombufferÚint16ÚflattenÚastypeÚfloat32)r   r   ÚcmdÚoutÚes        úb/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/whisper/audio.pyÚ
load_audior'      s¹   € ð* 	ØØ�CØˆdØˆgØˆsØ�;ØŒs�2‹wØð
€CðPÜ�# d°$Ô7×>Ñ>ˆô �=‰=˜œbŸh™hÓ'×/Ñ/Ó1×8Ñ8¼¿¹ÓDÀwÑNÐNøô ò PÜÐ3°A·H±H·O±OÓ4EÐ3FÐGÓHÈaÐOûðPús   œB Â	B;Â'B6Â6B;éÿÿÿÿ)ÚaxisÚlengthr)   c          	      óš  — t        j                  | «      r²| j                  |   |kD  r2| j                  |t        j                  || j
                  ¬«      ¬«      } | j                  |   |k  rZdg| j                  z  }d|| j                  |   z
  f||<   t        j                  | |ddd…   D ��cg c]  }|D ]  }|‘Œ Œ c}}«      } | S | j                  |   |kD  r| j                  t        |«      |¬«      } | j                  |   |k  r=dg| j                  z  }d|| j                  |   z
  f||<   t        j                  | |«      } | S c c}}w )zO
    Pad or trim the audio array to N_SAMPLES, as expected by the encoder.
    )Údevice)ÚdimÚindex)r   r   r   Nr(   )Úindicesr)   )ÚtorchÚ	is_tensorÚshapeÚindex_selectÚaranger,   ÚndimÚFÚpadÚtakeÚranger   )Úarrayr*   r)   Ú
pad_widthsÚsizesr7   s         r&   Úpad_or_trimr=   A   sC  € ô ‡��uÔØ�;‰;�tÑ˜vÒ%Ø×&Ñ&Ø¤§¡¨V¸E¿L¹LÔ Ið 'ó ˆEð �;‰;�tÑ˜vÒ%Ø ˜ E§J¡JÑ.ˆJØ ! 6¨E¯K©K¸Ñ,=Ñ#=Ð>ˆJ�tÑÜ—E‘E˜%°:¹dÀ¸dÑ3C×!U¨%ÈuÒ!UÈ¢#Ð!U #Ó!UÓVˆEð €Lð �;‰;�tÑ˜vÒ%Ø—J‘J¤u¨V£}¸4�JÓ@ˆEà�;‰;�tÑ˜vÒ%Ø ˜ E§J¡JÑ.ˆJØ ! 6¨E¯K©K¸Ñ,=Ñ#=Ð>ˆJ�tÑÜ—F‘F˜5 *Ó-ˆEà€Lùó "Vs   Â.E)ÚmaxsizeÚn_melsÚreturnc                 óP  — |dv s
J d|› �«       ‚t         j                  j                  t         j                  j                  t        «      dd«      }t        j                  |d¬«      5 }t        j                  |d|› �   «      j                  | «      cddd«       S # 1 sw Y   yxY w)	ad  
    load the mel filterbank matrix for projecting STFT into a Mel spectrogram.
    Allows decoupling librosa dependency; saved using:

        np.savez_compressed(
            "mel_filters.npz",
            mel_80=librosa.filters.mel(sr=16000, n_fft=400, n_mels=80),
            mel_128=librosa.filters.mel(sr=16000, n_fft=400, n_mels=128),
        )
    >   éP   é€   zUnsupported n_mels: Úassetszmel_filters.npzF)Úallow_pickleÚmel_N)
ÚosÚpathÚjoinÚdirnameÚ__file__r   Úloadr0   Ú
from_numpyÚto)r,   r?   Úfilters_pathÚfs       r&   Úmel_filtersrQ   [   sŒ   € ð �YÑÐ?Ð"6°v°hÐ ?Ó?Ðä—7‘7—<‘<¤§¡§¡´Ó 9¸8ÐEVÓW€LÜ	�‰�¨EÔ	2ð ?°aÜ×Ñ  D¨¨ /Ñ 2Ó3×6Ñ6°vÓ>÷?÷ ?ò ?ús   Á(*BÂB%ÚaudioÚpaddingr,   c                 óª  — t        j                  | «      s0t        | t        «      rt	        | «      } t        j
                  | «      } |�| j                  |«      } |dkD  rt        j                  | d|f«      } t        j                  t        «      j                  | j                  «      }t        j                  | t        t        |d¬«      }|ddd…f   j                  «       dz  }t        | j                  |«      }||z  }t        j                   |d¬	«      j#                  «       }	t        j$                  |	|	j'                  «       d
z
  «      }	|	dz   dz  }	|	S )a}  
    Compute the log-Mel spectrogram of

    Parameters
    ----------
    audio: Union[str, np.ndarray, torch.Tensor], shape = (*)
        The path to audio or either a NumPy array or Tensor containing the audio waveform in 16 kHz

    n_mels: int
        The number of Mel-frequency filters, only 80 and 128 are supported

    padding: int
        Number of zero samples to pad to the right

    device: Optional[Union[str, torch.device]]
        If given, the audio tensor is moved to this device before STFT

    Returns
    -------
    torch.Tensor, shape = (n_mels, n_frames)
        A Tensor that contains the Mel spectrogram
    Nr   T)ÚwindowÚreturn_complex.r(   r   g»½×Ùß|Û=)Úming       @g      @)r0   r1   Ú
isinstancer   r'   rM   rN   r6   r7   Úhann_windowÚN_FFTr,   ÚstftÚ
HOP_LENGTHÚabsrQ   ÚclampÚlog10ÚmaximumÚmax)
rR   r?   rS   r,   rU   r[   Ú
magnitudesÚfiltersÚmel_specÚlog_specs
             r&   Úlog_mel_spectrogramrf   n   s  € ô8 �?‰?˜5Ô!Ü�eœSÔ!Ü˜uÓ%ˆEÜ× Ñ  Ó'ˆàÐØ—‘˜Ó ˆØ�‚{Ü—‘�e˜a ˜\Ó*ˆÜ×ÑœuÓ%×(Ñ(¨¯©Ó6€FÜ�:‰:�eœU¤J°vÈdÔS€DØ�c˜3˜B˜3�h‘×#Ñ#Ó%¨Ñ*€Jä˜%Ÿ,™,¨Ó/€GØ˜Ñ#€Hä�{‰{˜8¨Ô/×5Ñ5Ó7€HÜ�}‰}˜X x§|¡|£~¸Ñ';Ó<€HØ˜3‘ #Ñ%€HØ€Oó    )rB   r   N)$rG   Ú	functoolsr   Ú
subprocessr   r   Útypingr   r   Únumpyr   r0   Útorch.nn.functionalÚnnÚ
functionalr6   Úutilsr	   ÚSAMPLE_RATErZ   r\   ÚCHUNK_LENGTHÚ	N_SAMPLESÚN_FRAMESÚN_SAMPLES_PER_TOKENÚFRAMES_PER_SECONDÚTOKENS_PER_SECONDr   Úintr'   r=   ÚTensorrQ   Úndarrayr,   rf   © rg   r&   ú<module>r{      s2  ðÛ 	Ý ß .ß "ã Û ß Ð å ð €Ø€Ø€
Ø€Ø˜;Ñ&€	Ù�Y 
Ó+€à  1‘nÐ Ù˜k¨:Ó6Ð Ù˜kÐ+>Ó?Ð ð %0ñ %O�Sð %O˜có %OðP &/ð ¸rò ˜sð ¸ó ñ4 �4Ôð? ð ?¨¯©ò ?ó ð?ð( ØØ15ñ	/Ø��b—j‘j %§,¡,Ð.Ñ/ð/àð/ð ð/ð �U˜3 §¡Ð,Ñ-Ñ.ô	/rg   