o
    oia                     @   s  d dl Z d dlZd dlZd dlmZmZ d dlmZmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZmZmZmZmZmZ d dlZd dlZd dlZ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 d dl#m$Z$ d dl%m&Z& d dl'm(Z( d dl)m*Z*m+Z+m,Z,m-Z- d dl.m/Z/ d dl0m1Z2 d dl3m4Z4m5Z5m6Z6 d dl7m8Z9 d dl:m;Z;m<Z< d dl=m>Z> dZ?dZ@zd dlAZAW n eBeCeDfy   dZ?dZAY nw dedeeE fddZFeG dfde>de!deeE fd d!ZHd"eEfd#d$ZIg d%dd&ddddd fde>d'eeJ d(eeJ d)eeJ d*eeeJe!gdf  d+eEd,eEd-eeJ d.eeJ d/eKd0eeJeLf fd1d2ZMg d%d&dddfd'eeJ d3eeJ d(eeJ d)eeJ d+eEd,eEd-eeJ d.eeJ d0eeJeLf fd4d5ZNd6gdd7d8ddddfde>d(eeJ d)eeJ d*eeeJe!gdf  d+eEd,eEd9eKd-eeJ d.eeJ d:eeE d0eeJeLf fd;d<ZOd=eJd>eeJeeJeLf f fd?d@ZPG dAdB dBeZQG dCdD dDeQZRG dEdF dFeRZSG dGdH dHeRZTG dIdJ dJeRZUG dKdL dLeRZVG dMdN dNeRZWG dOdP dPeWZXG dQdR dReWZYG dSdT dTeWZZG dUdV dVeWZ[dgdWdXZ\dYeej]e!f dZeej]e!f d"eEd0ej]fd[d\Z^	dgdYeej]e!f dZeej]e!f d"eEd0ej]fd]d^Z8d_ej]d`ej]fdadbZ_d0ej]fdcddZ`dS )h    N)ABCabstractmethod)defaultdictdeque)partial)Pool)NamedTemporaryFile)CallableDictListOptionalTupleUnion)logger)pesq)Tensor)highpass_biquad)Resample)df_features)get_resample_params
load_audioresample
save_audio)ModelParams)dnsmos_dns5)dnsmos_api_reqdnsmos_localdownload_onnx_models)	composite)
as_complex
get_device)DFT	sinc_fastF   Progresstotalc                 c   s    |dk p|dk}t  }z|  }W n ty#   |d usJ |}Y nw t| D ]2\}}|V  |r2q(|d | }	td|	 }
|
| dkrZ|
dkrZ|
|vrZtd||
 ||
 q(d S )Nr   d      z{}: {: >2d}%)	set__len__AttributeError	enumerateintr   infoformatadd)iterabler%   log_freq_percentdescdisable_loggingloggedLkipprogress r:   Q/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/df/evaluation_utils.pylog_progress)   s*   
r<   df_statenoisyf_hp_cutoffc           	      C   s   |    t| dr| jdt d t| dt| dt j}t|||t d\}}}| |||d d}|	t
|  }|d urQtt|| |d }|S )	Nreset_h0r'   )
batch_sizedevicenb_dfdf_bins)rB   r   )cutoff_freq)evalhasattrr@   r    getattrr   rC   r   squeeze	synthesisr   cpunumpyr   torch
from_numpysr)	modelr=   r>   r?   rC   specerb_feat	spec_feataudior:   r:   r;   enhance>   s   
rU   rO   c              
   C   sH   t t| dtt t| dt t| ddt t| dt t| ddt t| ddS )NrO   T)rO   
use_octave)rO   nb)stoisisdrr   zcomposite-octaver   zpesq-nbdnsmos5)r   
StoiMetricSiSDRMetricCompositeMetric
PesqMetricDnsMos5MetricrV   r:   r:   r;   get_metricsN   s   



