o
    i                     @   sp   d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
mZmZmZ ddlmZmZ G dd	 d	eZd
S )zVoice Activity Detection processor for detecting speech in audio streams.

This module provides a VADProcessor that wraps a VADController to process
audio frames and push VAD-related frames into the pipeline.
    )Type)logger)VADAnalyzer)VADController)FrameUserSpeakingFrameVADUserStartedSpeakingFrameVADUserStoppedSpeakingFrame)FrameDirectionFrameProcessorc                       sF   e Zd ZdZdddedef fddZded	ef fd
dZ	  Z
S )VADProcessora  Processes audio frames through voice activity detection.

    This processor wraps a VADController to detect speech in audio streams
    and push VAD frames into the pipeline:

    - ``VADUserStartedSpeakingFrame``: Pushed when speech begins.
    - ``VADUserStoppedSpeakingFrame``: Pushed when speech ends.
    - ``UserSpeakingFrame``: Pushed periodically while speech is detected.

    Example::

        vad_processor = VADProcessor(vad_analyzer=SileroVADAnalyzer())
    g?speech_activity_periodvad_analyzerr   c          	         s   t  jdi | t||d _ jd fdd} jd fdd} jd fd	d
} jddtdtf fdd} jddtt f fdd}dS )aD  Initialize the VAD processor.

        Args:
            vad_analyzer: The VADAnalyzer instance for processing audio.
            speech_activity_period: Minimum interval in seconds between
                UserSpeakingFrame pushes. Defaults to 0.2.
            **kwargs: Additional arguments passed to parent class.
        r   on_speech_startedc                    0   t   d  jt| jjjdI d H  d S )Nz: User started speaking)
start_secs)r   debugbroadcast_framer   _vad_analyzerparamsr   _controllerself Z/home/ubuntu/.local/lib/python3.10/site-packages/pipecat/processors/audio/vad_processor.pyr   @      z0VADProcessor.__init__.<locals>.on_speech_startedon_speech_stoppedc                    r   )Nz: User stopped speaking)	stop_secs)r   r   r   r	   r   r   r   r   r   r   r   r   H   r   z0VADProcessor.__init__.<locals>.on_speech_stoppedon_speech_activityc                    s     tI d H  d S N)r   r   r   r   r   r   r    P   s   z1VADProcessor.__init__.<locals>.on_speech_activityon_push_frameframe	directionc                    s     ||I d H  d S r!   )
push_frame)r   r#   r$   r   r   r   r"   U   s   z,VADProcessor.__init__.<locals>.on_push_frameon_broadcast_frame	frame_clsc                    s    j |fi |I d H  d S r!   )r   )r   r'   kwargsr   r   r   r&   Y   s   z1VADProcessor.__init__.<locals>.on_broadcast_frameNr   )super__init__r   _vad_controllerevent_handlerr   r
   r   )	r   r   r   r(   r   r   r    r"   r&   	__class__r   r   r*   +   s   




zVADProcessor.__init__r#   r$   c                    s>   t  ||I dH  | ||I dH  | j|I dH  dS )zProcess a frame through VAD and forward it.

        Args:
            frame: The frame to process.
            direction: The direction of frame flow in the pipeline.
        N)r)   process_framer%   r+   )r   r#   r$   r-   r   r   r/   ]   s   zVADProcessor.process_frame)__name__
__module____qualname____doc__r   floatr*   r   r
   r/   __classcell__r   r   r-   r   r      s    2r   N)r3   typingr   logurur   pipecat.audio.vad.vad_analyzerr    pipecat.audio.vad.vad_controllerr   pipecat.frames.framesr   r   r   r	   "pipecat.processors.frame_processorr
   r   r   r   r   r   r   <module>   s   