B æFb2Xã@sLdZddlmZddlZddlmmZddlZddlZej   ej   e ¡¡ddl mZmZddlmZddlZddlTddlmZmZmZddlmZGd d „d ejƒZGd d „d ejƒZGd d„dejƒZGdd„dejƒZGdd„dejƒZ Gdd„dejƒZ!dd„Z"dd„Z#d#dd„Z$dd„Z%dd„Z&d d!„Z'e(d"krHe'ƒdS)$z yxhu@ASLP-NPU in Sogou inc. éN)ÚConvSTFTÚ ConviSTFT)Ú show_paramsé)Ú*)ÚrealimagÚistftÚ cut_padding)ÚUNetcs&eZdZd‡fdd„ Zdd„Z‡ZS) ÚFTBéé écs®tt|ƒ ¡||_t tj||ddgdt |¡t ¡¡|_ t tj |||dddt  |¡t ¡¡|_ tj ||dd|_t tj|d|ddgdt |¡t ¡¡|_dS) Nr)Ú kernel_sizer é)rÚpaddingF)Úbiasé)Úsuperr Ú__init__Ú in_channelÚnnÚ SequentialÚConv2dÚ BatchNorm2dÚReLUÚconv1ÚConv1dÚ BatchNorm1dÚconv1dÚLinearÚfreq_fcÚconv2)ÚselfÚ input_dimrÚ r_channel)Ú __class__©úº/mnt/nas_sg/mit_sg/shengkui.zhao/ComplexNN/ComplexNN_16k_V5_UniDFSMN_W40S20_multiUnetx2_residual_mask_Ch_FSMN_full_DNS_Challenge_reverb_20211123/ComplexNN_16k_MaaS/DCUNet/phasen_dccrn.pyrs  z FTB.__init__c Csœ| |¡}| ¡\}}}}t |||||g¡}| |¡}t |||jd|g¡}||} t | dd¡} | | ¡} t | dd¡} t | |gd¡} |  | ¡} | S)z9 inputs should be [Batch, Ca, Dim, Time] rré) rÚsizeÚtorchÚreshaperrÚ transposer!Úcatr") r#ÚinputsÚ conv1_outÚBÚCÚDÚTÚ reshape1_outÚ conv1d_outÚatt_outÚ freqfc_outÚcat_outÚoutputsr'r'r(Úforward2s    z FTB.forward)r r r)Ú__name__Ú __module__Ú __qualname__rr;Ú __classcell__r'r')r&r(r sr cs$eZdZ‡fdd„Zdd„Z‡ZS)Ú InforComucs$tt|ƒ ¡tj||dd|_dS)N)rr)r)rr@rrrÚ comu_conv)r#Ú src_channelÚ tgt_channel)r&r'r(rLszInforComu.__init__cCs|t | |¡¡}|S)N)r+ÚtanhrA)r#ÚsrcÚtgtr:r'r'r(r;QszInforComu.forward)r<r=r>rr;r?r'r')r&r(r@Js r@cs&eZdZd‡fdd„ Zdd„Z‡ZS)Ú GLayerNorm2dçê-™—q=csLtt|ƒ ¡||_t t d|ddg¡¡|_t t  d|ddg¡¡|_ dS)Nr) rrGrÚepsrÚ Parameterr+ÚonesÚbetaÚzerosÚgamma)r#rrI)r&r'r(rYszGLayerNorm2d.__init__cCsx| | d¡d¡}tj|ddd}t |d¡}t |d¡}tj|dddgdd}||t ||j¡|j|j }|S)NréÿÿÿÿrT)Úkeepdimrr)) Úviewr*r+ÚvarÚ unsqueezeÚmeanÚsqrtrIrLrN)r#r/Ú inputs_newrRrTr:r'r'r(r;_s  $zGLayerNorm2d.forward)rH)r<r=r>rr;r?r'r')r&r(rGWsrGcs&eZdZd‡fdd„ Zdd„Z‡ZS) ÚTSBér écsþtt|ƒ ¡t||d|_t tj||dddt |¡t  ¡¡|_ t tj||dddt |¡t  ¡¡|_ t tj||dddt |¡t  ¡¡|_ t||d|_ t tj||dddt|ƒ¡|_t tj||dddt|ƒ¡|_t||ƒ|_t||ƒ|_dS)N)r$r)rr)rr)rr)ré)ré )rrWrr Úftb1rrrrrÚ amp_conv1Ú amp_conv2Ú amp_conv3Úftb2rGÚ phase_conv1Ú phase_conv2r@Úp2a_comuÚa2p_comu)r#r$Ú channel_ampÚ channel_phase)r&r'r(rms2        z TSB.__init__c Csf| |¡}| |¡}| |¡}| |¡}| |¡}| |¡}| |¡} | | |¡} | || ¡} | | fS)zl amp should be [Batch, Ca, Dim, Time] amp should be [Batch, Cr, Dim, Time] ) r\r]r^r_r`rarbrcrd) r#ÚampÚphaseÚamp_out1Úamp_out2Úamp_out3Úamp_out4Úamp_out5Ú phase_out1Ú phase_out2Úamp_outÚ phase_outr'r'r(r;“s         z TSB.forward)rXr rY)r<r=r>rr;r?r'r')r&r(rWks&rWcsLeZdZd‡fdd„ Zdd„Zd d „Zdd d „Zddd„Zddd„Z‡Z S)ÚDCCRNéédéÚhanningc sœtƒ ¡|dd|_||_||_||_| |_d} t|j|j|j|jd| d|_t |j|j|j|jd| d|_ t d||||d|_ t d||||d|_ dS)a> :param complex: Whether to use complex networks. :param model_complexity: :param model_depth: Only two options are available : 10, 20 :param log_amp: Whether to use log amplitude to estimate signals :param padding_mode: Encoder's convolution filter. 'zeros', 'reflect' rrTÚcomplex)Ú feature_typeÚfix)rwÚmodel_complexityÚ model_depthÚ padding_modeN)rrÚfeat_dimÚwin_lenÚwin_incÚfft_lenÚwin_typerÚstftrrr ÚunetÚunet2) r#rwrzr{Úlog_ampr|r~rr€rry)r&r'r(r©s zDCCRN.__init__c Csg}| |¡}t |d¡}t |dd…dd…d|j…dd…f|dd…dd…|jd…dd…fgd¡}t |d¡}t |dd¡}| |¡}t |¡}| |¡}t |¡}|  ||¡\}} } |  |¡|  | ¡|  | ¡||}|  ||¡\}} } |  |¡|  | ¡|  | ¡|S)Nrr) r‚r+rSr.r}r-rƒrDr„Ú apply_maskÚappend) r#r/Úout_listÚcmp_specZ unet1_outZ cmp_mask1Z unet2_outZ cmp_mask2Úest_specÚest_wavÚest_maskr'r'r(r;Às.   "           z DCCRN.forwardc CsÄt |dd…dd…dd…dd…df|dd…dd…dd…dd…df|dd…dd…dd…dd…df|dd…dd…dd…dd…df|dd…dd…dd…dd…df|dd…dd…dd…dd…df|dd…dd…dd…dd…df|dd…dd…dd…dd…dfgd¡}t |dd…ddd…dd…f|dd…ddd…dd…fgd¡}t |d¡}t |dd…dd…dd…df|dd…dd…dd…dfgd¡}| |¡}t |d¡}|||fS)Nrr)r+r.Úsqueezer)r#r‰Úcmp_maskrŠr‹r'r'r(r†åsÿ@ @  zDCCRN.apply_maskçcCsVgg}}x2| ¡D]&\}}d|kr0||g7}q||g7}qW||dœ|ddœg}|S)Nr)ÚparamsÚ weight_decayg)Únamed_parameters)r#r‘ÚweightsÚbiasesÚnameÚparamrr'r'r(Ú get_paramsðs   zDCCRN.get_paramsÚMixcCsl|dkr d}xz|t|ƒkr†||}|d}||}|d}||}|d}|dkrl| ||||||¡} | } q| ||||||¡} | } qWtt|ƒdƒ} | }|S|dkrhd}xš|t|ƒkrH||}|d}||}|d}||}|d}|dkr | ||||||¡\}}}|||} q°| ||||||¡\}}}|||} q°Wtt|ƒdƒ} | }|||fSdS)NÚSiSNRrrr)r˜)ÚlenÚ loss_1layerÚint)r#ÚnoisyÚlabelsrˆÚmodeÚcountrŠr‹rŒZ SiSNR_loss1Zloss1Z SiSNR_loss2Zloss2Ú num_layersÚlossÚamp_lossÚ phase_lossÚ SiSNR_lossr'r'r(r¢sD  z DCCRN.losscCs |dkrD| ¡dkr t |d¡}| ¡dkr8t |d¡}t||ƒ S|dkr| ¡dkrft |d¡}| ¡dkr~t |d¡}t||ƒ }| ¡\}} } | |¡} | dd…d|j…dd…f} | dd…|jd…dd…f} | |¡}|dd…d|j…dd…f}|dd…|jd…dd…f}|d|d}t |¡}t | || ||d| || ||dgd¡}d||dk<d||d k<t   |dd…d|j…dd…f|dd…d|j…dd…f¡| }t   |dd…|jd…dd…f|dd…|jd…dd…f¡| }|||}|||fSdS) z¦ mode == 'Mix' est: [B, F*2, T] labels: [B, F*2,T] mode == 'SiSNR' est: [B, T] labels: [B, T] r™r)rr˜Nrg:Œ0âŽyE>rOéþÿÿÿ) Údimr+rÚsi_snrr*r‚r}rUr.ÚFÚmse_loss)r#rÚestr‹ržrŽrŸr¥ÚbÚdÚtÚSÚSrZSiÚYÚYrÚYiZY_powZY_magZgth_maskr£r¤Úall_lossr'r'r(r›)s8               8  @@ zDCCRN.loss_1layer)rsrtrurv)r)r˜)r˜) r<r=r>rr;r†r—r¢r›r?r'r')r&r(rr¨s %  'rrcs:eZdZd‡fd d „ Zdd d „Zdd„Zddd„Z‡ZS)ÚPHASENértérvr)ér[é,c sÚtt|ƒ ¡d|_|dd|_||_||_||_||_d} t |j|j|j|jd| d|_ t |j|j|j|jd| d|_ t  t jd|ddgdd t  |¡t  ¡t j||ddgd d t  |¡t  ¡¡|_t  t jd|dd gd d t j||dd gdd ¡|_t  ¡|_x,t|jƒD]} |j t|j||d¡qWt  t j|dddgdt  d¡t  ¡¡|_t  t j|dddgd¡|_t j|jd|dd|_t  t  |dd¡t  ¡t  dd¡t  ¡t  dd¡t  ¡¡|_ t!|ƒdS)Nr)rrTrw)rxryé)r)r)rr)rr)r)rrrZ)rr[)r$rerfrY)r)Ú bidirectionaliXi)"rrµrÚ num_blocksr}r~rr€rrr‚rrrrrrrr]raÚ ModuleListÚtsbsÚranger‡rWr^rrbÚGRUÚrnnr ÚSigmoidÚfcsr) r#r~rr€rr¼rerfÚrnn_numsryÚidx)r&r'r(r`sh         zPHASEN.__init__çcCsVgg}}x2| ¡D]&\}}d|kr0||g7}q||g7}qW||dœ|ddœg}|S)Nr)rr‘g)r’)r#r‘r“r”r•r–rr'r'r(r—±s   zPHASEN.get_paramsc CsT| |¡}t |d¡}t |dd…dd…d|j…dd…f|dd…dd…|jd…dd…fgd¡}t t |dd…df¡dt |dd…df¡d¡}t |d¡}| |¡}| |¡}|}|}xz/amp_spec: {}, spec: {}, phase: {}, est_spec: {}z est_spec: {})r‚r+rSr.r}rUÚabsr]raÚ enumerater¾r^r-r*r,rÁrÃrbÚprintÚformatrr)r#r/r‰Úamp_specÚspecrhÚs_specÚs_phaserÅÚlayerr1r4r3r2rŠr‹r'r'r(r;ÃsN   "       $(  zPHASEN.forwardr˜cCsb|dkrD| ¡dkr t |d¡}| ¡dkr8t |d¡}t||ƒ S|dkr^| ¡\}}}| |¡}|}t |dd…d|j…dd…fd|dd…|jd…dd…fd¡} t |dd…d|j…dd…fd|dd…|jd…dd…fd¡} | d} | d} t  | | ¡|} | d|   ddd¡}t  ||||¡|}| d |d }|| |fSdS) z¦ mode == 'Mix' est: [B, F*2, T] labels: [B, F*2,T] mode == 'SiSNR' est: [B, T] labels: [B, T] r™r)rr˜Nrg333333Ó?g:Œ0âŽyE>gà?) r§r+rr¨r*r‚rUr}r©rªÚrepeat)r#r«ržrŸr¬r­r®Ú gth_cspecÚ est_cspecÚ gth_mag_specÚ est_mag_specÚgth_cprs_mag_specÚest_cprs_mag_specr£Ú compress_coffr¤r´r'r'r(r¢s8        $$z PHASEN.loss)r¶rtr·rvr)r¸r[r¹)rÆ)r˜)r<r=r>rr—r;r¢r?r'r')r&r(rµ^sH ?rµcCstj|ddd}||}|S)NrOT)rP)r+rT)ÚdatarTr'r'r(Ú remove_dc-srÙcCstj||ddd}|S)NrOT)rP)r+Úsum)Ús1Ús2Únormr'r'r(Úl2_norm1srÞç:Œ0âŽyE>c Csdt||ƒ}t||ƒ}||||}||}t||ƒ}t||ƒ}dt ||||¡} t | ¡S)Né )rÞr+Úlog10rT) rÛrÜrIÚ s1_s2_normÚ s2_s2_normÚs_targetÚe_nosieÚ target_normÚ noise_normÚsnrr'r'r(r¨8s    r¨cCs4t d¡t ddddg¡}tƒ}t||ƒjƒdS)Néràr irt)r+Ú manual_seedÚrandnr rÉÚshape)r/Únetr'r'r(Útest_ftbFs rîcCsTt d¡t ddddg¡}t ddddg¡}tƒ}|||ƒ\}}t|j|jƒdS)Nréràr irtrY)r+rêrërWrÉrì)r/rhríÚout1Úout2r'r'r(Útest_tsbLs  rñcCszt d¡t dddg¡}t ddg¡}tƒ}||ƒ\}}t|j|jƒ|j||dd}|j||dd}td|d |ƒdS) Nréràriúr™)rŸr˜zmix:zSNR:)r+rêrërµrÉrìr¢)r/Ú wav_labelrírŠr‹Úsisnrr˜r'r'r(Ú test_PHASENTs  rôÚ__main__)rß))Ú__doc__Útorch.nnrr+Ztorch.nn.functionalÚ functionalr©ÚosÚsysÚpathr‡ÚdirnameÚ__file__Ú conv_stftrrÚshowrÚnumpyÚnpÚconstantÚutilsrrr rƒr ÚModuler r@rGrWrrrµrÙrÞr¨rîrñrôr<r'r'r'r(Ús8   1 =7P