o
    㥵i
                     @   s   d dl mZ G dd dZdS )    )nnc                   @   s   e Zd Zdd ZdddZdS )TinySileroVADc                 C   s   d| _ d| _d| _t| j d d | _tjddd| jddd	| _tjd
ddddd| _tjdddddd| _	tjdddddd| _
tjdddddd| _tdd| _tddd| _dS )z
        from tinygrad.nn.state import safe_load, load_state_dict

        tiny_model = TinySileroVAD()
        state_dict = safe_load('data/silero_vad_16k.safetensors')
        load_state_dict(tiny_model, state_dict)
              @         i  r   F)kernel_sizestridepaddingbias      )r	   r
   r   N)n_fftr
   padintcutoffr   Conv1d	stft_convconv1conv2conv3conv4LSTMCell	lstm_cell
final_conv)self r   M/home/ubuntu/.local/lib/python3.10/site-packages/silero_vad/tinygrad_model.py__init__   s   zTinySileroVAD.__init__Nc                 C   s  |dur|d |d f}| d| j fdd}| |}|ddd| jddf d |dd| jdddf d   }| | }| | }| | }| 	| 
d}| ||\}}|d}|j|dd}| }| | }|
djddd}||fS )	a  
        # full audio example:
        import torch
        from tinygrad import Tensor

        wav = read_audio(audio_path, sampling_rate=16000).unsqueeze(0)
        num_samples = 512
        context_size = 64
        context = Tensor(np.zeros((1, context_size))).float()
        outs = []
        state = None
        if wav.shape[1] % num_samples:
            pad_num = num_samples - (wav.shape[1] % num_samples)
            wav = torch.nn.functional.pad(wav, (0, pad_num), 'constant', value=0.0)

        wav = torch.nn.functional.pad(wav, (context_size, 0))

        wav = Tensor(wav.numpy()).float()

        for i in tqdm(range(context_size, wav.shape[1], num_samples)):
            wavs_batch = wav[:, i-context_size:i+num_samples]
            out_chunk, state = tiny_model(wavs_batch, state)
            #outs.append(out_chunk.numpy())
            outs.append(out_chunk)

        predict = outs[0].cat(*outs[1:], dim=1).numpy()
        
        Nr   r   reflectr   )dim)axis)r   	unsqueezer   r   sqrtr   relur   r   r   squeezer   stackr   sigmoidmean)r   xstatehcr   r   r   __call__   s    
D
zTinySileroVAD.__call__)N)__name__
__module____qualname__r   r/   r   r   r   r   r      s    r   N)tinygradr   r   r   r   r   r   <module>   s    