
    qiF                         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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)KeypadEntry)create_stream_resampler)AudioRawFrameFrameInputAudioRawFrameInputDTMFFrameInterruptionFrameOutputTransportMessageFrame!OutputTransportMessageUrgentFrame
StartFrame)FrameSerializerc                        e Zd ZdZ G d dej
                        Zddee   f 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 xZS )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.
            ignore_rtvi_messages: Inherited from base FrameSerializer, defaults to True.
        i>  vonage_sample_rateNsample_rate)	__name__
__module____qualname____doc__r   int__annotations__r   r        L/opt/pipecat/venv/lib/python3.12/site-packages/pipecat/serializers/vonage.pyInputParamsr   '   s"    	 #(C'%)Xc])r   r   Nparamsc                     t         |   |xs t        j                                | j                  j
                  | _        d| _        t               | _	        t               | _
        y)zkInitialize the VonageFrameSerializer.

        Args:
            params: Configuration parameters.
        r   N)super__init__r   r   _paramsr   _vonage_sample_rate_sample_rater   _input_resampler_output_resampler)selfr    	__class__s     r   r#   zVonageFrameSerializer.__init__4   sQ     	F#8#D#D#FG#'<<#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      r1| j                  |      ryt        j                  |j                        S y7 _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   should_ignore_frame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      )r6   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: )r3   bytesr'   r7   r%   r&   r8   r	   r4   loadsgetr   debugwarningstrr
   r   
ValueErrorJSONDecodeError)r)   r<   rC   deserialized_dataaudio_framer:   rB   rD   s           r   deserializez!VonageFrameSerializer.deserializen   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   rK   rF   r>   rP   __classcell__)r*   s   @r   r   r      st    *o11 *;x4 ;S S"U "sU{T/A "HIcEk Iedl Ir   r   )r   r4   typingr   logurur   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>rX      s<    ?    0 7	 	 	 @ZO Zr   