o
    }oi'                     @   s   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 zd dl	Z	dZ
W n ey/   dZ
Y nw G dd dZG d	d
 d
ZdS )    N)SignalNoiseRatio)AudioMetricWrapper)SquimMOSMetricSquimObjectiveMetricTFc                   @   s>   e Zd Zdd Zdd Zejjejdddgdd	 Z	d
S )TestAudioMetricWrapperc                 C   s   t  }tt  d}d}d}d}d}d}|||f}t|D ]R}	t|D ]/}
tj| }|tdtj|   }|||d}|||d}t||sQJ d	|
 d
|	 q"t| | sfJ d|
 d
|	 |  |  qdS )z<Test metric on batches where all examples have equal length.metric   
               predstarget&Metric forward not matching for batch , reset &Metric compute not matching for batch N)r   r   rangetorchrandallclosecomputereset)self
ref_metricwrapped_metric
num_resetsnum_batches
batch_sizenum_channelsnum_samplesbatch_shapenrnbr   r   batch_value_wrappedbatch_value_ref r(   ^/home/ubuntu/.local/lib/python3.10/site-packages/tests/collections/audio/test_audio_metrics.pytest_metric_full_batch   s6   


z-TestAudioMetricWrapper.test_metric_full_batchc                 C   s8  t  }tt  d}d}d}d}d}d}|||f}t|D ]}}	t|D ]Z}
tj| }|tdtj|   }tj|d ||fd}||||d	}d
}t|D ]\}}||||dd|f ||dd|f d7 }qM|| }t||s|J d|
 d|	 q"t| | sJ d|
 d|	 |	  |	  qdS )z<Test metric on batches where examples have different length.r   r	   r
   r   r   r   r   lowhighsizer   r   input_lengthr   .Nr   r   r   r   
r   r   r   r   r   randint	enumerater   r   r   )r   r   r   r   r   r    r!   r"   r#   r$   r%   r   r   r0   r&   r'   b_idxb_lenr(   r(   r)   test_input_length@   s>   

.
z(TestAudioMetricWrapper.test_input_lengthchannelr   r   c                 C   s:  t  }tt  |d}d}d}d}d}d}|||f}	t|D ]}}
t|D ]Z}tj|	 }|tdtj|	   }tj|d ||fd}||||d	}d
}t|D ]\}}|||||d|f |||d|f d7 }qN|| }t||s}J d| d|
 q#t| | sJ d| d|
 |	  |	  qdS )z-Test metric on a single channel from a batch.)r   r7   r	   r
   r   r   r   r   r+   r/   r   Nr   r   r   r   r1   )r   r7   r   r   r   r   r    r!   r"   r#   r$   r%   r   r   r0   r&   r'   r4   r5   r(   r(   r)   test_channeli   sB   

 

z#TestAudioMetricWrapper.test_channelN)
__name__
__module____qualname__r*   r6   pytestmarkunitparametrizer8   r(   r(   r(   r)   r      s    ")r   c                   @   sr   e Zd ZejjejdddgdefddZejjejdg dejdddgde	defdd	Z
d
S )TestSquimMetricsfs>  i]  c                    s  t rrd}d}d}t d}tjj dddddd	tjj d
tj	dtj	dtj	f fdd}t
d}t|D ]!}t| }	t| }
|j|	|
d ||	|
d}|| 7 }q:|||  }tj| ||dspJ ddS tt t d W d   dS 1 sw   Y  dS )zTest Squim MOS metric   ư>)rA   rB   @   bR?sinc_interp_kaiserQaTi-@	orig_freqnew_freqlowpass_filter_widthrolloffresampling_methodbetar   r   returnc                    s&    dkr| } |}| |}|S )NrB   r(   )r   r   	mos_batchrA   	resamplersquim_mos_modelr(   r)   calculate_squim_mos   s
   
z<TestSquimMetrics.test_squim_mos.<locals>.calculate_squim_mos        r   atolComparison failedN)HAVE_TORCHAUDIOr   
torchaudio
transformsResample	pipelinesSQUIM_SUBJECTIVE	get_modelr   Tensortensorr   randnupdatesumr   r   r<   raisesModuleNotFoundError)r   rA   r   r    rX   squim_mos_metricrU   mos_sumnr   r   
mos_goldenmos_golden_finalr(   rR   r)   test_squim_mos   s6   
$

 "zTestSquimMetrics.test_squim_mosr   )stoipesqsi_sdrc                    s  t rjd}d}d}t d}tjj dddddd	tjj d
tj	dtj	f fdd}t
d}t|D ]}	t| }
|j|
dd ||
d}|| 7 }q9|||  }tj| ||dshJ ddS tt t d W d   dS 1 sw   Y  dS )zTest Squim objective metricrC   rD   )rA   r   rB   rE   rF   rG   rH   rI   r   rP   c                    sP    dkr| } | \}}}dkr|S dkr|S dkr!|S t d )NrB   rn   ro   rp   zUnknown metric )
ValueError)r   
stoi_batch
pesq_batchsi_sdr_batchrA   r   rS   squim_objective_modelr(   r)   calculate_squim_objective   s   zHTestSquimMetrics.test_squim_objective.<locals>.calculate_squim_objectiverV   Nr   )r   rW   rY   )rZ   r   r[   r\   r]   r^   SQUIM_OBJECTIVEr`   r   ra   rb   r   rc   rd   re   r   r   r<   rf   rg   )r   r   rA   r   r    rX   squim_objective_metricrw   
metric_sumrj   r   metric_goldenmetric_golden_finalr(   ru   r)   test_squim_objective   s<    


"z%TestSquimMetrics.test_squim_objectiveN)r9   r:   r;   r<   r=   r>   r?   intrm   strr}   r(   r(   r(   r)   r@      s    6r@   )r<   r   torchmetrics.audio.snrr   $nemo.collections.audio.metrics.audior   $nemo.collections.audio.metrics.squimr   r   r[   rZ   rg   r   r@   r(   r(   r(   r)   <module>   s   |