§
    |@Ä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
j!        ej        f         dededeeeej"        f                  fd„Z#dS )é    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        }n<# t          $ r/}t	          d|j                             ¦   «         › �¦  «        |‚d}~ww xY wt          j        |t          j	        ¦  «         
                    ¦   «                              t          j        ¦  «        dz  S )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        ú>C:\Projects\Historical\venv\Lib\site-packages\whisper/audio.pyÚ
load_audior'      sÖ   € ð* 	ØØ�CØˆdØˆgØˆsØ�;Ø�s�2‰wŒwØð
€CðPÝ�# d°$Ð7Ñ7Ô7Ô>ˆˆøÝð Pð Pð PÝÐG°A´H·O²OÑ4EÔ4EÐGÐGÑHÔHÈaÐOøøøøðPøøøõ Œ=˜�bœhÑ'Ô'×/Ò/Ñ1Ô1×8Ò8½¼ÑDÔDÀwÑNÐNs    8 ¸
A1Á*A,Á,A1éÿÿÿÿ)ÚaxisÚlengthr)   c                óZ  — t          j        | ¦  «        r›| j        |         |k    r0|                      |t          j        || j        ¬¦  «        ¬¦  «        } | j        |         |k     rHdg| j        z  }d|| j        |         z
  f||<   t          j        | d„ |ddd…         D ¦   «         ¦  «        } n{| j        |         |k    r$|  	                    t          |¦  «        |¬¦  «        } | j        |         |k     r5dg| j        z  }d|| j        |         z
  f||<   t          j        | |¦  «        } | S )	zO
    Pad or trim the audio array to N_SAMPLES, as expected by the encoder.
    )Údevice)ÚdimÚindex)r   r   r   c                 ó   — g | ]	}|D ]}|‘ŒŒ