ra   )rY   r   rZ      clean_filesnoisy_filesmetricssave_audio_callback	n_workerslog_percentcsv_path_enhcsv_path_noisynoisy_metricreturnc              
      st  |   }|dkrtd}|j}nt}t| |td|d fdd|D }tt||t	||D ]\}}t
||td\}}t
||td\}}tdtj| dtj|  t|| |d	 }| | | d	 }|
r| | | d	 }nd }|D ]}|j|||tj|d
 q|d urt|tjdd}||| |d	krt|d  q6td |d urtt}|D ]}|  ! D ]\}}i || |||< qqt"|| |	d urtt}|D ]}|j dd! D ]\}}i || |||< qqt"|	| i }|D ]}|# ! D ]	\}}|||< qq|W  d    S 1 s3w   Y  d S )Nr'   spawn	processesc                       g | ]} |   d qS )poollower.0mmetrics_dictrr   r:   r;   
<listcomp>p       z#evaluation_loop.<locals>.<listcomp>methodProcessing , r   cleanenhancedr>   fni  JWaiting for metrics computation completion. This could take a few minutes.Tr>   )$rO   mpget_contextr   	DummyPoolra   maxr<   ziplenr   RESAMPLE_METHODr   debugospathbasenamerU   rJ   analysisrL   r/   rM   	as_tensortofloat32viewtimesleepr-   r   dictflattenditems	write_csvmean)r=   rP   rc   rd   re   rf   rg   rh   ri   rj   rk   sleep_msrO   ctxpool_fnnoisyfncleanfnr>   _r   enhrw   r   valuesout_dictr6   vr:   rx   r;   evaluation_loopZ   sb   
&




&r   	enh_filesc              
      sZ  d}|dkrt d}	|	j}
nt}
t| |
td|d fdd|D }|d u s3t|dkr:d gt|  }t|t| ksDJ t|t| ksNJ d }tt| ||t||D ]N\}}}t	||t
d\}}t	||t
d\}}td	|  td
|  |d urt	||t
d\}}td|  |D ]}|j|||tj|d qq\td |d urtt}|D ]}|  D ]\}}i || |||< qqt|| |d urtt}|D ]}|jdd D ]\}}i || |||< qqt|| i }|D ]}|  D ]	\}}|||< qq|W  d    S 1 s&w   Y  d S )N>  r'   rm   rn   c                    rp   rq   rs   ru   rx   r:   r;   rz      r{   z,evaluation_loop_dir_only.<locals>.<listcomp>r   r|   zProcessing clean zProcessing enh zProcessing noisy r   r   Tr   )r   r   r   r   ra   r   r   r<   r   r   r   r   r   r/   r   r   r   r-   r   r   r   r   r   r   )rc   r   rd   re   rg   rh   ri   rj   rO   r   r   r>   r   enhfnr   r   r   r   rw   r   r   r   r6   r   r:   rx   r;   evaluation_loop_dir_only   s`   





&r   v5   
   
eval_noisyassert_output_lengthc              	      s"  |   }tt|dtt|dd ttd|d fdd|D }t|t||D ]V}t||t	d\}}t
dtj|  t|| |d	 }| | | d	 }|D ]}|j||rb|nd tj|d
 qY|d urt|tjdd}||| q,t
