o
    i                     @   s   d dl mZ d dl mZ d dl mZ d dlZ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G d	d
 d
ejjZG dd dejjZG dd dejjZ			ddejdejdedededeejejf fddZdd ZdS )    )List)Tuple)UnionN)ComplexTensor)make_pad_maskc                       s   e Zd Z									dded	ed
ededededededef fddZdede	e
jejee f dee
je
jf fddZ  ZS )FeatureTransform>     P           NTFfsn_fftn_melsfminfmax
stats_fileapply_uttmvnuttmvn_norm_meansuttmvn_norm_varsc
           
         sj   t    || _t|||||d| _|| _|d urt|| _nd | _| jd ur0t||	d| _	d S d | _	d S )N)r   r   r   r   r   
norm_means	norm_vars)
super__init__r   LogMellogmelr   	GlobalMVN
global_mvnUtteranceMVNuttmvn)
selfr   r   r   r   r   r   r   r   r   	__class__ \/home/ubuntu/.local/lib/python3.10/site-packages/funasr/frontends/utils/feature_transform.pyr      s   


zFeatureTransform.__init__xilensreturnc                 C   s   |  dvrtd|   t|s tt||j}|  dkrP| j	rAtj
|d}|d d d d |d d f }n|d d d d dd d f }n|}|jd |jd  }| ||\}}| jd urq| ||\}}| jr|| ||\}}||fS )N)      zInput dim must be 3 or 4: r)      r   )dim
ValueErrortorch	is_tensor
from_numpynpasarraytodevicetrainingrandomrandintsizerealimagr   r   r   r   r   )r    r%   r&   chh_r#   r#   r$   forward+   s"   

zFeatureTransform.forward)	r   r	   r
   r   NNTTF)__name__
__module____qualname__intfloatstrboolr   r   r   r-   
LongTensorr0   ndarrayr   r   Tensorr=   __classcell__r#   r#   r!   r$   r      sH    	
r   c                       sx   e Zd ZdZ							dd	ed
ededededef fddZdd Zde	j
de	jdee	j
e	jf fddZ  ZS )r   a  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
        norm: {None, 1, np.inf} [scalar]
            if 1, divide the triangular mel weights by the width of the mel band
            (area normalization).  Otherwise, leave all the triangles aiming for
            a peak value of 1.0

    r   r	   r
   r   NF   r   r   r   r   r   htkc           
   	      sT   t    t|||||||d}|| _tjjdi |}	| dt	|	j
  d S )N)srr   r   r   r   rJ   normmelmatr#   )r   r   dictmel_optionslibrosafiltersmelregister_bufferr-   r/   TrB   )
r    r   r   r   r   r   rJ   rL   _mel_optionsrM   r!   r#   r$   r   `   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>w   s     z$LogMel.extra_repr.<locals>.<genexpr>)joinrO   itemsr    r#   r#   r$   
extra_reprv   s   zLogMel.extra_reprfeatr&   r'   c                 C   s6   t || j}|d  }|t||dd}||fS )N#B;rI   r   )r-   matmulrM   logmasked_fillr   )r    r_   r&   mel_featlogmel_featr#   r#   r$   r=   y   s   zLogMel.forward)r   r	   r
   r   NFrI   )r>   r?   r@   __doc__rA   rB   rD   r   r^   r-   rG   rE   r   r=   rH   r#   r#   r!   r$   r   L   s<    r   c                	       sh   e Zd ZdZ			ddedededef fdd	Zd
d Zde	j
de	jdee	j
e	jf fddZ  ZS )r   a  Apply global mean and variance normalization

    Args:
        stats_file(str): npy file of 1-dim array or text file.
            From the _first element to
            the {(len(array) - 1) / 2}th element are treated as
            the sum of features,
            and the rest excluding the last elements are
            treated as the sum of the square value of features,
            and the last elements eqauls to the number of samples.
        std_floor(float):
    Tr`   r   r   r   epsc           
   	      s   t    || _|| _|| _t|}|t}t	|d d dks'J |j
| d }|d t	|d d  | }|t	|d d d | ||  }tt||}	| dt|tj  | dtd|	tj  d S )NrI   r*   r   biasscale)r   r   r   r   r   r0   loadastyperB   lenshapeflattenmaximumsqrtrS   r-   r/   float32)
r    r   r   r   rg   statscountmeanvarstdr!   r#   r$   r      s   


$"zGlobalMVN.__init__c                 C   s   d| j  d| j d| j S )Nzstats_file=z, norm_means=, norm_vars=)r   r   r   r]   r#   r#   r$   r^      s   
zGlobalMVN.extra_reprr%   r&   r'   c                 C   sH   | j r|| j|7 }|t||dd | jr || j|9 }||fS )NrI   r   )r   ri   type_asrc   r   r   rj   r    r%   r&   r#   r#   r$   r=      s   zGlobalMVN.forward)TTr`   )r>   r?   r@   rf   rC   rD   rB   r   r^   r-   rG   rE   r   r=   rH   r#   r#   r!   r$   r      s,    r   c                       sZ   e Zd Zddededef fddZd	d
 Zdejdej	de
ejej	f fddZ  ZS )r   TFr`   r   r   rg   c                    s    t    || _|| _|| _d S )N)r   r   r   r   rg   )r    r   r   rg   r!   r#   r$   r      s   

zUtteranceMVN.__init__c                 C   s   d| j  d| j S )Nznorm_means=rx   r   r]   r#   r#   r$   r^      s   zUtteranceMVN.extra_reprr%   r&   r'   c                 C   s   t ||| j| j| jdS )N)r   r   rg   )utterance_mvnr   r   rg   rz   r#   r#   r$   r=      s   zUtteranceMVN.forwardTFr`   )r>   r?   r@   rD   rB   r   r^   r-   rG   rE   r   r=   rH   r#   r#   r!   r$   r      s    r   TFr`   r%   r&   r   r   rg   r'   c           	      C   s   | | }| jdd|dddf  }|r%| |dddddf 8 } | }n| |dddddf  }|t||dd |rg|djdd|dddf  }tj||d}| | dddddf  } | }||fS )zApply utterance mean and variance normalization

    Args:
        x: (B, T, D), assumed zero padded
        ilens: (B, T, D)
        norm_means:
        norm_vars:
        eps:

    rI   )r+   Nr   r*   )min)ry   sumrc   r   powr-   clamprq   )	r%   r&   r   r   rg   ilens_ru   x_rv   r#   r#   r$   r{      s   
"r{   c                 C   s*   t | j|| j| j| j| j| j| j| jd	S )N)	r   r   r   r   r   r   r   r   r   )	r   fbank_fsr   
fbank_fmin
fbank_fmaxr   r   r   r   )argsr   r#   r#   r$   feature_transform_for   s   r   r|   )typingr   r   r   rP   numpyr0   r-   torch_complex.tensorr   *funasr.models.transformer.utils.nets_utilsr   nnModuler   r   r   r   rG   rE   rD   rB   r{   r   r#   r#   r#   r$   <module>   s:    ?9:
%