o
    wi                     @   s   d dl mZmZmZ d dlZd dlZd dlmZmZ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	Zzd dlZW n eyM   d
ZY nw dee dee fddZeG dd deZdS )    )ListOptionalTypeN)CallbackLightningModuleTrainer)TensorBoardLogger)Logger)WandbLogger)logging)experimentalTFloggerslogger_typec                 C   sF   | D ]}t ||rt|dr|j  S |  S qtd| d|  d)N
experimentzCould not find z logger in .)
isinstancehasattrr   
ValueError)r   r   logger r   i/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/nemo/collections/audio/parts/utils/callbacks.py_get_logger"   s   


r   c                   @   s|   e Zd ZdZ					ddedeee  deded	ed
ee fddZ	dde
jde
jdedefddZdedefddZdS ) SpeechEnhancementLoggingCallbacka  
    Callback which can log artifacts (eg. model predictions, graphs) to local disk, Tensorboard, and/or WandB.

    Args:
        data_loader: Data to log artifacts for.
        output_dir: Optional local directory. If provided, artifacts will be saved in output_dir.
        loggers: Optional list of loggers to use if logging to tensorboard or wandb.
        log_tensorboard: Whether to log artifacts to tensorboard.
        log_wandb: Whether to log artifacts to WandB.
    NF>  data_loader_idxr   log_tensorboard	log_wandbsample_ratemax_uttsc                 C   s   || _ || _|r
|ng | _|| _|| _|| _|| _|r(td t	| jt
| _ntd d | _|rEts8tdtd t	| jt| _ntd d | _td| jj td| j td| j d S )	NzCreating tensorboard loggerzNot using tensorbord loggerzWandb not installed.zCreating wandb loggerzNot using wandb loggerzInitialized %s withz	log_tensorboard: %sz	log_wandb:       %s)data_loaderr   r   r   r   r   r   r   infor   r   tensorboard_loggerdebug
HAVE_WANDBr   r
   wandb_logger	__class____name__)selfr   r   r   r   r   r   r   r   r   r   __init__9   s,   




z)SpeechEnhancementLoggingCallback.__init__inputaudioslengthssteplabelc           	      C   s   | d}t|D ]@}|| }| jr(| jj| d| ||d |f || jd | jrItj|| | j| d| df}| j| d| |i q	d S )Nr   _)tag
snd_tensorglobal_stepr   )r   caption)	sizeranger!   	add_audior   r$   wandbAudiolog)	r'   r*   r+   r,   r-   num_utts	audio_idxlengthwandb_audior   r   r   
_log_audio_   s    
z+SpeechEnhancementLoggingCallback._log_audiotrainermodelc                 C   s  d|j  }g }g }d}td| j d | jD ]}t|tr0|d }|d }	|d| }
n|\}}	}
}| j	du rC|
d}d	}n|| j	k }t| j	| |
d}||7 }|r|d|d
f }|
d|d
f }
|	d| }	|jdkrzt|d}|
jdkrt|
d}
||j}|	|j}	|||	d\}}|||
j |||
j qt|dkrtd| dS tj|dd}tj|dd}|
ddkrtd|j  tt|d}| j|||jd| j dd dS )z%Log artifacts at the end of an epoch.   r   z0Logging processed speech for validation dataset z...input_signalinput_lengthtarget_signalNT.   zB T -> B 1 T)rA   rB   z0List are empty, no artifacts to log at epoch %d.)dimzDCurrently only supports single-channel audio! Current output shape: zB 1 T -> B Tdataloader_
_processed)r*   r+   r,   r-   )current_epochr   r    r   r   r   dictgetcloner   r3   minndimeinops	rearrangetodeviceappendlenr"   torchconcaterrorshapeNotImplementedErrorr=   r1   )r'   r>   r?   epochoutput_signal_listoutput_length_listnum_examples_uploadedbatchrA   rB   rC   r.   num_examples	do_uploadoutput_signaloutput_lengthoutput_signalsoutput_lengthsr   r   r   on_validation_epoch_endr   s`   









z8SpeechEnhancementLoggingCallback.on_validation_epoch_end)NFFr   N)r)   )r&   
__module____qualname____doc__intr   r   r	   boolr(   rT   Tensorstrr=   r   r   rd   r   r   r   r   r   ,   s,    

 &r   )typingr   r   r   rN   rT   lightning.pytorchr   r   r   lightning.pytorch.loggersr    lightning.pytorch.loggers.loggerr	   lightning.pytorch.loggers.wandbr
   
nemo.utilsr   nemo.utils.decoratorsr   r#   r6   ModuleNotFoundErrorr   r   r   r   r   r   <module>   s$   
