o
    Qdi                     @   s   d dl ZG dd dZdS )    Nc                   @   s   e Zd Z					dddZedd	d
Ze								d dejdedededejde	de
de	de	de	fddZd!dejfddZdS )"FeatureExtractorP   >          c                 C   sT   || _ || _|| _|| | _| j| | _|| | _|| _| j|||dd| _	d S )N)n_melsfloat32)
n_fft
hop_lengthchunk_length	n_samplesnb_max_framestime_per_framesampling_rateget_mel_filtersastypemel_filters)selfZfeature_sizer   r   r   r
    r   D/home/jaya/work/projects/WHISPER/faster_whisper/feature_extractor.py__init__   s   

zFeatureExtractor.__init__   c                 C   sF  t |}tjj|d|  d}d}d}t|||d }d}d}|||  }	d}
|
| | }tdd	 }||k}|
t||| |   |	|< t|	}|	d
d|dd
 }|d d  tj	|d d
 dd }|dd  tj	|dd  dd }t
t|t||}d|	d|d  |	d |   }|tj	|dd9 }|S )Ng      ?)ndg        g%qF@   gP@g     @@g@g      ;@   axisg       @)intnpfftZrfftfreqlinspacelogexpdiffreshapeexpand_dimsmaximum
zeros_likeminimum)srr
   r   ZfftfreqsZmin_melZmax_melZmelsZf_minZf_spZfreqsZ
min_log_hzZmin_log_melZlogstepZlog_tZfdiffZrampslowerupperweightsZenormr   r   r   r      s*   
$" z FeatureExtractor.get_mel_filtersNTreflectFinput_arrayr
   r   
win_lengthwindowcentermode
normalizedonesidedreturn_complexc
                 C   s  |d ur|n|d }|d ur|n|}t | }
|	d ur|	n
|
p'|d uo't |}	|	s2|	d u r2tdt | jt jsD|
sDtd| j | jdksN| jdk rWtd| j d| jdkrft j| dd	} d
}nd}|rz|d }t j| d||ff|d} | j	\}}|dks||krtd| d| |dkrtd| |dks||krtd| |d ur|jdks|j	d |krtd| d|j	 ||k r|| d }t j
||jd}||||| < n|}d|| |  }t jj| |||f| jd || jd  | jd f} |d ur| | } |
}|d ur|n| }|r d}nd }|r7|r,tdt jj| |d|d}n
t jj| |d|d}|d}|rN|d}|	rS|S t |S )N   z;stft requires the return_complex parameter for real inputs.zAstft: expected an array of floating point or complex values, got r   r   z)stft: expected a 1D or 2D array, but got zD arrayr   r   TF)r   r   )r6   zstft: expected 0 < n_fft <= z, but got n_fft=z2stft: expected hop_length > 0, but got hop_length=z;stft: expected 0 < win_length <= n_fft, but got win_length=z=stft: expected a 1D window array of size equal to win_length=z, but got window with size )dtypeZorthoz9Cannot have onesided output if window or input is complexr   )r   r    norm)r   r   r   )r"   iscomplexobj
ValueError
issubdtyper;   floatingndimr)   padshapezeroslibstride_tricks
as_stridedstridesr#   Zrfft	transposesqueezereal)r2   r
   r   r3   r4   r5   r6   r7   r8   r9   Zinput_is_complexZinput_array_1dZ
pad_amountbatchlengthleftZwindow_Zn_framesZcomplex_fftr<   outputr   r   r   stftC   s   






zFeatureExtractor.stftwaveformc           	      C   s   |dur|| j  | _| j| j | _|jtjur|tj}|r't|d|f}t	| j
d dd d}| j|| j
| j|ddd}t|d	ddf d
 }| j| }ttj|ddd}t|| d }|d d }|S )zH
        Compute the log-Mel spectrogram of the provided audio.
        Nr   r   r   r	   T)r4   r9   	complex64.r   g|=)a_mina_maxg       @g      @)r   r   r   r   r;   r"   r	   r   rB   hanningr
   rP   absr   log10clipr*   max)	r   rQ   paddingr   r4   rP   Z
magnitudesZmel_specZlog_specr   r   r   __call__   s.   
zFeatureExtractor.__call__)r   r   r   r   r   )r   )NNNTr1   FNN)r   N)__name__
__module____qualname__r   staticmethodr   r"   ndarrayr!   boolstrrP   r[   r   r   r   r   r      sR    
*	
 r   )numpyr"   r   r   r   r   r   <module>   s    