o
    4ѹg	                     @   s@   d dl Z d dlZd dlmZ d dlmZ G dd dejjZdS )    N)Tuple)make_pad_maskc                       s   e Zd ZdZ							ddeded	ed
edededef fddZdd Z	dde	j
de	j
dee	j
e	j
f fddZ  ZS )LogMela  Convert STFT to fbank feats

    The arguments is same as librosa.filters.mel

    Args:
        fs: number > 0 [scalar] sampling rate of the incoming signal
        n_fft: int > 0 [scalar] number of FFT components
        n_mels: int > 0 [scalar] number of Mel bands to generate
        fmin: float >= 0 [scalar] lowest frequency (in Hz)
        fmax: float >= 0 [scalar] highest frequency (in Hz).
            If `None`, use `fmax = fs / 2.0`
        htk: use HTK formula instead of Slaney
    >     P   NFfsn_fftn_melsfminfmaxhtklog_basec           
         s|   t    |d u rdn|}|d u r|d n|}t||||||d}|| _|| _tjjdi |}	| dt	
|	j  d S )Nr      )srr	   r
   r   r   r   melmat )super__init__dictmel_optionsr   librosafiltersZmelZregister_buffertorchZ
from_numpyTfloat)
selfr   r	   r
   r   r   r   r   Z_mel_optionsr   	__class__r   b/Users/admin/.pyenv/versions/3.10.0/lib/python3.10/site-packages/funasr/frontends/utils/log_mel.pyr      s   

zLogMel.__init__c                 C   s   d dd | j D S )Nz, c                 s   s"    | ]\}}| d | V  qdS )=Nr   ).0kvr   r   r   	<genexpr>6   s     z$LogMel.extra_repr.<locals>.<genexpr>)joinr   items)r   r   r   r   
extra_repr5   s   zLogMel.extra_reprfeatilensreturnc                 C   s   t || j}t j|dd}| jd u r| }n| jdkr"| }n| jdkr,| }n
| t | j }|d urH|t	||dd}||fS |j
|dg|dt jd}||fS )	Ng|=)ming       @g      $@   g        r   )Z
fill_valueZdtype)r   matmulr   clampr   loglog2log10Zmasked_fillr   Znew_fullsizelong)r   r(   r)   Zmel_featZlogmel_featr   r   r   forward8   s   





 zLogMel.forward)r   r   r   NNFN)N)__name__
__module____qualname____doc__intr   boolr   r'   r   ZTensorr   r4   __classcell__r   r   r   r   r      sB    r   )	r   r   typingr   Z*funasr.models.transformer.utils.nets_utilsr   nnModuler   r   r   r   r   <module>   s
    