o
    }oi                     @   sx   d dl mZ d dlZd dlmZ d dlmZ zd dlZdZW n e	y)   dZY nw G dd deZ
G d	d
 d
eZdS )    )AnyN)Metric)loggingTFc                       s   e Zd ZU dZdZeed< ejed< ejed< dZ	e
ed< ded	ef fd
dZdejdejddfddZdejfddZ fddZ  ZS )SquimMOSMetriczuA metric calculating the average Torchaudio Squim MOS.

    Args:
        fs: sampling rate of the input signals
    >  sample_ratemos_sumnum_examplesThigher_is_betterfskwargsc                    s   t  jdi | tst| jj d|| jkr/tjj	|| jddddd| _
td|| j || _tjj | _| jdtd	d
d | jdtdd
d td| jj| j d S )Nz metric needs `torchaudio`.@   bR?sinc_interp_kaiserQaTi-@	orig_freqnew_freqlowpass_filter_widthrolloffresampling_methodbeta3Input signals will be resampled from fs=%d to %d Hzr           sumdefaultdist_reduce_fxr	   r   z Setup metric %s with input fs=%s )super__init__HAVE_TORCHAUDIOModuleNotFoundError	__class____name__r   
torchaudio
transformsResample_squim_mos_metric_resamplerr   warningr   	pipelinesSQUIM_SUBJECTIVE	get_model_squim_mos_metric_model	add_statetorchtensordebug)selfr   r   r#   r   X/home/ubuntu/.local/lib/python3.10/site-packages/nemo/collections/audio/metrics/squim.pyr    )   s$   
zSquimMOSMetric.__init__predstargetreturnNc                 C   s   | j | jkr| |}| |}|jdkr |d}|d}n|jdkr.td|j d| ||}|  j| 7  _|  j	|
 7  _	dS )zUpdate the metric by calculating the MOS score for the current batch.

        Args:
            preds: tensor with predictions, shape (B, T)
            target: tensor with target signals, shape (B, T). Target can be a non-matching reference.
           r      Expected 1D or 2D signals, got 	D signalsN)r   r   r(   ndim	unsqueeze
ValueErrorr-   r   r   r	   numel)r2   r5   r6   	mos_batchr   r   r4   updateC   s   




zSquimMOSMetric.updatec                 C      | j | j S zCompute the underlying metric.)r   r	   r2   r   r   r4   computeZ      zSquimMOSMetric.computec                    8   t  j|i |}dd | D }|D ]}||= q|S ):Do not save the MOS model and resampler in the state dict.c                 S       g | ]}d |v sd|v r|qS )r(   r-   r   .0keyr   r   r4   
<listcomp>b   
    z-SquimMOSMetric.state_dict.<locals>.<listcomp>r   
state_dictkeysr2   argsr   rP   remove_keysrL   r3   r   r4   rP   ^      zSquimMOSMetric.state_dict)r$   
__module____qualname____doc__r   int__annotations__r/   Tensorr
   boolr   r    rA   rE   rP   __classcell__r   r   r3   r4   r      s   
 

r   c                       s   e Zd ZU dZdZeed< ejed< ejed< dZ	e
ed< ded	ed
ef fddZddejdeddfddZdejfddZ fddZ  ZS )SquimObjectiveMetriczA metric calculating the average Torchaudio Squim objective metric.

    Args:
        fs: sampling rate of the input signals
        metric: the objective metric to calculate. One of 'stoi', 'pesq', 'si_sdr'
    r   r   
metric_sumr	   Tr
   r   metricr   c                    s   t  jdi | tst| jj d|| jkr/tjj	|| jddddd| _
td|| j || _|dvr>td	| d
|| _tjj | _| jdtddd | jdtddd td| jj| j| j d S )Nz needs `torchaudio`.r   r   r   r   r   r   )stoipesqsi_sdrzUnsupported metric z1. Supported metrics are "stoi", "pesq", "si_sdr".r_   r   r   r   r	   r   z$Setup %s with metric=%s, input fs=%sr   )r   r    r!   r"   r#   r$   r   r%   r&   r'   !_squim_objective_metric_resamplerr   r)   r   r>   r`   r*   SQUIM_OBJECTIVEr,   _squim_objective_metric_modelr.   r/   r0   r1   )r2   r   r`   r   r3   r   r4   r    y   s*   
zSquimObjectiveMetric.__init__Nr5   r6   r7   c                 C   s   | j | jkr| |}|jdkr|d}n|jdkr$td|j d| |\}}}| jdkr4|}n| jdkr<|}n| jdkrD|}ntd	| j |  j|	 7  _|  j
| 7  _
d
S )zUpdate the metric by calculating the selected metric score for the current batch.

        Args:
            preds: tensor with predictions, shape (B, T)
            target: None, not used. Keeping for interfacfe compatibility with other metrics.
        r8   r   r9   r:   r;   ra   rb   rc   zUnknown metric N)r   r   rd   r<   r=   r>   rf   r`   r_   r   r	   r?   )r2   r5   r6   
stoi_batch
pesq_batchsi_sdr_batchmetric_batchr   r   r4   rA      s    





zSquimObjectiveMetric.updatec                 C   rB   rC   )r_   r	   rD   r   r   r4   rE      rF   zSquimObjectiveMetric.computec                    rG   )rH   c                 S   rI   )rd   rf   r   rJ   r   r   r4   rM      rN   z3SquimObjectiveMetric.state_dict.<locals>.<listcomp>rO   rR   r3   r   r4   rP      rU   zSquimObjectiveMetric.state_dict)N)r$   rV   rW   rX   r   rY   rZ   r/   r[   r
   r\   strr   r    rA   rE   rP   r]   r   r   r3   r4   r^   l   s   
 

r^   )typingr   r/   torchmetricsr   
nemo.utilsr   r%   r!   r"   r   r^   r   r   r   r4   <module>   s   O