d |d urtt}|D ]}|  D ]\}}i || |||< qqt|| |r|	d urtt}|D ]}|jdd D ]\}}i || |||< qqt|	| i }|D ]}|
d urt|j|
ksJ |   D ]\}}|||< qq|W  d    S 1 s
w   Y  d S )NrV   )r   v1r'   rn   c                    rp   rq   rs   ru   rx   r:   r;   rz      r{   z'evaluation_loop_dns.<locals>.<listcomp>r|   r~   r   )r   r>   r   r   r   Tr   )!rO   r   r`   DnsMosP835LocalMetricr   r   r<   r   r   r   r   r   r   r   r   rU   rJ   r   rL   r/   rM   r   r   r   r   r-   r   r   r   r   r   
enh_valuesr   )r=   rP   rd   re   rf   rg   rh   r   ri   rj   r   rO   r   r>   r   r   rw   r   r   r   r6   r   r:   rx   r;   evaluation_loop_dns   sV   






&r   r   flat_metricsc                    s   t t|   }t| ddd2}tj|dtjd}|	dg|  |
 D ]\} |	|g fdd|D   q)W d	   d	S 1 sHw   Y  d	S )
a  Write metrics to a csv file of format file_name,metric_a,metric_b,...

    Args:
        path (str): Path to csv file to write. Will be overwritten if existing.
        flat_metrics (dict): Dictionary with structure `{filename: {metric_name, metric_value}}`.
    w )modenewline,)	delimiterquotingfilenamec                       g | ]}t  | qS r:   )strrv   nrw   r:   r;   rz         zwrite_csv.<locals>.<listcomp>N)listiterr   __next__keysopencsvwriterQUOTE_MINIMALwriterowr   )r   r   metric_namescsvfile	csvwriterr   r:   r   r;   r     s    "r   c                	   @   s   e Zd Z			ddeeee f dee dee fddZe	dee
ejf fd	d
Zddee
ejf dee fddZddee
ejf dee fddZdefddZddee fddZdeee
f fddZddedeeeee
f f fddZdS ) MetricNrK   name	source_sr	target_src                 C   s   || _ || _d | _|d ur&|d ur&||kr&tt}t||fi ||| _t|tr/|g indd |D | _	t|trC|g i| _
d S dd |D | _
d S )Nc                 S      i | ]}|g qS r:   r:   r   r:   r:   r;   
<dictcomp>$      z#Metric.__init__.<locals>.<dictcomp>c                 S   r   r:   r:   r   r:   r:   r;   r   '  r   )r   rO   	resamplerr   r   r   r   
isinstancer   r   noisy_values)selfr   r   r   rB   paramsr:   r:   r;   __init__  s   zMetric.__init__rl   c                 C      d S Nr:   r   r   degradedr:   r:   r;   compute_metric*     zMetric.compute_metric
values_enhr   c                 C   H   t |trt|g}t| j |D ]\}}| j| ||f qd S r   )r   floatnpasarrayr   r   r   append)r   r   r   r6   r   r:   r:   r;   _add_values_enh.  
   
zMetric._add_values_enhvalues_noisyc                 C   r   r   )r   r   r   r   r   r   r   r   )r   r   r   r6   r   r:   r:   r;   _add_values_noisy4  r   zMetric._add_values_noisyc                 C   s$   | j d ur| j t| }|S r   )r   forwardrM   r   clone)r   xr:   r:   r;   maybe_resample:  s   
zMetric.maybe_resamplec                 C   s   |j |j ksJ |j  d|j  d| | |d}| |d}| j||d}| || |d ur`|j |j ksIJ |j  d|j  d| | |d}| j||d}| || d S d S )Nr   r   )r   r   )shaper   rI   r   r   r   )r   r   r   r>   r   r   r   r:   r:   r;   r/   ?  s   ((z
Metric.addc                 C   s|   i }| j  D ]4}|| jv r)t| j| dkr)tdd | j| D |d| < tdd | j | D |d| < q|S )Nr   c                 S      g | ]}|d  qS r'   r:   rv   r   r:   r:   r;   rz   O      zMetric.mean.<locals>.<listcomp>z	Noisy    c                 S   r   r   r:   r   r:   r:   r;   rz   P  r   z	Enhanced )r   r   r   r   r   r   )r   outr   r:   r:   r;   r   K  s   $&zMetric.meanFr>   c                 C   s   t t}t t}t| j }|D ]4}|| jv r3t| j| dkr3| j| D ]\}}|||p/d |< q&| j| D ]\}}|||pAd |< q8q|rJ|S |S )'{filename: {metric_name: metric_value}}r   r   )r   r   r   r   r   r   r   )r   r>   enh_flat
noisy_flatnamesr   r   r   r:   r:   r;   r   S  s   zMetric.flattend)NNrK   r   NNF)__name__
__module____qualname__r   r   r   r   r,   r   r   r   r   ndarrayr   r   r   r   r   r/   r
   r   boolr   r:   r:   r:   r;   r     s&    
