o
    oip6                     @   s  d dl Z d dlZd dlZd dlZd dlmZ d dlmZm	Z	m
Z
 d dlZd dl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mZmZ d dlmZmZ d dlmZ d d	lm Z m!Z! d
Z"dZ#dZ$g dZ%e&ej'(ddZ)ej*+ r{dZ,ndZ,G dd dZ-dd Z.				dQde/de	ee0  de1de1de	e- f
ddZ2dd  Z3d!ej4d"e/fd#d$Z5d%d& Z6d'e
ej7ee/ f fd(d)Z8d*e1fd+d,Z9e:d-kre  e ; Z<e<j=d.d/Z>e>j?d0d1gd2Z@e@jAd3e/d4d5 e>?d6ZBeBjAde/d7 eBjAd8d9e0d:d5 e>j?d;d<gd2ZCeCjAd=d>d? eCjAd@dAdBd? eCjAdCdDdEdF eCjAdGe&dHdI e>?dJZDeDjAdKdLd4dM eDjAdNdEdO eDjAd@dAdBd? e<E ZFeFjGdu rUe<H  eIdH eFjGdPv rbe8eFjJ dS eFjGd6krqe2eFjKeFjL dS eFjGd;kr}e3eF dS eFjGdJkre6eF dS eM dS )R    N)sleep)ListOptionalUnion)logger)tqdm)
load_audioresample
save_audio)init_loggerlog_metrics)get_ort_session)download_fileget_cache_dir>  gQ"@zDhttps://github.com/microsoft/DNS-Challenge/raw/e14b010/DNSMOS/DNSMOS)SIGBAKOVRLP808_MOSSLEEP0cudacpuc                
   @   sn   e Zd ZddeddfddZ	dddZ	dddZdd Z		ddee	e
jf dededee	 fddZdS )ComputeScoreFr   returnNc                 C   sj   t ||rdndd| _t ||rdndd| _d}t|d t| _tt	j
jdd|dt| _d S )	Nr   gpu)	providers@     x   r   )n_melssrn_fft)r   	onnx_sessp808_onnx_sesstorchhann_windowtoTORCH_DEVICEw	as_tensorlibrosafiltersmel)selfprimary_model_pathp808_model_pathr   r"    r1   T/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/df/scripts/dnsmos_dns5.py__init__$   s   
zComputeScore.__init__r   r      r   Tc           	      C   sv   t |tt j}t j||d || jdd  }t 	d|| j
   }|r9tj|tjdd d }|S )Nr   T)r"   
