o
    ߥi                     @   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   register_buffer)selfr   r   r   	__class__ ^/home/ubuntu/.local/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__torch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]
    N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>Rescalec                 S   s   g | ]}t |qS r   r   r   r   r   r   r"   S   s    Splice   )open	readlines	enumeratefindstripsplitlenrefindallintnparraytile)	cmvn_filemeansvariancef	all_linesidxlinesegs	next_line	means_str
means_listvars_str	vars_list
splice_strsplice_list
copy_timescmvnr   r   r   load_kaldi_cmvn6   sF   

$
rD   )r-   numpyr0   r   nnModuler   rD   r   r   r   r   <module>   s
    