S © r0   )Ú.0ÚsizesÚpads      r&   ú
<listcomp>zpad_or_trim.<locals>.<listcomp>N   s%   € Ð!UÐ!UÐ!U¨%ÈuÐ!UÐ!UÈ #Ð!UÐ!UÐ!UÐ!Uó    Nr(   )Úindicesr)   )ÚtorchÚ	is_tensorÚshapeÚindex_selectÚaranger,   ÚndimÚFr3   ÚtakeÚranger   )Úarrayr*   r)   Ú
pad_widthss       r&   Úpad_or_trimrB   A   s?  € õ „�uÑÔð .ØŒ;�tÔ˜vÒ%Ð%Ø×&Ò&Ø¥¤¨V¸E¼LÐ IÑ IÔ Ið 'ñ ô ˆEð Œ;�tÔ˜vÒ%Ð%Ø ˜ E¤JÑ.ˆJØ ! 6¨E¬K¸Ô,=Ñ#=Ð>ˆJ�tÑÝ”E˜%Ð!UÐ!U°:¸d¸dÀ¸dÔ3CÐ!UÑ!UÔ!UÑVÔVˆEøàŒ;�tÔ˜vÒ%Ð%Ø—J’J¥u¨V¡}¤}¸4�JÑ@Ô@ˆEàŒ;�tÔ˜vÒ%Ð%Ø ˜ E¤JÑ.ˆJØ ! 6¨E¬K¸Ô,=Ñ#=Ð>ˆJ�tÑÝ”F˜5 *Ñ-Ô-ˆEà€Lr5   )ÚmaxsizeÚn_melsÚreturnc                 ój  — |dv sJ d|› �¦   «         ‚t           j                             t           j                             t          ¦  «        dd¦  «        }t          j        |d¬¦  «        5 }t          j        |d|› �         ¦  «         	                    | ¦  «        cddd¦  «         S # 1 swxY w Y   dS )	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   Úloadr7   Ú
from_numpyÚto)r,   rD   Úfilters_pathÚfs       r&   Úmel_filtersrV   [   sé   € ð �YÐÐÐÐ ?°vÐ ?Ð ?ÑÔÐå”7—<’<¥¤§¢µÑ 9Ô 9¸8ÐEVÑWÔW€LÝ	Œ�¨EÐ	2Ñ	2Ô	2ð ?°aÝÔ  /¨ / /Ô 2Ñ3Ô3×6Ò6°vÑ>Ô>ð?ð ?ð ?ð ?ñ ?ô ?ð ?ð ?ð ?ð ?ð ?ð ?øøøð ?ð ?ð ?ð ?ð ?ð ?s   Á+0B(Â(B,Â/B,rG   ÚaudioÚpaddingr,   c                 óØ  — t          j        | ¦  «        s8t          | t          ¦  «        rt	          | ¦  «        } t          j        | ¦  «        } |�|                      |¦  «        } |dk    rt          j        | d|f¦  «        } t          j	        t          ¦  «                             | j        ¦  «        }t          j        | t          t          |d¬¦  «        }|ddd…f                              ¦   «         dz  }t          | j        |¦  «        }||z  }t          j        |d¬	¦  «                             ¦   «         }	t          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      @)r7   r8   Ú
isinstancer   r'   rR   rS   r=   r3   Úhann_windowÚN_FFTr,   ÚstftÚ
HOP_LENGTHÚabsrV   ÚclampÚlog10ÚmaximumÚmax)
rW   rD   rX   r,   rZ   r`   Ú
magnitudesÚfiltersÚmel_specÚlog_specs
             r&   Úlog_mel_spectrogramrk   n   sB  € õ8 Œ?˜5Ñ!Ô!ð (Ý�e�SÑ!Ô!ð 	&Ý˜uÑ%Ô%ˆEÝÔ  Ñ'Ô'ˆàÐØ—’˜Ñ Ô ˆØ�‚{€{Ý”�e˜a ˜\Ñ*Ô*ˆÝÔ�uÑ%Ô%×(Ò(¨¬Ñ6Ô6€FÝŒ:�e�U¥J°vÈdÐSÑSÔS€DØ�c˜3˜B˜3�h”×#Ò#Ñ%Ô%¨Ñ*€Jå˜%œ,¨Ñ/Ô/€GØ˜Ñ#€HåŒ{˜8¨Ð/Ñ/Ô/×5Ò5Ñ7Ô7€HÝŒ}˜X x§|¢|¡~¤~¸Ñ';Ñ<Ô<€HØ˜3‘ #Ñ%€HØ€Or5   )rG   r   N)$rL   Ú	functoolsr   Ú
subprocessr   r   Útypingr   r   Únumpyr   r7   Útorch.nn.functionalÚnnÚ
functionalr=   Úutilsr	   ÚSAMPLE_RATEr_   ra   ÚCHUNK_LENGTHÚ	N_SAMPLESÚN_FRAMESÚN_SAMPLES_PER_TOKENÚFRAMES_PER_SECONDÚTOKENS_PER_SECONDr   Úintr'   rB   ÚTensorrV   Úndarrayr,   rk   r0   r5   r&   ú<module>r~      s  ðØ 	€	€	€	Ø Ð Ð Ð Ð Ð Ø .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ø "Ð "Ð "Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ø €€€Ø Ð Ð Ð Ð Ð Ð Ð Ð à Ð Ð Ð Ð Ð ð €Ø€Ø€
Ø€Ø˜;Ñ&€	Øˆ9�Y 
Ñ+Ô+€à  1‘nÐ Ø�I˜k¨:Ñ6Ô6Ð Ø�I˜kÐ+>Ñ?Ô?Ð ð %0ð %Oð %O�Sð %O˜cð %Oð %Oð %Oð %OðP &/ð ¸rð ð ð ˜sð ¸ð ð ð ð ð4 €�4ÐÑÔð? ð ?¨¬ð ?ð ?ð ?ñ Ôð?ð( ØØ15ð	/ð /Ø��b”j %¤,Ð.Ô/ð/àð/ð ð/ð �U˜3 ¤Ð,Ô-Ô.ð	/ð /ð /ð /ð /ð /r5   