hop_lengthwindowreturn_complexz...ft,mf->mtref(   )r%   r*   r'   r(   float32stftr)   abssquareeinsumr-   tr   numpyr+   power_to_dbnpmax)	r.   audior    
frame_sizer5   r!   to_dbpowspecmel_specr1   r1   r2   audio_melspec_torch/   s   z ComputeScore.audio_melspec_torchc                 C   s<   t jj|||d ||d}|rt j|tjdd d }|jS )Nr   )yr!   r"   r5   r    r8   r:   )r+   featuremelspectrogramrB   rC   rD   T)r.   rE   r    rF   r5   r!   rG   rI   r1   r1   r2   audio_melspecC   s   zComputeScore.audio_melspecc                 C   s|   |rt g d}t g d}t g d}nt g d}t g d}t g d}||}||}	||}
||	|
fS )N)g~Z!ugBt?g?gBü)g/g?,?g/z!?gX-*Ͽ)gPzg 7!BV?gojſgDW ?)g;YRg~?gz?)g
w=gc9?g%Pzu?)ggFu?gCyXٿ)rC   poly1d)r.   sigbakovris_personalized_MOSp_ovrp_sigp_baksig_polybak_polyovr_polyr1   r1   r2   get_polyfit_valM   s   
zComputeScore.get_polyfit_valfpath_or_tensorsampling_raterT   fnamec           $      C   s  |}t |tr+|}td|  t|\}}||kr%tj|||d}	n|}	| j}
n	|}	| j	}
|p3d}t
|	}tt| }t
|	|k rPt|	|	}	t
|	|k sDttt
|	| t d }|}g }g }g }g }g }g }g }t|D ]}|	t|| t|t |  }t
||k rqst|dtjd d f }t|
|d d ddtjd d d d f }d|i}d|i}| jd |d	 d	 d	 }| jd |d	 d	 \}}}| ||||\} }!}"|| || || ||  ||! ||" || qs|p
||| |d
}#||#d< t||#d< t||#d< t||#d< t||#d< t||#d< t||#d< t||#d< |#S )NProcessing file: )orig_sr	target_srunknownr   r;   i`)rE   input_1r   )filename
len_in_secr!   num_hopsOVRL_rawSIG_rawBAK_rawr   r   r   r   )
isinstancestrr   debugsfreadr+   r	   rO   rJ   lenintINPUT_LENGTHrC   appendfloorrangearrayastypenewaxisr$   runr#   r[   mean)$r.   r\   r]   rT   r^   fsfpathaudinput_fsrE   	feat_implactual_audio_lenlen_samplesrf   hop_len_samplespredicted_mos_sig_seg_rawpredicted_mos_bak_seg_rawpredicted_mos_ovr_seg_rawpredicted_mos_sig_segpredicted_mos_bak_segpredicted_mos_ovr_segpredicted_p808_mosidx	audio_seginput_featuresp808_input_featuresoip808_oip808_mosmos_sig_rawmos_bak_rawmos_ovr_rawmos_sigmos_bakmos_ovr	clip_dictr1   r1   r2   __call__]   sx   







zComputeScore.__call__)F)r   r   r4   r   T)FN)__name__
__module____qualname__boolr3   rJ   rO   r[   r   rk   r%   Tensorrp   r   r   r1   r1   r1   r2   r   #   s$    


r   c                  C   s   t jt d} t j| st |  t j| d}t j|s(ttd | d}t j| d}t j|s=ttd | d}||fS )NDNS5zsig_bak_ovr.onnxz/sig_bak_ovr.onnx)download_dirzmodel_v8.onnxz/model_v8.onnx)	ospathjoinr   isdirmakedirsexistsr   URL_ONNX)	cache_dirsig_bak_ovrp808r1   r1   r2   download_onnx_models   s   
r   TFfile
target_moslog	use_torchcompute_scorec                    sx  t  \}}t||}|d u rt  \}}t||}t}|r0t| |d d }|||d| d || |d  fddtD  |rItd|   |d urt	|dksUJ t
t|D ]Q\}	}
t |	 |
st|tj  td  }td	d
d t
t|D dd tddd   D dd tddd t
t|D dd t   td qZ|rtddd   D   S )Nr   Fr^   c                    s   i | ]}| | qS r1   r1   ).0nscoresr1   r2   
<dictcomp>       z&eval_sample_dnsmos.<locals>.<dictcomp>r_      dtypez	Target   c                 S      i | ]\}}||qS r1   r1   r   r   vr1   r1   r2   r      r   ERROR)level	Predictedc                 S   r   r1   r1   r   r1   r1   r2   r      r   z	Diff     c                 S   r   r1   r1   r   r1   r1   r2   r      r      c                 S   r   r1   r1   r   r1   r1   r2   r      r   )r   r   SAMPLING_RATEr   squeezerA   NAMESr   inforo   zipiscloserC   asarrayfromitervaluesfloattolistr   itemsprintexit)r   r   r   r   r   r/   r0   
desired_fsrE   r   r@   diffr1   r   r2   eval_sample_dnsmos   s6   



 r   c                    s4  t  \}}t|| g }g }ttj| jd}dtt|dkr/t	d| j  t
d tjj| jdE fdd|D }ttj|D ](}|| }z| }W n tyn }	 z
t	d	||	f  |	d }	~	ww || qLW d    n1 sw   Y  t|}
| jr| j}|
| t|
 d S )
