
    NjF                         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 	 ddej                  de
de
de
d	e
f
d
Zddej                  de
de
de
fdZ G d de      Z G d de      Zy)    N)nn)
functional)StatefulModulexkernel_sizestridepadding_totalreturnc                     | j                   d   }||z
  |z   |z  dz   }t        j                  |      dz
  |z  ||z
  z   }||z
  S )zSee `pad_for_conv1d`.   )shapemathceil)r   r   r   r	   lengthn_framesideal_lengths          h/Users/ahmed/devFolder/Ultron/claude-voice/.venv/lib/python3.12/site-packages/pocket_tts/modules/conv.pyget_extra_padding_for_conv1dr      sW     WWR[F$}4>BHIIh'!+v5}9TUL&      c                 N    t        | |||      }t        j                  | d|f      S )a  Pad for a convolution to make sure that the last window is full.
    Extra padding is added at the end. This is required to ensure that we can rebuild
    an output of the same length, as otherwise, even with padding, some time steps
    might get removed.
    For instance, with total padding = 4, kernel size = 4, stride = 2:
        0 0 1 2 3 4 5 0 0   # (0s are padding)
        1   2   3           # (output frames of a convolution, last 0 is never used)
        0 0 1 2 3 4 5 0     # (output of tr. conv., but pos. 5 is going to get removed as padding)
            1 2 3 4         # once you removed padding, we are missing one time step !
    r   )r   Fpad)r   r   r   r	   extra_paddings        r   pad_for_conv1dr      s*     1KWM55Q&''r   c                        e Zd ZdZ	 	 	 	 	 ddededededededed	ef fd
Zedefd       Z	edefd       Z
edefd       Zdededeeej                  f   fdZdedz  fdZ xZS )StreamingConv1dz]Conv1d with some builtin handling of asymmetric or causal padding
    and normalization.
    in_channelsout_channelsr   r   dilationgroupsbiaspad_modec	           	          t         	|           |dv sJ |       || _        |dkD  r$|dkD  rt        j                  d| d| d| d       t        j                  |||||||      | _        y )N)constant	replicater   zSStreamingConv1d has been initialized with stride > 1 and dilation > 1 (kernel_size=z stride=z, dilation=z).)r    r!   r"   )super__init__r#   warningswarnr   Conv1dconv)
selfr   r   r   r   r    r!   r"   r#   	__class__s
            r   r(   zStreamingConv1d.__init__)   s     	44>h>4 A:(Q,MM!!,XfX[
RTV II
	r   r
   c                 4    | j                   j                  d   S Nr   )r,   r   r-   s    r   _stridezStreamingConv1d._strideG   s    yy""r   c                 4    | j                   j                  d   S r0   )r,   r   r1   s    r   _kernel_sizezStreamingConv1d._kernel_sizeK   s    yy$$Q''r   c                 ^    | j                   j                  d   }| j                  dz
  |z  dz   S )Nr   r   )r,   r    r4   )r-   r    s     r   _effective_kernel_sizez&StreamingConv1d._effective_kernel_sizeO   s1    99%%a(!!A%1A55r   
batch_sizesequence_lengthc                 8   | j                   }| j                  }| j                  j                  j                  }t        j                  || j                  j                  ||z
  |      }t        j                  |t
        j                  |      }t        ||      S )Ndevice)dtyper;   )previousfirst)r2   r6   r,   weightr;   torchzerosr   onesbooldict)r-   r7   r8   r   kernelr;   r=   r>   s           r   
init_statezStreamingConv1d.init_stateT   sq    ,,!!((;;z499+@+@&6/Z`a

:UZZGXU33r   model_stateNc                 `   |j                   \  }}}| j                  }|dkD  r||z  dk(  sJ d       || j                  |d      }n| j                  |      }|d   j                   d   }|rX| j                  dk(  rI||k\  sJ d       |dd df   }	t        j                  |d	   j                  ddd      |	|d         |d   d d  |rt        j                  |d   |gd
      }| j                  |      }
|r:|d| d f   |d   d d  | j                  dk(  rt        j                  |d	         |d	<   |
S )Nr   z Steps must be multiple of strider=   r   r&   z$Not enough content to pad streaming..r   r>   )dim)r   r2   rF   	get_stater#   r@   whereviewcatr,   
zeros_like)r-   r   rG   BCTSstateTPinitys              r   forwardzStreamingConv1d.forward]   sK   ''1aLL1uQ!G%GG#OOAq)ENN;/E:$$R($--;.7BBB7S"1"W:D#(;;g##B1-tU:5F$E*a  		5,a0b9AIIaL#$S2#$Y<E*a }}+!&!1!1%.!Agr   )r   r   r   Tr%   )__name__
__module____qualname____doc__intrC   strr(   propertyr2   r4   r6   rD   r@   TensorrF   rW   __classcell__r.   s   @r   r   r   $   s     "

 
 	

 
 
 
 
 
< # # # (c ( ( 6 6 64S 43 44U\\HYCZ 4dTk r   r   c                        e Zd ZdZ	 	 	 ddedededededef fdZed	efd
       Zed	efd       Z	deded	e
eej                  f   fdZde
fdZ xZS )StreamingConvTranspose1dzfConvTranspose1d with some builtin handling of asymmetric or causal padding
    and normalization.
    r   r   r   r   r!   r"   c                 b    t         |           t        j                  ||||||      | _        y )N)r!   r"   )r'   r(   r   ConvTranspose1dconvtr)r-   r   r   r   r   r!   r"   r.   s          r   r(   z!StreamingConvTranspose1d.__init__{   s0     	(({F6PT
r   r
   c                 4    | j                   j                  d   S r0   )rf   r   r1   s    r   r2   z StreamingConvTranspose1d._stride   s    {{!!!$$r   c                 4    | j                   j                  d   S r0   )rf   r   r1   s    r   r4   z%StreamingConvTranspose1d._kernel_size   s    {{&&q))r   r7   r8   c                     | j                   }| j                  }| j                  j                  j                  }t        t        j                  || j                  j                  ||z
  |            S )Nr:   )partial)	r4   r2   rf   r?   r;   rD   r@   rA   r   )r-   r7   r8   KrR   r;   s         r   rF   z#StreamingConvTranspose1d.init_state   sU    LL##**EKK
DKK4L4LaRSe\bcddr   
mimi_statec                    | j                  |      d   }| j                  |      }|j                  d   }|dkD  rN|dd |fxx   |z  cc<   | j                  j                  }|d| d f   }|||d d d f   z  }||d d  |dd | f   }|S )Nrj   r   r   .)rJ   rf   r   r"   )r-   r   rl   layer_staterV   PTr"   for_partials           r   rW   z StreamingConvTranspose1d.forward   s    nnZ0;KKNr"6c3B3hK;&K;;##DC"I,KtAtG},(KN#tt)Ar   )r   r   T)rX   rY   rZ   r[   r\   rC   r(   r^   r2   r4   rD   r]   r@   r_   rF   rW   r`   ra   s   @r   rc   rc   v   s     

 
 	

 
 
 
 % % % *c * *eS e3 e4U\\HYCZ eT r   rc   )r   )r   r)   r@   r   torch.nnr   r   "pocket_tts.modules.stateful_moduler   r_   r\   r   r   r   rc    r   r   <module>rt      s        $ = JK!||!"%!/2!CF!!(ell ( (c (RU (On Od-~ -r   