
    kIJj                     
   U d dl Z d dlmZ d dlmZmZmZ d dlZd dl	Z	dZ
eed<   dZeed<    ee      j                  Zedz  d	z  Zd
Zeed<   dZeed<   edz  Zeed<    e j(                         Z G d de      Z G d d      Zy)    N)Path)FinalIterableUnioni>  _RATEi  _MAX_WAVmodelszsilero_vad.onnx@   _CONTEXT_SIZEi   _CHUNK_SAMPLES   _CHUNK_BYTESc                       e Zd ZdZy)InvalidChunkSizeErrorz,Error raised when chunk size is not correct.N)__name__
__module____qualname____doc__     _/Users/ahmed/devFolder/claude-voice/.venv/lib/python3.12/site-packages/pysilero_vad/__init__.pyr   r      s    6r   r   c                       e Zd ZdZefdeeef   ddfdZe	de
fd       Ze	de
fd       ZddZd	edefd
Zd	edefdZdej&                  defdZd	edee   fdZy)SileroVoiceActivityDetectorzYDetects speech/silence using Silero VAD.

    https://github.com/snakers4/silero-vad
    	onnx_pathreturnNc                    t        |      }t        j                         }d|_        d|_        t        j
                  |dg|      | _        t        j                  dt        ft        j                        | _        t        j                  dt        j                        | _        t        j                  t        t        j                        | _        y )N   CPUExecutionProvider)	providerssess_optionsdtyper   r      )stronnxruntimeSessionOptionsinter_op_num_threadsintra_op_num_threadsInferenceSessionsessionnpzerosr   float32_context_statearrayr   int64_sr)selfr   optss      r   __init__z$SileroVoiceActivityDetector.__init__   s    	N	))+$%!$%!"33"8!9
 !]!32::Fhh{"**=88E2r   c                      t         S )z5Return number of samples required for an audio chunk.)r   r   r   r   chunk_samplesz)SileroVoiceActivityDetector.chunk_samples,   s
     r   c                      t         S )z3Return number of bytes required for an audio chunk.)r   r   r   r   chunk_bytesz'SileroVoiceActivityDetector.chunk_bytes1   s
     r   c                 V    t        j                  d      j                  d      | _        y)zReset state.r#   r.   N)r,   r-   astyper0   )r4   s    r   resetz!SileroVoiceActivityDetector.reset6   s    hh{+229=r   audioc                 $    | j                  |      S )Return probability of speech [0-1] in a single audio chunk.

        Audio *must* be 512 samples of 16Khz 16-bit mono PCM.
        )process_chunk)r4   r>   s     r   __call__z$SileroVoiceActivityDetector.__call__:   s    
 !!%((r   c                     t        |      t        k7  rt        t        j                  |t        j
                        j                  t        j                        t        z  }| j                  |      S )r@   r!   )
lenr   r   r,   
frombufferint16r<   r.   r   process_array)r4   r>   audio_arrays      r   rA   z)SileroVoiceActivityDetector.process_chunkA   sP    
 u:%''mmE:AA"**MPXX!!+..r   rH   c                    t        |      t        k7  rt        t        j                  | j
                  |t        j                  ddf   fd      }|ddt         df   | _        |dddt        t        z   f   | j                  | j                  d}| j                  j                  d|      }|\  }| _        |j                         S )zReturn probability of speech [0-1] in a single audio chunk.

        Audio *must* be 512 float samples [0-1] of 16Khz mono.
        Nr   )axis)inputstatesr)rD   r   r   r,   concatenater/   newaxisr   r0   r3   r+   runsqueeze)r4   rH   
ort_inputsort_outsouts        r   rG   z)SileroVoiceActivityDetector.process_arrayN   s    
 {~-'' nn]]K

A67a
 $A~$67 !$Dn}&D$D!DE[[((


 <<##D*5#T[{{}r   c              #      K   t        |      t        k  rt        t        |      }d}|t        z   |k  r4| j                  |||t        z           |t        z  }|t        z   |k  r3yyw)z{Return probability of speech in audio [0-1] for each chunk of audio.

        Audio must be 16Khz 16-bit mono PCM.
        r   N)rD   r   r   rA   )r4   r>   num_audio_bytes	audio_idxs       r   process_chunksz*SileroVoiceActivityDetector.process_chunksh   sk     
 u:$''e*	<'?:$$U9y<7O%PQQ%I <'?:s   A$A)'A))r   N)r   r   r   r   _DEFAULT_ONNX_PATHr   r%   r   r6   staticmethodintr8   r:   r=   bytesfloatrB   rA   r,   ndarrayrG   r   rX   r   r   r   r   r      s    
 6H 3%T	"2 3D 3 3     >)e ) )/5 /U /  4&E &huo &r   r   )loggingpathlibr   typingr   r   r   numpyr,   r&   r   __annotations__r   __file__parent_DIRrY   r   r   r   	getLogger_LOGGER	Exceptionr   r   r   r   r   <module>rj      s      ) )  u % H~H_'88 u  $q(e (
'


7I 7_& _&r   