
    hJJj                     `   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	m
Z d dlZdZdZdZdZeez  Zeez  Zed	z  Zeez  Zeez  Zee   ed
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j6                  fd       Z ed      d        ZddZ	 	 ddeeej>                  f   dedefdZ y)    N)	lru_cache)CalledProcessErrorrun)OptionalUnioni>  i           Ffilesrc                    |rg d}nddd| g}|j                  ddddd	d
dddt        |      dg       	 t        |dd      j                  }t        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.
    )ffmpeg-izpipe:0r   z-nostdinr   z-threads0z-fs16lez-ac1z-acodec	pcm_s16lez-ar-T)capture_outputcheckzFailed to load audio: Ng      @)extendstrr   stdoutr   RuntimeErrorstderrdecodemxarraynp
frombufferint16flattenastypefloat32)r   r   
from_stdincmdoutes         [/Users/ahmed/devFolder/claude-voice/.venv/lib/python3.12/site-packages/mlx_whisper/audio.py
load_audior*      s    & (T40 JJCgs;s2w P#d$7>> 88BMM#rxx0199;BB2::NQXXX  P3AHHOO4E3FGHaOPs   B1 1	C&:'C!!C&)axislengthr,   c                4   | j                   |   |kD  r6t        d      g| j                  z  }t        d|      ||<   | t        |         } | j                   |   |k  r=d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.
    Nr   )r   r   )shapeslicendimtupler   pad)r   r-   r,   sl
pad_widthss        r)   pad_or_trimr6   B   s     {{46!Dk]UZZ'F#4eBi {{46!X

*
vD(99:
4uj)L    )maxsizen_melsreturnc                     | dv s
J d|         t         j                  j                  t         j                  j                  t              dd      }t        j                  |      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.npzmel_)ospathjoindirname__file__r   load)r9   filenames     r)   mel_filtersrG   S   s]     Y?"6vh ??ww||BGGOOH5xARSH778tF8_--r7   c                 ^    t        j                  t        j                  | dz         d d       S )N   r+   )r   r   r   hanning)sizes    r)   rJ   rJ   e   s%    88BJJtax("-..r7   c                     ||}||dz  }dd}|dz  } || ||      } |dg}	| j                   |z
  |z   |z  }
|
|g}t        j                  | ||	      } t        j                  j	                  | |z        S )N   c                     |dk(  rt        j                  | ||fg      S |dk(  r5| d|dz    d d d   }| |dz    d d d d   }t        j                  || |g      S t        d|       )NconstantreflectrI   r+   zInvalid pad_mode )r   r3   concatenate
ValueError)xpaddingpad_modeprefixsuffixs        r)   _padzstft.<locals>._padp   s    z!66!w0122"q7Q;'"-F1~+DbD1F>>61f"5660
;<<r7   r
   rI   )r/   strides)rO   )rK   r   
as_stridedfftrfft)rS   windownpersegnoverlapnfftr,   rU   rX   rT   rY   tr/   s               r)   stftrb   j   s    |19= lGQ"AmG	
'	H	$1AIE
aug6A66;;q6z""r7   audiorT   c                 J   t        | t              rt        |       } n/t        | t        j                        st        j                  |       } |dkD  rt        j
                  | d|f      } t        t              }t        | |t        t              }|ddddf   j                         j                         }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, mx.array], shape = (*)
        The path to audio or either a NumPy or mlx array containing the audio waveform in 16 kHz

    n_mels: int
        The number of Mel-frequency filters, only 80 is supported

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

    Returns
    -------
    mx.array, shape = (80, n_frames)
        An  array that contains the Mel spectrogram
    r   )r^   r_   Nr+   g|=g       @g      @)
isinstancer   r*   r   r   r3   rJ   N_FFTrb   
HOP_LENGTHabssquarerG   Tmaximumlog10max)	rc   r9   rT   r]   freqs
magnitudesfiltersmel_speclog_specs	            r)   log_mel_spectrogramrs      s    0 %5!rxx({uq'l+U^F
CEssAv""$++-J&!GGII%Hzz(E*002Hzz(HLLNS$89H3#%HOr7   )   NNr+   rP   )r<   r   )!r@   	functoolsr   
subprocessr   r   typingr   r   mlx.corecorer   numpyr   SAMPLE_RATErf   rg   CHUNK_LENGTH	N_SAMPLESN_FRAMESN_SAMPLES_PER_TOKENFRAMES_PER_SECONDTOKENS_PER_SECONDr   intr*   r6   r   rG   rJ   rb   ndarrayrs    r7   r)   <module>r      s$   
  . "   
;&	
" 1n :- #66  $C=KE 'YS 'Yc 'YT &/ r s  " 4. . . ." 4/ /#8 )bjj!)) )r7   