""(r   c                	       s   e Zd Z		ddedee dee f fddZddee fdd	Zd
d Z	dde
deeeeef f f fddZdeeef f fddZdd Zdd Z  ZS )MPMetricNrr   r   r   c                    s*   t  j|||d || _t | _d| _d S )N)r   r   F)superr   rr   r   worker_results	is_joined)r   r   rr   r   r   	__class__r:   r;   r   e  s   
zMPMetric.__init__r   c                    s8  |j |j ksJ |j  d|j  d  |d ur,|j |j ks,J |j  d|j  d  t|d}t|d}|  sOJ d  jjj	||f fdd fddd}j
| |d urt|d}jjj	||f fdd fd	dd}j
| d S d S )
Nr   r   zError processing file c                        |  S r   r   r   r   r   r:   r;   <lambda>{      zMPMetric.add.<locals>.<lambda>c                       t dj d  d|  S )NError computing z metric for enhanced sample : r   errorr   er  r:   r;   r  |      callbackerror_callbackc                    r	  r   r   r  r  r:   r;   r    r  c                    r  )Nr  z metric for noisy sample r  r  r  r  r:   r;   r    r  )r   r   rM   r   rI   isfiniteallrr   apply_asyncr   r  r   )r   r   r   r>   r   hr:   r  r;   r/   q  s.   ((zMPMetric.addc                 C   sV   | j rd S t| jdkr| j }|  t| jdks| j  | j  d| _ d S )Nr   T)r  r   r  popleftgetrr   closejoin)r   r  r:   r:   r;   	join_pool  s   



zMPMetric.join_poolFr>   rl   c                    s   |    t j|dS )r   r   )r#  r  r   )r   r>   r  r:   r;   r     s   zMPMetric.flattendc                    s   |    t  S r   )r#  r  r   )r   r  r:   r;   r     s   
zMPMetric.meanc                 C   s   | j  }|d= |d= |S )Nrr   r  )__dict__copy)r   	self_dictr:   r:   r;   __getstate__  s   
zMPMetric.__getstate__c                 C   s   | j | d S r   )r$  update)r   stater:   r:   r;   __setstate__  s   zMPMetric.__setstate__r   r   )r   r   r   r   r   r,   r   r   r/   r#  r  r
   r   r   r   r'  r*  __classcell__r:   r:   r  r;   r  d  s     (
