U æ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Úreshaper!rÚ 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)rrr)rrDrrrÚ comu_conv)r%Ú src_channelÚ tgt_channelr(r*r+rLszInforComu.__init__cCs|t | |¡¡}|S)N)r.ÚtanhrE)r%ÚsrcÚtgtr=r*r*r+r>QszInforComu.forwardr?r*r*r(r+rDJs rDcs&eZdZd‡fdd„ Zdd„Z‡ZS)Ú GLayerNorm2dçê-™—q=csLtt|ƒ ¡||_t t d|ddg¡¡|_t t  d|ddg¡¡|_ dS)Nr) rrKrÚepsrÚ Parameterr.ÚonesÚbetaÚzerosÚgamma)r%rrMr(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ÚsqrtrMrPrR)r%r2Ú inputs_newrWrYr=r*r*r+r>_s  $zGLayerNorm2d.forward)rLr?r*r*r(r+rKWsrKcs&eZdZd‡fdd„ Zdd„Z‡ZS) ÚTSBr 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)rrr)ré)ré )rr\rr Úftb1rrrrrÚ amp_conv1Ú amp_conv2Ú amp_conv3Úftb2rKÚ phase_conv1Ú phase_conv2rDÚp2a_comuÚa2p_comu)r%r&Ú channel_ampÚ channel_phaser(r*r+rms@ÿýýýÿþþ z TSB.__init__c Csf| |¡}| |¡}| |¡}| |¡}| |¡}| |¡}| |¡} | | |¡} | || ¡} | | fS)zl amp should be [Batch, Ca, Dim, Time] amp should be [Batch, Cr, Dim, Time] ) r`rarbrcrdrerfrgrh) 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)r r r]r?r*r*r(r+r\ks&r\csLeZdZd‡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)r{Úmodel_complexityÚ model_depthÚ padding_modeN)rrÚfeat_dimÚwin_lenÚwin_incÚfft_lenÚwin_typerÚstftrrr ÚunetÚunet2) r%r{rr€Úlog_amprrƒr„r…r†r~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.rXr1r‚r0rˆrHr‰Ú apply_maskÚappend) r%r2Úout_listÚcmp_specZ unet1_outZ cmp_mask1Z unet2_outZ cmp_mask2Úest_specÚest_wavÚest_maskr*r*r+r>Às2    þü           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.r1Úsqueezer)r%rŽÚcmp_maskrrr*r*r+r‹åsÿ@ @  zDCCRN.apply_maskçcCsRgg}}| ¡D]&\}}d|kr.||g7}q||g7}q||dœ|ddœg}|S©Nr)ÚparamsÚ weight_decayr”©Únamed_parameters©r%r—ÚweightsÚbiasesÚnameÚparamr–r*r*r+Ú get_paramsðs   þþýzDCCRN.get_paramsÚMixcCsd|dkrœd}|t|ƒkr„||}|d}||}|d}||}|d}|dkrj| ||||||¡} | } q | ||||||¡} | } q tt|ƒdƒ} | }|S|dkr`d}|t|ƒkrB||}|d}||}|d}||}|d}|dkr| ||||||¡\}}}|||} qª| ||||||¡\}}}|||} qªtt|ƒdƒ} | }|||fSdS)NÚSiSNRrrr,r )ÚlenÚ loss_1layerÚint)r%ÚnoisyÚlabelsrÚmodeÚcountrrr‘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) ú¦ mode == 'Mix' est: [B, F*2, T] labels: [B, F*2,T] mode == 'SiSNR' est: [B, T] labels: [B, T] r¡r,rr Nrç:Œ0âŽyE>rSéþÿÿÿ) Údimr.r’Úsi_snrr-r‡r‚rZr1ÚFÚmse_loss)r%r¥Úestrr¦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)rwrxryrz)r”)r )r ) r@rArBrr>r‹rŸrªr£rCr*r*r(r+rv¨s %  'rvcs:eZdZd‡fd d „ Zdd d „Zdd„Zddd„Z‡ZS)ÚPHASENrwrxryrzr,é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  ¡|_t|jƒD]} |j t|j||d¡qt  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,rrTr{r|é)r,rr)rr,r)rrr^)rr_)r&rirjr]r)Ú bidirectionaliXr )"rr¿rÚ num_blocksr‚rƒr„r…r†rr‡rrrrrrrrareÚ ModuleListÚtsbsÚrangerŒr\rbrrfÚGRUÚrnnr"ÚSigmoidÚfcsr) r%rƒr„r…r†rÄrirjÚrnn_numsr~Úidxr(r*r+r`s€ þþôþþû þÿýÿý  úzPHASEN.__init__r”cCsRgg}}| ¡D]&\}}d|kr.||g7}q||g7}q||dœ|ddœg}|Sr•r˜ršr*r*r+rŸ±s   þþýzPHASEN.get_paramsc CsP| |¡}t |d¡}t |dd…dd…d|j…dd…f|dd…dd…|jd…dd…fgd¡}t t |dd…df¡dt |dd…df¡d¡}t |d¡}| |¡}| |¡}|}|}t |j ƒD].\}} |dkrî||7}||7}| ||ƒ\}}qÎ|  |¡}t  |dd¡}|  ¡\} } } } t || | | | g¡}| |¡d}| |¡}t || | | dg¡}t  |dd¡}| |¡}|t t |dd…df¡dt |dd…df¡d¡d d¡}|||}td |  ¡|  ¡|  ¡|  ¡¡ƒt |dd…df|dd…dfgd¡}td |  ¡¡ƒ| |¡}t |d¡}||fS)Nrrrr,r¯z/amp_spec: {}, spec: {}, phase: {}, est_spec: {}z est_spec: {})r‡r.rXr1r‚rZÚabsrareÚ enumeraterÆrbr0r-r/rÉrËrfÚprintÚformatrr’)r%r2rŽÚamp_specÚspecrlÚs_specÚs_phaserÍÚlayerr4r7r6r5rrr*r*r+r>Ãs`    þüÿÿ      ÿÿýý $(  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) r®r¡r,rr Nrg333333Ó?r¯gà?) r±r.r’r²r-r‡rZr‚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ªsJ        ÿÿÿÿÿþþýz PHASEN.loss)rwrxryrzr,rÀr_rÁ)r”)r )r@rArBrrŸr>rªrCr*r*r(r+r¿^s÷Q ?r¿cCstj|ddd}||}|S©NrSTrT)r.rY)ÚdatarYr*r*r+Ú remove_dc-srácCstj||ddd}|Srß)r.Úsum)Ús1Ús2Únormr*r*r+Úl2_norm1srær¯c Csdt||ƒ}t||ƒ}||||}||}t||ƒ}t||ƒ}dt ||||¡} t | ¡S)Né )rær.Úlog10rY) rãrärMÚ 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 r rx)r.Ú manual_seedÚrandnr rÐÚshape)r2Únetr*r*r+Útest_ftbFs rõcCsTt d¡t ddddg¡}t ddddg¡}tƒ}|||ƒ\}}t|j|jƒdS)Nrðrçr r rxr])r.rñròr\rÐró)r2rlrôÚ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ª)r2Ú wav_labelrôrrÚ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 rDrKr\rvr¿rárær²rõrørûr@r*r*r*r+Ús8   1 =7P