o
    4ѹgm0                     @   s   d dl Z 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
 zd dlmZ W n   ed Y d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ eddeddG dd de
jZG dd de
jZdS )    N)Optional)Tuple)Union)ComplexTensorz$Please install torch_complex firstly)LogMel)Stft)Frontend)make_pad_mask)tablesZfrontend_classesDefaultFrontendZEspnetFrontendc                       s   e Zd ZdZ																d$d
ededededee dedededededededee dedef fddZ	defddZ
dejdeejef deejejf fd d!Zdejdejdejfd"d#Z  ZS )%r   sConventional frontend structure for ASR.
    Stft -> WPE -> MVDR-Beamformer -> Power-spec -> Mel-Fbank -> CMVN
    >     N   hannTFP   fsn_fft
win_length
hop_lengthwindowcenter
normalizedonesidedn_melsfminfmaxhtkfrontend_conf
apply_stftuse_channelc              	      s   t    t|}|| _|| _|rt|||||||d| _nd | _|| _|d ur8t	dd|d d i|| _
nd | _
t|||	|
||d| _|	| _|| _d| _d S )Nr   r   r   r   r   r   r   idim      r   r   r   r   r   r   default )super__init__copydeepcopyr   r   r   stftr   r   frontendr   logmelr   r    frontend_type)selfr   r   r   r   r   r   r   r   r   r   r   r   r   r   r    kwargs	__class__r'   \/Users/admin/.pyenv/versions/3.10.0/lib/python3.10/site-packages/funasr/frontends/default.pyr)      s<   




zDefaultFrontend.__init__returnc                 C      | j S Nr   r0   r'   r'   r4   output_sizeV      zDefaultFrontend.output_sizeinputinput_lengthsc           
      C   s@  t |tr
t|}|jtjkr| }| jd ur"| ||\}}nt	|d |d }|}| j
d urFt |t	s=J t|| 
||\}}}| dkr| jr|| jd urd|d d d d | jd d f }n&tj|d}|d d d d |d d f }n|d d d d dd d f }|jd |jd  }| ||\}	}|	|fS )N.r   .r$      r#   r   )
isinstancelisttorchZtensordtypeZfloat64floatr,   _compute_stftr   r-   typedimtrainingr    nprandomrandintsizerealimagr.   )
r0   r<   r=   
input_stft
feats_lens_maskchinput_powerinput_featsr'   r'   r4   forwardY   s*   




 zDefaultFrontend.forwardc                 C   X   |  ||\}}| dksJ |j|jd dksJ |jt|d |d }||fS Nr@   r#   r>   r?   r,   rH   shaper   r0   r<   r=   rP   rQ   r'   r'   r4   rF      
   zDefaultFrontend._compute_stft)r   r   Nr   r   TFTr   NNFNTN)__name__
__module____qualname____doc__intr   strbooldictr)   r:   rC   Tensorr   rB   r   rW   rF   __classcell__r'   r'   r2   r4   r      sr    	
9
$,c                +       s  e Zd ZdZ																							d,d
ededededededee dedededededededee dedededededef* fdd Z	d!efd"d#Z
d$ejd%ejd!eejejf fd&d'Zd$ejd%ejd!ejfd(d)Zd*d+ Z  ZS )-MultiChannelFrontendr   r   r   Nr   TFr   r$   r   r   r   r   frame_lengthframe_shiftr   r   r   r   r   r   r   r   r   r   r    lfr_mlfr_n	cmvn_filemcc              	      sj  t    t|}|d u r|d u r|d | _|d | _n|d u r.|d u r.| j| _| j| _n	td td |rHt	|| j| j|||	|
d| _
nd | _
|| _|d uratdd|d d i|| _nd | _t||||||d| _|| _|| _|| _| js| jd urtd| j  ntd	 || _| jd ur| | j\}}| d
t| | dt| d| _d S )N   zOOnly one of (win_length, hop_length) and (frame_length, frame_shift)can be set.r$   r!   r"   r#   r%   zuse the channel %dzrandom select channelmeanstdZmultichannelfrontendr'   )r(   r)   r*   r+   r   r   loggingerrorexitr   r,   r   r   r-   r   r.   r   r    ro   inforn   
_load_cmvnZregister_bufferrC   Z
from_numpyr/   )r0   r   r   r   r   rj   rk   r   r   r   r   r   r   r   r   r   r   r    rl   rm   rn   ro   rq   rr   r2   r'   r4   r)      s`   









zMultiChannelFrontend.__init__r5   c                 C   r6   r7   r8   r9   r'   r'   r4   r:      r;   z MultiChannelFrontend.output_sizer<   r=   c                 C   s,  | j d ur| ||\}}nt|d |d }|}| jd ur2t|ts)J t|| ||\}}}| dkry| jsy| jrk| j	d urS|d d d d | j	d d f }n&t
j|d}|d d d d |d d f }n|d d d d dd d f }|jd |jd  }| ||\}	}| jr|	 dkr|	d}
|	d}|	dd|
| dd }	|d| }nd}|	||fS | jd ur|d u r|	|	dg|	d}| j|	j|	j| _| j|	j|	j| _t||	d}|	jr|	| j }	n|	| j7 }	|	jr|	|d	}	n|	 |d	 |	| j9 }	|	|fS )
Nr>   r?   r@   r#   r   r$   rZ   r   g        )!r,   rF   r   r-   rA   rG   rH   ro   rI   r    rJ   rK   rL   rM   rN   rO   r.   Z	transposeZreshape
contiguousrepeatZsqueezern   Znew_fullrq   toZdevicerD   rr   r	   Zrequires_gradZmasked_fillZmasked_fill_)r0   r<   r=   rP   rQ   rR   rS   rT   rU   rV   ZbtZchannel_sizer'   r'   r4   rW      sN   


 




zMultiChannelFrontend.forwardc                 C   rX   rY   r[   r]   r'   r'   r4   rF   3  r^   z"MultiChannelFrontend._compute_stftc                 C   s  t |ddd}| }W d    n1 sw   Y  g }g }tt|D ]O}||  }|d dkrQ||d   }|d dkrP|dt|d  }t|}q%q%|d d	krt||d   }|d dkrt|dt|d  }	t|	}q%q%t|tj	}
t|tj	}|
|fS )
Nrzutf-8)encodingr   z
<AddShift>r$   z<LearnRateCoef>   z	<Rescale>)
open	readlinesrangelensplitrB   rJ   arrayZastyperE   )r0   rn   flinesZ
means_listZ	vars_listiZ	line_itemZadd_shift_lineZrescale_lineZmeansvarsr'   r'   r4   rw   ?  s0   
zMultiChannelFrontend._load_cmvn)r   r   NNNNr   TFTr   NNFNTNr$   r$   NT)r_   r`   ra   rb   rc   r   rd   re   rf   r)   r:   rC   rg   r   rW   rF   rw   rh   r'   r'   r2   r4   ri      s    	
Q
Hri   )r*   typingr   r   r   rs   ZnumpyrJ   rC   Ztorch.nnnnZtorch_complex.tensorr   printZfunasr.frontends.utils.log_melr   Zfunasr.frontends.utils.stftr   Zfunasr.frontends.utils.frontendr   Z*funasr.models.transformer.utils.nets_utilsr	   Zfunasr.registerr
   registerModuler   ri   r'   r'   r'   r4   <module>   s*    


z