r  c                       s0   e Zd Zdef fddZdefddZ  ZS )r]   rr   c                    s   t  jd|d d S )NSISDR)r   rr   r  r   )r   rr   r  r:   r;   r        zSiSDRMetric.__init__rl   c                 C   s   t t|t|dS )N)	referenceestimate)si_sdr_speechmetricsas_numpyr   r:   r:   r;   r     r.  zSiSDRMetric.compute_metric)r   r   r   r   r   r   r   r+  r:   r:   r  r;   r]     s    r]   c                       s4   e Zd Zdedef fddZdefddZ  ZS )r\   rO   rr   c                    s   t  jd||dd d S )NSTOI'  r   rr   r   r   r-  r   rO   rr   r  r:   r;   r     s   zStoiMetric.__init__rl   c                 C   s&   | j d usJ tt|t|| j dS )Nr   r   rO   )rO   rY   r2  r   r:   r:   r;   r     s   zStoiMetric.compute_metric)	r   r   r   r,   r   r   r   r   r+  r:   r:   r  r;   r\     s    r\   c                       D   e Zd Zd
dededef fddZdeee	j
f fdd	Z  ZS )r_   FrO   rr   rX   c                    s:   |r
d}d| _ d}nd}d| _ d}t j||||d d S )NzPESQ-NBrX   i@  PESQwbr   r5  )r   r  r   )r   rO   rr   rX   r   r   r  r:   r;   r     s   zPesqMetric.__init__rl   c                 C   s(   | j d usJ t| j t|t|| jS r   )rO   r   r2  r   r   r:   r:   r;   r     s   zPesqMetric.compute_metricr   r   r   r   r,   r   r  r   r   r   r   r  r   r+  r:   r:   r  r;   r_     s     r_   c                       r8  )r^   FrO   rr   rW   c                    s&   g d}t  j|||dd || _d S )N)r9  CSIGCBAKCOVLSSNRr   rr   r   r   )r  r   rW   )r   rO   rr   rW   r   r  r:   r;   r     s   
zCompositeMetric.__init__rl   c                 C   s2   | j d usJ t|d|d| j | jd}|S )Nr   )r   r   rO   rW   )rO   r   rI   rW   )r   r   r   cr:   r:   r;   r     s   zCompositeMetric.compute_metricr   r;  r:   r:   r  r;   r^     s     r^   c                   @   s<   e Zd Zddee fddZedeee	j
f fddZdS )	NoisyMetricNr   c                    s    t|d}jjj|f fddtjd}j	
| |d urL t|d}jjj|f fddtjd}j	
| d S d S )Nr   c                    r	  r   r
  r  r  r:   r;   r    r  z!NoisyMetric.add.<locals>.<lambda>r  c                    r	  r   r  r  r  r:   r;   r    r  )r   rM   r   rI   rr   r  r   r   r  r  r   )r   r   r>   r   r  r:   r  r;   r/     s$   zNoisyMetric.addrl   c                 C   r   r   r:   r   r   r:   r:   r;   r     r   zNoisyMetric.compute_metricr   )r   r   r   r   r   r/   r   r   r   r   r  r   r:   r:   r:   r;   rB    s    rB  c                       >   e Zd Zdedef fddZdeeej	f fddZ
  ZS )r`   rO   rr   c                    s8   t j}t j|||dd t  \}}t ||| _d S )Nr   r@  )r[   NAMESr  r   r   ComputeScorecompute_score)r   rO   rr   r   primary_model_pathp808_model_pathr  r:   r;   r     s   zDnsMos5Metric.__init__rl   c                    s   | j d usJ tdd*}t|j|| j tjd tj|jd| jd t	
 fdd| jD W  d    S 1 s9w   Y  d S )N.wavsuffixdtypeF)logrG  c                    s   g | ]} | qS r:   r:   r   scoresr:   r;   rz     r   z0DnsMos5Metric.compute_metric.<locals>.<listcomp>)rO   r   r   r   rM   r   r[   eval_sample_dnsmosrG  r   r   )r   r   nfr:   rP  r;   r     s   
$zDnsMos5Metric.compute_metricr   r   r   r,   r   r   r   r   r   r  r   r+  r:   r:   r  r;   r`          r`   c                       rD  )DnsMosP808ApiMetricrO   rr   c                    s*   t  jd||dd d| _tjd | _d S )NMOSr   r5  z&https://dnsmos.azurewebsites.net/scoreDNS_AUTH_KEYr  r   urlr   environkeyr6  r  r:   r;   r     s   zDnsMosP808ApiMetric.__init__rl   c                 C   s*   | j d usJ t| j| j|}t|d S )Nmos)rO   r   rZ  r\  r   )r   r   
score_dictr:   r:   r;   r     s   z"DnsMosP808ApiMetric.compute_metricrT  r:   r:   r  r;   rV    s     rV  c                       rD  )DnsMosP835ApiMetricrO   rr   c                    s.   t  jg d||dd d| _tjd | _d S )NSIGMOSBAKMOSOVLMOSr   r5  z4https://dnsmos.azurewebsites.net/v1/dnsmosp835/scorerX  rY  r6  r  r:   r;   r     s
   zDnsMosP835ApiMetric.__init__rl   c                    s6   | j d usJ t| j| j| t fdddD S )Nc                    r   r:   )r   )rv   rA  r^  r:   r;   rz     r   z6DnsMosP835ApiMetric.compute_metric.<locals>.<listcomp>)mos_sigmos_bakmos_ovr)rO   r   rZ  r\  r   r   rC  r:   rd  r;   r     s   z"DnsMosP835ApiMetric.compute_metricrT  r:   r:   r  r;   r_    s     r_  c                       rD  )r   rO   rr   c                    s*   t  jg d||dd t \| _| _d S )Nr`  r   r5  )r  r   r   sigbak_ovrr6  r  r:   r;   r   "  s   zDnsMosP835LocalMetric.__init__rl   c                 C   s$   | j d usJ tt|| j| jS r   )rO   r   r   r   rh  ri  rC  r:   r:   r;   r   (  s   z$DnsMosP835LocalMetric.compute_metricrT  r:   r:   r  r;   r   !  rU  r   c                 C   sh   t | jdks	J |dkr)tt| |dtd } tt||dtd }d}tj| |||d}|S )Nr'   r4  r|   )r   yfs_sigextended)	r   r   r   rM   r   r   rL   pystoirY   )r   r   rO   rl  rY   r:   r:   r;   rY   -  s   rY   r   r   c                 C   s^   |dkr t t| |dtd } t t||dtd }d}t|t|  t| dS )Nr   r|   r:  )r   rM   r   r   rL   r   r2  rI   r7  r:   r:   r;   pesq_7  s
   rn  c              	   C   s"  t | jdksJ d| j |dkr/tt| |dtd } tt||dtd }d}|r~tdus7J tdd9}tdd$}t	|j
