
    qi                         d Z ddl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 ddlmZmZmZmZmZmZmZmZ dd	lmZ  G d
 de      Zy)z8Vonage Audio Connector WebSocket serializer for Pipecat.    N)Optional)logger)	BaseModel)KeypadEntry)create_stream_resampler)AudioRawFrameFrameInputAudioRawFrameInputDTMFFrameInterruptionFrameOutputTransportMessageFrame!OutputTransportMessageUrgentFrame
StartFrame)FrameSerializerc                   ~    e Zd ZdZ G d de      Zddee   fdZdefdZ	de
d	eez  dz  fd
Zdeez  d	e
dz  fdZy)VonageFrameSerializera  Serializer for Vonage Video API Audio Connector WebSocket protocol.

    This serializer converts between Pipecat frames and the Vonage Audio Connector
    WebSocket streaming protocol.

    Note:
        Ref docs: https://developer.vonage.com/en/video/guides/audio-connector
    c                   4    e Zd ZU dZdZeed<   dZee   ed<   y)!VonageFrameSerializer.InputParamsa$  Configuration parameters for VonageFrameSerializer.

        Parameters:
            vonage_sample_rate: Sample rate used by Vonage, defaults to 16000 Hz.
                Common values: 8000, 16000, 24000 Hz.
            sample_rate: Optional override for pipeline input sample rate.
        i>  vonage_sample_rateNsample_rate)	__name__
__module____qualname____doc__r   int__annotations__r   r        m/home/ccuser/rateright-growth/voice-assistant/venv/lib/python3.12/site-packages/pipecat/serializers/vonage.pyInputParamsr   (   s"    	 #(C'%)Xc])r   r    Nparamsc                     |xs t         j                         | _        | j                  j                  | _        d| _        t               | _        t               | _        y)zkInitialize the VonageFrameSerializer.

        Args:
            params: Configuration parameters.
        r   N)	r   r    _paramsr   _vonage_sample_rate_sample_rater   _input_resampler_output_resampler)selfr!   s     r   __init__zVonageFrameSerializer.__init__4   sJ     D!6!B!B!D#'<<#B#B  7 9!8!:r   framec                 ^   K   | j                   j                  xs |j                  | _        yw)zSets up the serializer with pipeline configuration.

        Args:
            frame: The StartFrame containing pipeline configuration.
        N)r#   r   audio_in_sample_rater%   )r(   r*   s     r   setupzVonageFrameSerializer.setupB   s%      !LL44R8R8Rs   +-returnc                   K   t        |t              rddi}t        j                  |      S t        |t              rX|j
                  }| j                  j                  ||j                  | j                         d{   }|t        |      dk(  ry|S t        |t        t        f      rt        j                  |j                        S y7 Mw)aP  Serializes a Pipecat frame to Vonage WebSocket format.

        Handles conversion of various frame types to Vonage WebSocket messages.

        Args:
            frame: The Pipecat frame to serialize.

        Returns:
            Serialized data as string (JSON commands) or bytes (audio), or None if the frame isn't handled.
        actionclearNr   )
isinstancer   jsondumpsr   audior'   resampler   r$   lenr   r   message)r(   r*   answerdataserialized_datas        r   	serializezVonageFrameSerializer.serializeJ   s      e./(F::f%%}-;;D %)$:$:$C$Ce'')A)A% O &#o*>!*C #" ;=^_`::emm,,s   A:C<C
=ACr:   c                 .  K   t        |t              rf|}| j                  j                  || j                  | j
                         d{   }|t        |      dk(  ryt        |d| j
                        }|S 	 t        j                  |      }|j                  d      }|dk(  r(t        j                  d|j                  d              y|d	k(  rt        j                  d
       y|dk(  r(t        j                  d|j                  d              y|dk(  r|j                  d      xs! |j                  di       j                  d      }|t        j                  d|        yt        |      }t        j                  d|        	 t        t!        |            S t        j                  d|        y7 q# t"        $ r t        j                  d|        Y yw xY w# t        j$                  $ r t        j                  d|        Y yw xY ww)a  Deserializes Vonage WebSocket data to Pipecat frames.

        Handles conversion of Vonage events to appropriate Pipecat frames.
        - Binary messages contain audio data (16-bit linear PCM)
        - Text messages contain JSON events (websocket:connected, websocket:cleared, dtmf, etc.)

        Args:
            data: The raw WebSocket data from Vonage.

        Returns:
            A Pipecat frame corresponding to the Vonage event, or None if unhandled.
        Nr      )r5   num_channelsr   eventzwebsocket:connectedz)Vonage WebSocket connected: content-type=zcontent-typezwebsocket:clearedzVonage audio buffer clearedzwebsocket:notifyzVonage notify event: payloadzwebsocket:dtmfdigitdtmfz(DTMF event received but no digit found: zReceived DTMF digit: zInvalid DTMF digit received: zVonage event: z*Failed to parse JSON message from Vonage: )r2   bytesr&   r6   r$   r%   r7   r
   r3   loadsgetr   debugwarningstrr   r   
ValueErrorJSONDecodeError)r(   r:   rA   deserialized_dataaudio_framer8   r@   rB   s           r   deserializez!VonageFrameSerializer.deserializel   s     dE"G '+&;&;&D&D((!!' !
 !(C0A,Ba,G,' --K
 %**T*G, 11LLCGKKP^D_C`a  11LL!>?00LL#8Y9O8P!QR.. $KK0XGKK4K4O4OPW4XE})QRYQZ'[\#JELL#8!@A$-k%.@AA
 LL>%!9:e!Z & $)Fug'NO#$ '' !KD6RSs   AH	F:
/H:AG$ HG$ 'H(,G$ HAG$ (H)#G$ F=  H!G$ 9H=!G!G$ H G!!G$ $+HHHH)N)r   r   r   r   r   r    r   r)   r   r-   r	   rI   rD   r<   rN   r   r   r   r   r      sm    
*i 
*;x4 ;S S U  sU{T/A  DIcEk Iedl Ir   r   )r   r3   typingr   logurur   pydanticr   pipecat.audio.dtmf.typesr   pipecat.audio.utilsr   pipecat.frames.framesr   r	   r
   r   r   r   r   r   #pipecat.serializers.base_serializerr   r   r   r   r   <module>rV      s?    ?     0 7	 	 	 @WO Wr   