o
    )j                     @   s8   d dl Z d dlZd dlZG dd dejjZdd ZdS )    Nc                       sB   e Zd Z	d
dejdejdef fddZdejfdd	Z  ZS )
GlobalCMVNTmeanistdnorm_varc                    s<   t    |j|jksJ || _| d| | d| dS )z
        Args:
            mean (torch.Tensor): mean stats
            istd (torch.Tensor): inverse std, std which is 1.0 / std
        r   r   N)super__init__shaper   Zregister_buffer)selfr   r   r   	__class__ k/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/models/audio/kws/nearfield/cmvn.pyr      s
   
	zGlobalCMVN.__init__xc                 C   s   || j  }| jr|| j }|S )z
        Args:
            x (torch.Tensor): (batch, max_len, feat_dim)

        Returns:
            (torch.Tensor): normalized feature
        )r   r   r   )r	   r   r   r   r   forward(   s   

zGlobalCMVN.forward)T)	__name__
__module____qualname__torchZTensorboolr   r   __classcell__r   r   r
   r   r      s    r   c                 C   s  d}d}t | }| }t|D ]\}}|ddkrT| d}t|dks+J ||d  }td|d }	|	 d}
d	d
 |
D }t|t	|d ksSJ q|ddkr| d}t|dksjJ ||d  }td|d }| d}dd
 |D }t|t	|d ksJ q|ddkr| d}t|dksJ ||d  }td|d }| d}t|t	|d  t	|d ksJ t|}qqW d   n1 sw   Y  t
||g}t
|d|f}|S )z Load the kaldi format cmvn stats file and no need to calculate

    Args:
        cmvn_file: cmvn stats file in kaldi format

    Returns:
        a numpy array of [means, vars]
    NZAddShift       z[\[](.*?)[\]]r   c                 S   s   g | ]}d t | qS )r   float.0sr   r   r   
<listcomp>K   s    z#load_kaldi_cmvn.<locals>.<listcomp>ZRescalec                 S   s   g | ]}t |qS r   r   r   r   r   r   r   S   s    ZSplice   )open	readlines	enumeratefindstripsplitlenrefindallintnparrayZtile)Z	cmvn_fileZmeansZvariancef	all_linesidxlineZsegs	next_lineZ	means_strZ
means_listZvars_strZ	vars_listZ
splice_strZsplice_listZ
copy_timesZcmvnr   r   r   load_kaldi_cmvn6   sF   

$
r2   )r(   numpyr+   r   nnModuler   r2   r   r   r   r   <module>   s
    