
    ri                          d dl Z G d d      Zy)    Nc                       e Zd Z	 	 	 	 	 ddZe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       Zddej                  fdZy)FeatureExtractorc                     || _         || _        || _        ||z  | _        | j                  |z  | _        ||z  | _        || _        | j                  |||      j                  d      | _	        y )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)selffeature_sizer   r	   r
   r   s         V/home/jaya/work/projects/FASTER-ASR-WHISPER/faster-asr/faster_asr/feature_extractor.py__init__zFeatureExtractor.__init__   sx     
$(%5!^^z9(=8*//5 0 

&
 	    c                    t        |      }t        j                  j                  |d| z        }d}d}t        j                  |||dz         }d}d}|||z  z   }	d}
|
|z
  |z  }t        j
                  d      d	z  }||k\  }|
t        j                  |||   |z
  z        z  |	|<   t        j                  |	      }|	j                  d
d      |j                  dd
      z
  }|d d  t        j                  |d d
 d      z  }|dd  t        j                  |dd  d      z  }t        j                  t        j                  |      t        j                  ||            }d|	d|dz    |	d | z
  z  }|t        j                  |d      z  }|S )Ng      ?)ndg        g%qF@   gP@g     @@g@g      ;@   axisg       @)intnpfftrfftfreqlinspacelogexpdiffreshapeexpand_dimsmaximum
zeros_likeminimum)srr   r   fftfreqsmin_melmax_melmelsf_minf_spfreqs
min_log_hzmin_log_mellogsteplog_tfdifframpslowerupperweightsenorms                       r   r   z FeatureExtractor.get_mel_filters   s    V 66??UcBh?7 ${{7GVaZ8 t# 
!E)T1&&+$ #!BFF7d5kK6O+P$QQeb!$x'7'72'>>sbnnU3BZa@@ab	BNN591== **R]]512::eU3KL uQ!,uWf~=>2>>%a00r   Ninput_arrayr   r	   
win_lengthwindowcentermode
normalizedonesidedreturn_complexc
                     ||n|dz  }||n|}t        j                  |       }
|	|	n|
xs |d uxr t        j                  |      }	|	s|	t        d      t        j                  | j                  t         j
                        s|
st        d| j                         | j                  dkD  s| j                  dk  rt        d| j                   d      | j                  dk(  rt        j                  | d	      } d
}nd}|r!|dz  }t        j                  | d||ff|      } | j                  \  }}|dk  s||kD  rt        d| d|       |dk  rt        d|       |dk  s||kD  rt        d|       |<|j                  dk7  s|j                  d   |k7  rt        d| d|j                         ||k  r2||z
  dz  }t        j                  ||j                        }|||||z    n|}d||z
  |z  z   }t         j                  j                  j                  | |||f| j                  d   || j                  d   z  | j                  d   f      } || |z  } |
}||n| }|rd}nd }|r1|rt        d      t         j                  j                  | |d|      }n#t         j                  j!                  | |d|      }|j#                  d      }|r|j%                  d      }|	r|S t        j&                  |      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   )rC   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 )dtypeorthoz9Cannot have onesided output if window or input is complexr   )r   r   norm)r   r   r   )r!   iscomplexobj
ValueError
issubdtyperI   floatingndimr)   padshapezeroslibstride_tricks
as_stridedstridesr"   rfft	transposesqueezereal)r?   r   r	   r@   rA   rB   rC   rD   rE   rF   input_is_complexinput_array_1d
pad_amountbatchlengthleftwindow_n_framescomplex_fftrK   outputs                        r   stftzFeatureExtractor.stftC   s    $.#9Zuz
#-#9Zu
??;7
 ) "VvT'9'Uboof>U 	 ."8M 
 }}[..<EU#))*, 
 a;#3#3a#7;K<L<L;MWU 
 q ..1=K!N"N !J&&fz:&>?dK $))v A:.vh6FugN  ?DZLQ  ?j50Mj\Z  {{a6<<?j#@ ST^S_ `006~?  J&1,DhhuFLL9G06GD4*,-G :55 ff**55He$##A&[0033##A&
 %/K ''38[DD O  VVZZu2DZIFVV[[BT[JF!!),^^A&F'v<RWWV_<r   waveformc                    |2|| j                   z  | _        | j                  | j                  z  | _        |j                  t
        j                  ur|j                  t
        j                        }|rt        j                  |d|f      }t        j                  | j                  dz         dd j                  d      }| j                  || j                  | j                  |d      j                  d      }t        j                  |d	ddf         d
z  }| j                  |z  }t        j                  t        j                  |dd            }t        j                   ||j#                         dz
        }|dz   dz  }|S )zH
        Compute the log-Mel spectrogram of the provided audio.
        Nr   r   r   r   T)rA   rF   	complex64.r   g|=)a_mina_maxg       @g      @)r   r   r	   r   rI   r!   r   r   rQ   hanningr   rf   absr   log10clipr*   max)	r   rg   paddingr
   rA   rf   
magnitudesmel_speclog_specs	            r   __call__zFeatureExtractor.__call__   sE   
 #)D,>,>>DN!%4??!BD>>+rzz2HvvhG5HDJJN+CR077	ByyJJOO  
 &
 	 VVDcrcN+q0
##j088BGGHEFG::h(<=sNc)r   )P   i>        i  )   )NNNTreflectFNN)rw   N)__name__
__module____qualname__r   staticmethodr   r!   ndarrayr    boolstrrf   ru    r   r   r   r      s     & ( (T  ! #@=ZZ@=@= @= 	@=
 

@= @= @= @= @= @= @=D   r   r   )numpyr!   r   r   r   r   <module>r      s    b br   