Nz*.wavFr   zNo samples found in dir r   )max_workersc                    s   i | ]}  ||qS r1   )submit)r   clipr   r   executoris_personalized_evalr1   r2   r      s    z#eval_dir_dnsmos.<locals>.<dictcomp>z%r generated an exception: %s)r   r   globr   r   r   testset_dirr   ro   r   r   
concurrentfuturesThreadPoolExecutornum_workersr   as_completedresult	Exceptionrr   pd	DataFramecsv_fileto_csv	print_csv)argsr/   r0   rowsclipsfuture_to_urlfuturer   dataexcdfr   r1   r   r2   eval_dir_dnsmos   s>   



r   buffercodecc                 C   s8   dd l }dd l}|j|| d  | d\}}|S )Nr   .)format)io
torchaudioloadBytesIOtobyteslower)r   r   r   tawav_r1   r1   r2   load_encoded   s   $r   c              
      s  ddl m  dd l}dd lt \}}t||g }dtdjdtdt	f fdd}j
D ]~}tj|s>J d	}|j|d
ddb}td|  ||v sVJ t|jd }	|jdd}
||  D ]8\}}t| |
dkr|d }| dkr|d nt||
}tdkrttd  ||||	|d qjW d    n1 sw   Y  q4t|}jrÈj}|| t| d S )Nr   )NamedTemporaryFileFrE   r!   r^   c                    s   j r(| d} | jjkr| jd } |kr t| |} | |dS  dd}t|j| |jd |j|dW  d    S 1 sKw   Y  d S )Nr   g    @r   z.wav)suffixr   )	r   r   r   int16r'   r;   r	   r
   name)rE   r!   r^   nfr   r   r   r   r   r%   r1   r2   compute_score_audio  s   
$z$eval_ds.<locals>.compute_score_audiospeechrlatest)libverzEvaluating ds r   pcm.r   i  r   )tempfiler   h5pyr%   r   r   r   r   rp   rk   dsr   r   isfileFiler   attrsgetr   
from_numpydim
unsqueeze_r   SLEEP_MSr   rr   r   r   r   r   r   )r   r  r/   r0   r   r  r   groupfr!   r   r   samplerE   r   r   r1   r   r2   eval_ds  sH   

&




r  r   c                 C   sh   t | trdd | D } t| } t|   tt| d t| d t| d t| d  d S )Nc                 S   s   g | ]}t |qS r1   )r   read_csv)r   r  r1   r1   r2   
<listcomp>=  r   zprint_csv.<locals>.<listcomp>r   r   r   r   )rj   listr   concatr   describerC   ry   )r   r1   r1   r2   r   ;  s   

r   r   c                 C   s$   d}d}t | | ||t |  kS )Ng-C6?)r=   )ab__a_tol__r_tolr1   r1   r2   r   H  s   r   __main__subparser_name)destry   m)aliasesr   +)typenargszeval-sample)r%  z--target_mosz-t*zeval-direr   z>Path to the dir containing audio clips in .wav to be evaluated)helpz-oz
--csv-filez:If you want the scores in a CSV file provide the full pathz--cpuzOnly run on CPU
store_true)r)  actionz--num-workersr   )r%  defaultzeval-dsr	  zPath to the hdf5 dataset file)r)  r&  z--use-torch)r+  )r"  ry   )NTFN)Nargparseconcurrent.futuresr   r   r   timer   typingr   r   r   r+   rA   rC   pandasr   	soundfilerm   r%   logurur   r   df.ior   r	   r
   	df.loggerr   r   df.scripts.dnsmosr   df.utilsr   r   r   rq   r   r   rp   environr  r  r   is_availabler(   r   r   rk   r   r   r   r   ndarrayr   r  r   r   r   r   ArgumentParserparseradd_subparsers
subparsers
add_parser	mn_parseradd_argumenteval_sample_parsereval_dir_parsereval_ds_parser
parse_argsr   r   
print_helpr   r   r   r   NotImplementedErrorr1   r1   r1   r2   <module>   s   
 

$%
4


