o
    i                     @   s   d dl mZ d dlZd dlmZ d dlmZ edd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S )    )TupleN)make_pad_mask)tablesnormalize_classesUtteranceMVNc                	       sd   e Zd Z			d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 )r   TF#B;
norm_means	norm_varsepsc                    s    t    || _|| _|| _d S N)super__init__r   r	   r
   )selfr   r	   r
   	__class__ Y/home/ubuntu/.local/lib/python3.10/site-packages/funasr/models/normalize/utterance_mvn.pyr      s   

zUtteranceMVN.__init__c                 C   s   d| j  d| j S )Nznorm_means=z, norm_vars=)r   r	   )r   r   r   r   
extra_repr   s   zUtteranceMVN.extra_reprNxilensreturnc                 C   s   t ||| j| j| jdS )z\Forward function

        Args:
            x: (B, L, ...)
            ilens: (B,)

        )r   r	   r
   )utterance_mvnr   r	   r
   )r   r   r   r   r   r   forward   s   
zUtteranceMVN.forward)TFr   r   )__name__
__module____qualname__boolfloatr   r   torchTensorr   r   __classcell__r   r   r   r   r   	   s(    TFr   r   r   r   r	   r
   r   c           
      C   s@  |du r|  | dg| d}|| j| jjdgdd t|  d D R  }| jr9| 	t
|| dd} n
| t
|| dd | jddd	| }|rs| |8 } |ro| d
jddd	| }tj| |d}| |  } | |fS |r| | }	|	t
||	dd |	d
jddd	| }tj| |d}| | } | |fS )zApply utterance mean and variance normalization

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

    Nr      c                 S   s   g | ]}d qS )r!   r   ).0_r   r   r   
<listcomp>?   s    z!utterance_mvn.<locals>.<listcomp>g        T)dimkeepdim   )min)new_fullsizetodevicedtypeviewranger&   requires_gradmasked_fillr   masked_fill_sumpowr   clampsqrt)
r   r   r   r	   r
   ilens_meanvarstdyr   r   r   r   ,   s*   4r   )NTFr   )typingr   r   *funasr.models.transformer.utils.nets_utilsr   funasr.registerr   registernnModuler   r   r   r   r   r   r   r   r   <module>   s.    
$