o
    
j`                     @   s   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 d dlmZ G dd dejZG d	d
 d
ejZdS )    N)Coqpit)nn)AngleProtoLossGE2ELossSoftmaxAngleProtoLoss)set_init_dict)load_fsspecc                       s&   e Zd Zd fdd	Zdd Z  ZS )PreEmphasis
ףp=
?c                    s:   t    || _| dt| j dgdd d S )Nfilterg      ?r   )super__init__coefficientregister_buffertorchFloatTensor	unsqueeze)selfr   	__class__ R/home/kuhnn/.local/lib/python3.10/site-packages/TTS/encoder/models/base_encoder.pyr      s   
*zPreEmphasis.__init__c                 C   sD   t | dks
J tjj|ddd}tjj|| j	dS )N      )r   r   reflect)
lensizer   r   
functionalpadr   conv1dr   squeeze)r   xr   r   r   forward   s   zPreEmphasis.forward)r
   )__name__
__module____qualname__r   r"   __classcell__r   r   r   r   r	      s    r	   c                	       s   e Zd ZdZ fddZdd Ze dddZe dddZ	dde
fddZ				dde
dededefddZ  ZS )BaseEncoderz|Base `encoder` class. Every new `encoder` model must inherit this.

    It defines common `encoder` specific functions.
    c                    s   t t|   d S N)r   r'   r   )r   r   r   r   r       s   zBaseEncoder.__init__c                 C   s@   t jt|d tjj|d |d |d |d t j|d dS )Npreemphasissample_ratefft_size
win_length
hop_lengthnum_mels)r*   n_fftr,   r-   	window_fnn_mels)r   r   
Sequentialr	   
torchaudio
transformsMelSpectrogramhamming_window)r   audio_configr   r   r   get_torch_mel_spectrogram_class#   s   
z+BaseEncoder.get_torch_mel_spectrogram_classTc                 C   s   |  ||S r(   )r"   )r   r!   l2_normr   r   r   	inference?   s   zBaseEncoder.inference   
   c                 C   s   | j r
|| jd  }|jd }||k r|}tjd|| |d}g }|D ]}	t|	}	t|	| }
|dd|	|
f }|| q#tj|dd}| j	||d}|rWtj
|ddd	}|S )
zP
        Generate embeddings for a batch of utterances
        x: 1xTxD
        r-   r   r   )numN)dim)r9   T)r>   keepdim)use_torch_specr7   shapenplinspaceintappendr   catr:   mean)r   r!   
num_framesnum_evalreturn_meanr9   max_lenoffsetsframes_batchoffset
end_offsetframes
embeddingsr   r   r   compute_embeddingC   s"   
zBaseEncoder.compute_embeddingNcc                 C   sX   |j dkrtdd}|S |j dkrt }|S |j dkr%t|jd |}|S td|j  )Nge2esoftmax)loss_method
angleprotosoftmaxprotoproj_dimzThe %s  not is a loss supported)lossr   r   r   model_params	Exception)r   rS   num_classes	criterionr   r   r   get_criterionb   s   



zBaseEncoder.get_criterionFconfigcheckpoint_pathevaluse_cudac           
   
   C   sl  t |td|d}z| |d  td W n. ttfyE } z |r%|td |  }	t|	|d t	}	| |	 ~	W Y d }~nd }~ww |d urqd|v rqz	||d  W n ttfyp } ztd| W Y d }~nd }~ww |r|d u rd|v rt
|dd d ur| |t|j}||d  |r|   |d ur| }|r|   | jrJ |s||d	 fS |S )
Ncpu)map_locationcachemodelz > Model fully restored. z  > Partial model initialization.r^   z% > Criterion load ignored because of:map_classid_to_classnamestep)r   r   deviceload_state_dictprintKeyErrorRuntimeError
state_dictr   rS   getattrr_   r   rh   cudarb   training)
r   r`   ra   rb   rc   r^   rf   stateerror
model_dictr   r   r   load_checkpointm   sL   	

zBaseEncoder.load_checkpoint)T)r;   r<   TTr(   )FFNF)r#   r$   r%   __doc__r   r8   r   no_gradr:   rR   r   r_   strboolrv   r&   r   r   r   r   r'      s,    r'   )numpyrB   r   r3   coqpitr   r   TTS.encoder.lossesr   r   r   TTS.utils.generic_utilsr   TTS.utils.ior   Moduler	   r'   r   r   r   r   <module>   s    