o
    qmir                     @   s   d dl Z d dlZd dlZd dlm  mZ ddlmZ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 eje ZG d	d
 d
eZG dd deZdS )    N   )EventEmitterMixin	EventType)parse_obj_as)	AudioData)AudioMessage)SpeechToTextStreamingResponse)SttFlushSignalc                       s   e Zd Zdejf fddZdd Zdd Zdd
efddZ	dddZ
deddfddZdefddZdejddfddZdejddfddZ  ZS )&AsyncSpeechToTextStreamingSocketClient	websocketc                      t    || _d S Nsuper__init__
_websocketselfr   	__class__ c/home/ubuntu/.local/lib/python3.10/site-packages/sarvamai/speech_to_text_streaming/socket_client.pyr         

z/AsyncSpeechToTextStreamingSocketClient.__init__c                 C  s@   | j 2 z3 d H W }t|trt|n|}tt|V  q6 d S r   r   
isinstancestrjsonloadsr   )SpeechToTextStreamingSocketClientResponser   messager   r   r   	__aiter__   s   z0AsyncSpeechToTextStreamingSocketClient.__aiter__c              
      s   |  tjd zTz%| j2 z3 dH W }t|trt|n|}tt	|}|  tj
| q6 W n tjyH } z|  tj| W Y d}~nd}~ww W |  tjd dS W |  tjd dS |  tjd w aH  
        Start listening for messages on the websocket connection.

        Emits events in the following order:
        - EventType.OPEN when connection is established
        - EventType.MESSAGE for each message received
        - EventType.ERROR if an error occurs
        - EventType.CLOSE when connection is closed
        N_emitr   OPENr   r   r   r   r   r   r   MESSAGE
websocketsWebSocketExceptionERRORCLOSEr   raw_messageparsedexcr   r   r   start_listening    s*   

"z6AsyncSpeechToTextStreamingSocketClient.start_listening	audio/wav>  audioc                    s$   | j tt|||dddI dH S )z
        Sends transcription request to the server.
        :param audio: Base64 encoded audio data
        :param encoding: Audio encoding format (default is "audio/wav")
        :param sample_rate: Audio sample rate in Hz (default is 16000)
        datasample_rateencodingr2   r    N,_send_speech_to_text_streaming_audio_messager   r   r   r2   r6   r5   r   r   r   
transcribe;   s   z1AsyncSpeechToTextStreamingSocketClient.transcribereturnNc                    s   t  }| |I dH  dS z
        Signal to flush the audio buffer and force finalize partial transcriptions.
        Use this to force processing of any remaining audio that hasn't been
        transcribed yet.
        Nr	   _send_modelr   r   r   r   flushI   s   z,AsyncSpeechToTextStreamingSocketClient.flushr    c                    s   |  |I dH  dS zq
        Send a message to the websocket connection.
        The message will be sent as a AudioMessage.
        Nr@   r   r   r   r   r:   R   s   zSAsyncSpeechToTextStreamingSocketClient._send_speech_to_text_streaming_audio_messagec                    s4   | j  I dH }t|trt|n|}tt|S )B
        Receive a message from the websocket connection.
        Nr   recvr   r   r   r   r   r   r   r4   r   r   r   rF   [   s   z+AsyncSpeechToTextStreamingSocketClient.recvr4   c                    s,   t |trt|}| j|I dH  dS z=
        Send a message to the websocket connection.
        Nr   dictr   dumpsr   sendrG   r   r   r   _sende   s   

z,AsyncSpeechToTextStreamingSocketClient._sendc                    s   |  | I dH  dS zD
        Send a Pydantic model to the websocket connection.
        NrM   rJ   rG   r   r   r   r@   m   s   z2AsyncSpeechToTextStreamingSocketClient._send_modelr0   r1   r=   N)__name__
__module____qualname__r'   WebSocketClientProtocolr   r!   r/   r   r<   rA   r   r:   r   rF   typingAnyrM   r@   __classcell__r   r   r   r   r
      s    
	
	
r
   c                       s   e Zd Zdejf fddZdd Zdd Zdd
eddfddZ	dddZ
defddZdeddfddZdejddfddZdejddfddZ  ZS )!SpeechToTextStreamingSocketClientr   c                   r   r   r   r   r   r   r   r   u   r   z*SpeechToTextStreamingSocketClient.__init__c                 c   s6    | j D ]}t|trt|n|}tt|V  qd S r   r   r   r   r   r   __iter__y   s   
z*SpeechToTextStreamingSocketClient.__iter__c              
   C   s   |  tjd zOz | jD ]}t|trt|n|}tt	|}|  tj
| qW n tjyB } z|  tj| W Y d}~nd}~ww W |  tjd dS W |  tjd dS |  tjd w r"   r#   r+   r   r   r   r/      s(   


"z1SpeechToTextStreamingSocketClient.start_listeningr0   r1   r2   r=   Nc                 C   s   | j tt|||dddS )a  
        Sends transcription request to the server.
        :param audio: Base64 encoded audio data
        :param encoding (Optional): Audio encoding format (default is "audio/wav")
        :param sample_rate (Optional): Audio sample rate in Hz (default is 16000)
        r3   r7   r8   r9   r;   r   r   r   r<      s
   z,SpeechToTextStreamingSocketClient.transcribec                 C   s   t  }| | dS r>   r?   r   r   r   r   rA      s   z'SpeechToTextStreamingSocketClient.flushc                 C   s,   | j  }t|trt|n|}tt|S )rD   rE   rG   r   r   r   rF      s
   
z&SpeechToTextStreamingSocketClient.recvr    c                 C   s   |  | dS rB   rC   r   r   r   r   r:      s   zNSpeechToTextStreamingSocketClient._send_speech_to_text_streaming_audio_messager4   c                 C   s$   t |tr
t|}| j| dS rH   rI   rG   r   r   r   rM      s   

z'SpeechToTextStreamingSocketClient._sendc                 C   s   |  |  dS rN   rO   rG   r   r   r   r@      s   z-SpeechToTextStreamingSocketClient._send_modelrP   rQ   )rR   rS   rT   websockets_sync_connection
Connectionr   rZ   r/   r   r<   rA   r   rF   r   r:   rV   rW   rM   r@   rX   r   r   r   r   rY   t   s    
	

	rY   )r   rV   r'   websockets.sync.connectionsync
connectionr[   core.eventsr   r   core.pydantic_utilitiesr   types.audio_datar   types.audio_messager   'types.speech_to_text_streaming_responser   types.stt_flush_signalr	   Unionr   r
   rY   r   r   r   r   <module>   s   
`