o
    㥵i                     @   sX   d dl Z d dlmZ d dl mZmZ d dlmZ G dd dejZ	G dd dejZ
dS )    N)Tensornn)MelScalec                       s:   e Zd Z					d fdd	Zdedefd	d
Z  ZS )LinearSpectrogram      F	pow2_sqrtc                    sH   t    || _|| _|| _|| _|| _d| _| jdt	
|dd d S )NTwindowF
persistent)super__init__n_fft
win_length
hop_lengthcentermodereturn_complexregister_buffertorchhann_window)selfr   r   r   r   r   	__class__ Q/home/ubuntu/.local/lib/python3.10/site-packages/fish_speech/utils/spectrogram.pyr      s   
zLinearSpectrogram.__init__yreturnc                 C   s   |j dkr
|d}tjjj|d| j| j d | j| j d d fddd}tj	|| j
| j| j| j| jddd| jd
}| jrGt|}| jd	krYt|dd
d }|S )N         reflect)r   FT)r   r   r	   r   pad_mode
normalizedonesidedr   r   gư>)ndimsqueezer   r   
functionalpad	unsqueezer   r   stftr   r	   r   r   view_as_realr   sqrtpowsum)r   r   specr   r   r   forward   s8   

	

zLinearSpectrogram.forward)r   r   r   Fr   )__name__
__module____qualname__r   r   r1   __classcell__r   r   r   r   r      s    r   c                	       s   e Zd Z								d fdd		Zd
edefddZd
edefddZd
edefddZ	dd
edede	defddZ
  ZS )LogMelSpectrogramD  r   r      F        Nc	           
   	      s   t    || _|| _|| _|| _|| _|| _|| _|p!t	|d | _
t||||| _tj| jd d | j| j
| j| jddd}	| jd|	dd d S )Nr    r   slaney)n_freqsf_minf_maxn_melssample_ratenorm	mel_scalefbFr
   )r   r   r?   r   r   r   r   r>   r<   floatr=   r   spectrogramFmelscale_fbanksr   )
r   r?   r   r   r   r>   r   r<   r=   rB   r   r   r   r   ?   s0   
	
zLogMelSpectrogram.__init__xr   c                 C   s   t t j|ddS )Ngh㈵>)min)r   logclampr   rG   r   r   r   compressf   s   zLogMelSpectrogram.compressc                 C   s
   t |S )N)r   exprK   r   r   r   
decompressi   s   
zLogMelSpectrogram.decompressc                 C   s   t |dd| jddS )Nr%   )r   matmul	transposerB   rK   r   r   r   apply_mel_scalel   s   z!LogMelSpectrogram.apply_mel_scalereturn_linearr?   c                 C   sX   |d ur|| j krtj||| j d}| |}| |}| |}|r*|| |fS |S )N)	orig_freqnew_freq)r?   rE   resamplerD   rR   rL   )r   rG   rS   r?   linearr   r   r   r1   o   s   


zLogMelSpectrogram.forward)r7   r   r   r   r8   Fr9   N)FN)r2   r3   r4   r   r   rL   rN   rR   boolintr1   r5   r   r   r   r   r6   >   s.    'r6   )r   torchaudio.functionalr(   rE   r   r   torchaudio.transformsr   Moduler   r6   r   r   r   r   <module>   s    7