| |tjd t	|j
||tjd t|j
|j
}W d   n1 siw   Y  W d   n1 sxw   Y  n
tt| t||}t|tjS )	z$Compute pesq, csig, cbak, covl, ssnrr'   z,Input must be 1D array, but got input shape r   r|   NrJ  rK  rM  )r   r   r   rM   r   r   rL   	semetricsr   r   r   r   r   composite_pyr2  r   r   astype)r   r   rO   rW   cfrS  rA  r:   r:   r;   r   A  s"    r   r/  r0  c           
      C   s   |  dd} | dd}t| jj}t| j| }|t| j| ||  }||  }|| }|d  }|d  }dt|| ||   }	|	S )zzThis implementation is adopted from https://github.com/aliutkus/speechmetrics/blob/dde303e/speechmetrics/relative/sisdr.pyr   r'      r   )	reshaper   finforN  epsdotTsumlog10)
r/  r0  rv  Rssae_truee_resSssSnnrZ   r:   r:   r;   r1  W  s   r1  c                 C   s    t | tjr|    S | S r   )r   rM   r   rK   detachrL   r  r:   r:   r;   r2  n  s   r2  )Nr#   r$   r   r   )ar   r   r   abcr   r   collectionsr   r   	functoolsr   multiprocessing.dummyr   r   tempfiler   typingr	   r
   r   r   r   r   rL   r   rm  rM   torch.multiprocessingmultiprocessingr   logurur   r   r   torch.multiprocessing.pooltorchaudio.functionalr   torchaudio.transformsr   
df.enhancer   df.ior   r   r   r   df.modelr   
df.scriptsr   r[   df.scripts.dnsmosr   r   r   df.sepmr   rp  df.utilsr   r    libdfr!   
HAS_OCTAVEr   ro  OSErrorImportErrorModuleNotFoundErrorr,   r<   no_gradrU   ra   r   r  r   r   r   r   r   r   r  r]   r\   r_   r^   rB  r`   rV  r_  r   rY   r  rn  r1  r2  r:   r:   r:   r;   <module>   s>    	


B
	
<	


"6OF	



