
    qix                     ~   U d Z ddlZddlmZmZ ddlmZmZmZm	Z	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mZ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# ddl$m%Z% ddl&m'Z' ddl(m)Z)m*Z* ddl+m,Z, ddl-m.Z. 	 ddl/m0Z0 ddl1m2Z2 ddl3m4Z4 de)de9fdZ: ed       G d d             Z; e;ddddddd       e;ddddddd       e;ddddd dd      d!Z<ee9e;f   e=d"<   e G d# d$e              Z> G d% d&e'      Z?y# e5$ r7Z6 ejn                  de6         ejn                  d        e8de6       dZ6[6ww xY w)'a'  Sarvam AI Speech-to-Text service implementation.

This module provides a streaming Speech-to-Text service using Sarvam AI's WebSocket-based
API. It supports real-time transcription with Voice Activity Detection (VAD) and
can handle multiple audio formats for Indian language speech recognition.
    N)	dataclassfield)AnyAsyncGeneratorDictLiteralOptional)logger)	BaseModel)
CancelFrameEndFrame
ErrorFrameFrame
StartFrameTranscriptionFrameUserStartedSpeakingFrameUserStoppedSpeakingFrameVADUserStartedSpeakingFrameVADUserStoppedSpeakingFrame)FrameDirection)sdk_headers)	NOT_GIVENSTTSettings	_NotGiven_warn_deprecated_paramis_given)SARVAM_TTFS_P99)
STTService)Languageresolve_language)time_now_iso8601)
traced_stt)AsyncSarvamAI)ApiError)	EventTypezException: zEIn order to use Sarvam, you need to `pip install pipecat-ai[sarvam]`.zMissing module: languagereturnc                    t         j                  dt         j                  dt         j                  dt         j                  dt         j
                  dt         j                  dt         j                  dt         j                  dt         j                  d	t         j                  d
t         j                  dt         j                  di}t        | |d      S )zConvert a Language enum to Sarvam's language code format.

    Args:
        language: The Language enum value to convert.

    Returns:
        The Sarvam language code string.
    bn-INgu-INhi-INkn-INml-INmr-INta-INte-INpa-INod-INen-INas-INF)use_base_code)r   BN_INGU_INHI_INKN_INML_INMR_INTA_INTE_INPA_INOR_INEN_INAS_INr    )r&   LANGUAGE_MAPs     M/opt/pipecat/venv/lib/python3.12/site-packages/pipecat/services/sarvam/stt.pylanguage_to_sarvam_languagerD   :   s     	L Hl%HH    T)frozenc                   d    e Zd ZU dZeed<   eed<   eed<   ee   ed<   ee   ed<   eed<   eed<   y	)
ModelConfigaK  Immutable configuration for a Sarvam STT model.

    Attributes:
        supports_prompt: Whether the model accepts prompt parameter.
        supports_mode: Whether the model accepts mode parameter.
        supports_language: Whether the model accepts language parameter.
        default_language: Default language code (None = auto-detect).
        default_mode: Default mode (None = not applicable).
        use_translate_endpoint: Whether to use speech_to_text_translate_streaming endpoint.
        use_translate_method: Whether to use translate() method instead of transcribe().
    supports_promptsupports_modesupports_languagedefault_languagedefault_modeuse_translate_endpointuse_translate_methodN)__name__
__module____qualname____doc__bool__annotations__r	   str rE   rC   rH   rH   V   s;    
 sm#3-  rE   rH   Funknown)rI   rJ   rK   rL   rM   rN   rO   
transcribe)saarika:v2.5zsaaras:v2.5z	saaras:v3MODEL_CONFIGSc                       e Zd ZU dZ ed       Zedz  ez  ed<    ed       Z	e
dz  ez  ed<    ed       Ze
dz  ez  ed	<   y)
SarvamSTTSettingsaF  Settings for SarvamSTTService.

    Parameters:
        prompt: Optional prompt to guide transcription/translation style/context.
            Only applicable to models that support prompts (e.g., saaras:v2.5).
        vad_signals: Enable VAD signals in response.
        high_vad_sensitivity: Enable high VAD sensitivity.
    c                      t         S Nr   rW   rE   rC   <lambda>zSarvamSTTSettings.<lambda>   s    9 rE   )default_factoryNpromptc                      t         S r_   r`   rW   rE   rC   ra   zSarvamSTTSettings.<lambda>   s     rE   vad_signalsc                      t         S r_   r`   rW   rE   rC   ra   zSarvamSTTSettings.<lambda>   s    R[ rE   high_vad_sensitivity)rP   rQ   rR   rS   r   rc   rV   r   rU   re   rT   rg   rW   rE   rC   r]   r]      sU     &+;L%MFC$J"M+0AR+SKy(S49J[4\$+	1\rE   r]   c                       e Zd ZU dZeZeed<    G d de      Zdddddde	ddd	d	e
d
ee
   deed      dee   de
dee   dee   dee   dee   def fdZdede
fdZdee
   fdZdefdZdedef fdZdedee
ef   f fdZdee
   fd Zdef fd!Zdef fd"Z de!f fd#Z"d$e#de$edf   fd%Z%d& Z&d' Z'd( Z(d) Z)e*	 d3d*e
d+edee   fd,       Z+d-e
defd.Z,defd/Z-d0e#fd1Z.d2 Z/ xZ0S )4SarvamSTTServicea  Sarvam speech-to-text service.

    Provides real-time speech recognition using Sarvam's WebSocket API.

    Event handlers available (in addition to STTService events):

    - on_connected(service): Connected to Sarvam WebSocket
    - on_disconnected(service): Disconnected from Sarvam WebSocket
    - on_connection_error(service, error): Connection error occurred

    Example::

        @stt.event_handler("on_connected")
        async def on_connected(service):
            ...
    	_settingsc                   |    e Zd ZU dZdZee   ed<   dZee	   ed<   dZ
eed      ed<   dZee   ed<   dZee   ed<   y)	SarvamSTTService.InputParamsa  Configuration parameters for Sarvam STT service.

        .. deprecated:: 0.0.105
            Use ``settings=SarvamSTTSettings(...)`` instead.

        Parameters:
            language: Target language for transcription.
                - saarika:v2.5: Defaults to "unknown" (auto-detect supported)
                - saaras:v2.5: Not used (auto-detects language)
                - saaras:v3: Defaults to "unknown" (auto-detect supported)
            prompt: Optional prompt to guide transcription/translation style/context.
                Only applicable to saaras:v2.5. Defaults to None.
            mode: Mode of operation for saaras:v3 models only. Options: transcribe, translate,
                verbatim, translit, codemix. Defaults to "transcribe" for saaras:v3.
            vad_signals: Enable VAD signals in response. Defaults to None.
            high_vad_sensitivity: Enable high VAD (Voice Activity Detection) sensitivity. Defaults to None.
        Nr&   rc   rY   	translateverbatimtranslitcodemixmodere   rg   )rP   rQ   rR   rS   r&   r	   r   rU   rc   rV   rr   r   re   rT   rg   rW   rE   rC   InputParamsrl      sX    	$ (,(8$+ $$`dhw[\]d&*Xd^*/3htn3rE   rs   Nwavg      @)	modelrr   sample_rateinput_audio_codecparamssettingsttfs_p99_latencykeepalive_timeoutkeepalive_intervalapi_keyru   rr   rm   rv   rw   rx   ry   rz   r{   r|   c       
   	         t        ddddd      }|t        dt         d       ||_        |nt        dt                |s\|j                  |_        |j                  |_        |j
                  |j
                  }|j                  |_        |j                  |_        ||j                  |       |j                  }|t        vr>dj                  t        t        j                                     }t        d| d| d	      t        |   | _        |j                  %| j                  j                  st        d
| d      |%| j                  j                   st        d
| d      |j                  %| j                  j"                  st        d
| d      || j                  j$                  }t'        | P  d|||	|
|d| || _        || _        || _        t1               | _        t5        || j2                        | _        d| _        d| _        d| _        |j                  r3| j?                  d       | j?                  d       | j?                  d       tA        jB                  d| j2                          y)a  Initialize the Sarvam STT service.

        Args:
            api_key: Sarvam API key for authentication.
            model: Sarvam model to use for transcription.

                .. deprecated:: 0.0.105
                    Use ``settings=SarvamSTTSettings(model=...)`` instead.

            mode: Mode of operation. Options: transcribe, translate, verbatim,
                translit, codemix. Only applicable to models that support it
                (e.g., saaras:v3). Defaults to the model's default mode.
            sample_rate: Audio sample rate. Defaults to 16000 if not specified.
            input_audio_codec: Audio codec/format of the input file. Defaults to "wav".
            params: Configuration parameters for Sarvam STT service.

                .. deprecated:: 0.0.105
                    Use ``settings=SarvamSTTSettings(...)`` instead.

            settings: Runtime-updatable settings. When provided alongside deprecated
                parameters, ``settings`` values take precedence.
            ttfs_p99_latency: P99 latency from speech end to final transcript in seconds.
                Override for your deployment. See https://github.com/pipecat-ai/stt-benchmark
            keepalive_timeout: Seconds of no audio before sending silence to keep the
                connection alive. None disables keepalive.
            keepalive_interval: Seconds between idle checks when keepalive is enabled.
            **kwargs: Additional arguments passed to the parent STTService.
        rZ   N)ru   r&   rc   re   rg   ru   rx   z, zUnsupported model 'z'. Allowed values: .Model '$' does not support prompt parameter.z"' does not support mode parameter.>' does not support language parameter (auto-detects language).)rv   rz   r{   r|   ry   )api_subscription_keyheaderson_speech_startedon_speech_stoppedon_utterance_endz)Sarvam STT initialized with SDK headers: rW   )"r]   r   ru   r&   rc   rr   re   rg   apply_updater[   joinsortedkeys
ValueError_configrI   rJ   rK   rM   super__init___api_key_mode_input_audio_codecr   _sdk_headersr#   _sarvam_client_websocket_context_socket_client_receive_task_register_event_handlerr
   info)selfr}   ru   rr   rv   rw   rx   ry   rz   r{   r|   kwargsdefault_settingsresolved_modelallowed	__class__s                  rC   r   zSarvamSTTService.__init__   s   \ - !%
 "7,=wG%*" "8->?,2OO )*0-- ';;*!;;D/5/A/A ,8>8S8S 5 ))(3 *//.ii}'9'9'; <=G2>2BBUV]U^^_`aa$^4 "".t||7S7Sw~&66Z[\\DLL$>$>w~&66XYZZ$$09W9W.))gh 
 <<<,,D 	
#-/1%	
 	
   
 #4 (M ,RVRcRcd"&"!''(()<=(()<=(();<?@Q@Q?RSTrE   r&   r'   c                     t        |      S )zConvert pipecat Language enum to Sarvam's language code.

        Args:
            language: The Language enum value to convert.

        Returns:
            The Sarvam language code string.
        )rD   )r   r&   s     rC   language_to_service_languagez-SarvamSTTService.language_to_service_languageL  s     +844rE   c                     | j                   j                  rt        | j                   j                        S | j                  j                  S )zFResolve the current language setting to a Sarvam language code string.)rj   r&   rD   r   rL   r   s    rC   _get_language_stringz%SarvamSTTService._get_language_stringW  s4    >>"".t~~/F/FGG||,,,rE   c                      y)zCheck if this service can generate processing metrics.

        Returns:
            True, as Sarvam service supports metrics generation.
        TrW   r   s    rC   can_generate_metricsz%SarvamSTTService.can_generate_metrics]  s     rE   frame	directionc                 J  K   t         |   ||       d{    | j                  j                  sjt	        |t
              r| j                          d{    yt	        |t              r0| j                  r#| j                  j                          d{    yyyy7 7 I7 w)zProcess incoming frames.

        Handles VAD frames for TTFB tracking when using Pipecat's VAD
        instead of Sarvam's built-in VAD.
        N)
r   process_framerj   re   
isinstancer   _start_metricsr   r   flush)r   r   r   r   s      rC   r   zSarvamSTTService.process_framee  s      g#E9555 ~~))%!<=))+++E#>?&&--33555 ' @ * 	6
 , 6s3   B#B=B#B>B#B!	B#B#!B#deltac                   K   t        |j                        rE|j                  9| j                  j                  s#t	        d| j
                  j                   d      t        |t              rZt        |j                        rE|j                  9| j                  j                  s#t	        d| j
                  j                   d      t        | 1  |       d{   }ddh}|j                         |z  r0| j                          d{    | j                          d{    |j!                         D ci c]  \  }}||vs|| }}}|r| j#                  |       |S 7 7 [7 Ec c}}w w)aV  Apply a settings delta, validate, sync state, and reconnect.

        Args:
            delta: A :class:`STTSettings` (or ``SarvamSTTSettings``) delta.

        Returns:
            Dict mapping changed field names to their previous values.

        Raises:
            ValueError: If a setting is not supported by the current model.
        Nr   r   r   r&   rc   )r   r&   r   rK   r   rj   ru   r   r]   rc   rI   r   _update_settingsr   _disconnect_connectitems _warn_unhandled_updated_settings)r   r   changedreconnect_fieldskv	unhandledr   s          rC   r   z!SarvamSTTService._update_settingsu  sK     ENN#(B<<11 dnn223 4/ / 
 u/0&(<<// dnn2233WX  077 '1<<>,,""$$$--/!!&-mmoSdaBR9RQTS	S11)< 8
 %!SsN   CE/E#.E/	E%
E/!E'"E/9E)E)E/%E/'E/)E/rc   c                 :  K   ddl }|j                         5  |j                  d       |j                  | j                  j
                   dt        d       ddd       | j                  j                  s&|#t        d| j                  j                   d      yt        j                  d	| j                  j                   d
       || j                  _        | j                          d{    | j!                          d{    y# 1 sw Y   xY w7 )7 w)a  Set the transcription/translation prompt and reconnect.

        .. deprecated:: 0.0.104
            Use ``STTUpdateSettingsFrame(SarvamSTTSettings(prompt=...))`` instead.

        Args:
            prompt: Prompt text to guide transcription/translation style/context.
                   Pass None to clear/disable prompt.
                   Only applicable to models that support prompts.
        r   Nalwaysz_.set_prompt() is deprecated. Use STTUpdateSettingsFrame(SarvamSTTSettings(prompt=...)) instead.   )
stacklevelr   r   z	Updating z prompt.)warningscatch_warningssimplefilterwarnr   rP   DeprecationWarningr   rI   r   rj   ru   r
   r   rc   r   r   )r   rc   r   s      rC   
set_promptzSarvamSTTService.set_prompt  s     	$$& 	!!(+MM>>**+ ,U U"	  	 ||++! dnn2233WX  i 4 45X>? &   mmo)	 	& 	!s<   DADBD-D.DDDDDDc                 t   K   t         |   |       d{    | j                          d{    y7 7 w)z~Start the Sarvam STT service.

        Args:
            frame: The start frame containing initialization parameters.
        N)r   startr   r   r   r   s     rC   r   zSarvamSTTService.start  s3      gmE"""mmo 	#   848688c                 t   K   t         |   |       d{    | j                          d{    y7 7 w)zVStop the Sarvam STT service.

        Args:
            frame: The end frame.
        N)r   stopr   r   s     rC   r   zSarvamSTTService.stop  s6      gl5!!!    	" r   c                 t   K   t         |   |       d{    | j                          d{    y7 7 w)z[Cancel the Sarvam STT service.

        Args:
            frame: The cancel frame.
        N)r   cancelr   r   s     rC   r   zSarvamSTTService.cancel  s6      gnU###    	$ r   audioc                (  K   | j                   sd y	 t        j                  |      j                  d      }| j                  j                  d      r| j                  nd| j                   }||| j                  d}| j                  j                  r% | j                   j                  di | d{    n$ | j                   j                  di | d{    d y7 /7 # t        $ r}t        d| |       Y d}~+d}~ww xY ww)zSend audio data to Sarvam for transcription.

        Args:
            audio: Raw audio bytes to transcribe.

        Yields:
            Frame: None (transcription results come via WebSocket callbacks).
        Nutf-8audio/r   encodingrv   zError sending audio to Sarvam: )error	exceptionrW   )r   base64	b64encodedecoder   
startswithrv   r   rO   rn   rY   	Exceptionr   )r   r   audio_base64r   method_kwargses         rC   run_sttzSarvamSTTService.run_stt  s     ""J	W!++E299'BL
 **55h? ''d5567  &$#//M ||003d))33DmDDD4d))44E}EEE
 
 EE 	W%DQC#HTUVVV	WsS   DBC) 5C%6$C) C'C) D%C) 'C) )	D2D
D
DDc                    K   t        j                  d       	  j                  j                  t	         j
                        d} j                  j                  sd|d<    j                  j                   j                  j                  rdnd|d<    j                  j                   j                  j                  rdnd|d<    j                         }|||d	<    j                  j                  r j                   j                  |d
<    j                  j                  / j                  j                  r j                  j                  |d<    fd} j                  j                  r- | j                  j                   j"                  fi | _        n, | j                  j&                  j"                  fi | _         j$                  j)                          d{    _         j                  j                  \ j                  j                  rFt-         j*                  dd      }t/        |      r$ | j                  j                         d{     fd} j*                  j1                  t2        j4                  |        j7                   j9                                _         j=                          t        j>                  d       y7 7 # t@        $ r7}d _        d _         jC                  d| |       d{  7   Y d}~yd}~wtD        $ r7}d _        d _         jC                  d| |       d{  7   Y d}~yd}~ww xY ww)z.Connect to Sarvam WebSocket API using the SDK.zConnecting to Sarvam)ru   rv   trueflush_signalNfalsere   rg   language_coderr   rc   c                 h   d	j                   i}|g}d|v r9|j                  |j                         D ci c]  \  }}|dk7  s|| c}}       d }|D ]  }	  | di |d|ic S  || | di |S c c}}w # t        $ r}|}Y d }~nd }~ww xY w	  | di |c S # t        $ r}|}Y d }~Xd }~ww xY w)Nadditional_headersrc   request_optionsrW   )r   appendr   	TypeError)

connect_fnr   r   attemptsr   r   last_type_errorattempt_kwargsr   r   s
            rC   _connect_with_sdk_headersz<SarvamSTTService._connect.<locals>._connect_with_sdk_headers.  s     $89J9J"K"8v%OOflln$VdaXQT$VW"&&. ,N,)  , ,;  , #.))!+F++' %W % ,*+,,);N;;$ ,*+,s;   A3
A3
A99	BB		BB	B1%B,,B1r   c                 F    j                  j                  |              y)z)Wrapper to handle async response handler.N)create_task_handle_message)messager   s    rC   _message_handlerz3SarvamSTTService._connect.<locals>._message_handlera  s       !5!5g!>?rE   z Connected to Sarvam successfullyzSarvam API error: 	error_msgr   zFailed to connect to Sarvam: )#r
   debugrj   ru   rV   rv   re   rg   r   r   rJ   r   rc   rI   rN   r   "speech_to_text_translate_streamingconnectr   speech_to_text_streaming
__aenter__r   getattrcallableonr%   MESSAGEr   _receive_task_handlerr   _create_keepalive_taskr   r$   
push_errorr   )r   connect_kwargslanguage_stringr   prompt_setterr   r   s   `      rC   r   zSarvamSTTService._connect  s    +,j	^ --"4#3#34N >>--17~. ~~))5:>..:T:TZa}-~~22>"nnAAFw 56
 #779O*2A/ ||))djj.D)-v& ~~$$0T\\5Q5Q+/>>+@+@x(,< ||22*C''JJRR+$+'
 +D''@@HH+$+' )-(?(?(J(J(L"LD ~~$$0T\\5Q5Q '(;(;\4 PM*'(=(=>>>@
 ""9#4#46FG "&!1!1$2L2L2N!OD'')KK:;+ #M ?"  	S"&D&*D#//.@,DPQ/RRR 	^"&D&*D#//.KA3,O[\/]]]	^s   MGK %K&A6K KA<K MK K 	M''LLLMM%'MMMMMMc                   K   | j                          d{    | j                  r*| j                  | j                         d{    d| _        | j                  }| j                  }d| _        d| _        |r5|r2	 |j                  ddd       d{    t        j                  d       yyy7 7 k7  # t        $ r)}| j                  d| |       d{  7   Y d}~Kd}~ww xY w# t        j                  d       w xY ww)z/Disconnect from Sarvam WebSocket API using SDK.Nz$Error closing WebSocket connection: r   z"Disconnected from Sarvam WebSocket)
_cancel_keepalive_taskr   cancel_taskr   r   	__aexit__r   r   r
   r   )r   socket_clientwebsocket_contextr   s       rC   r   zSarvamSTTService._disconnectx  s     ))+++""4#5#5666!%D ++ 33""&C'11$dCCC AB "/ 	, 7 D oo DQCHTU &   
 ABsu   DB/.DB15D<B5 B3B5 D1D3B5 5	C'>C"CC"C* "C''C* *DDc                    K   | j                   sy	 | j                   j                          d{    y7 # t        $ r)}| j                  d| |       d{  7   Y d}~yd}~ww xY ww)zHandle incoming messages from Sarvam WebSocket.

        This task wraps the SDK's start_listening() method which processes
        messages via the registered event handler callback.
        NzSarvam receive task error: r   )r   start_listeningr   r   )r   r   s     rC   r   z&SarvamSTTService._receive_task_handler  sd      ""	\ %%55777 	\//.I!,MYZ/[[[	\sB   A+6 46 A+6 	A(A#AA#A+#A((A+c                   K   t        j                  d|        	 |j                  dk(  r|j                  j                  }|j                  j
                  }t        j                  d| d|        |dk(  r|| j                          d{    t        j                  d       | j                  d       d{    | j                  t               d{    | j                          d{    y|d	k(  rt        j                  d
       | j                  d       d{    | j                  t               d{    y|j                  dk(  r1|j                  j                  }|j                  j                  }|r| j                  |      }n4| j                         }|r| j                  |      }nt         j"                  }| j                  d       d{    |r|j%                         ry| j'                  |d|       d{    | j)                  t+        || j,                  t/               |t1        |d      r|j3                         n
t5        |                   d{    | j7                          d{    yyy7 7 7 7 7 r7 X7 7 7 57 # t8        $ rB}| j;                  d| |       d{  7   | j=                          d{  7   Y d}~yd}~ww xY ww)zHandle incoming WebSocket message from Sarvam SDK.

        Processes transcription data and VAD events from the Sarvam service.

        Args:
            message: The parsed response object from Sarvam WebSocket.
        zReceived response: eventszVAD Signal: z, Occurred at: START_SPEECHNzUser started speakingr   
END_SPEECHzUser stopped speakingr   datar   Tdict)resultzFailed to handle message: r   )r
   r   typer  signal_type
occured_atr   _call_event_handlerbroadcast_framer   broadcast_interruptionr   
transcriptr   _map_language_code_to_enumr   r   r8   strip_handle_transcription
push_framer   _user_idr!   hasattrr  rV   stop_processing_metricsr   r   stop_all_metrics)	r   r   signal	timestampr  r   r&   r   r   s	            rC   r   z SarvamSTTService._handle_message  s     	*7)454	*||x' 11#LL33	|F8?9+NO^+--///LL!89223FGGG../GHHH55777|+LL!89223FGGG../GHHH'$\\44
 ' : : #>>}MH&*&?&?&AO&#'#B#B?#S#+>> ../ABBB*"2"2"444ZxPPP//*& MM,.$6=gv6NGLLNTWX_T`   22444; ( , 0GH7 HH  C Q 5 	*//.H,LXY/ZZZ'')))	*s  K1A/J# J	-J# 9J:J# JJ# .J/J# 3K14/J# #J$J#  JJ# K1BJ# J,J# JAJ# )J*J# J!J# K1	J# J# J# J# J# J# J# J# J# !J# #	K.,K)KK)K!K)$K1)K..K1r  is_finalc                    K   yw)zzHandle a transcription result with tracing.

        This method is decorated with @traced_stt for observability.
        NrW   )r   r  r"  r&   s       rC   r  z&SarvamSTTService._handle_transcription  s      	s   r   c                    t         j                  t         j                  t         j                  t         j                  t         j
                  t         j                  t         j                  t         j                  t         j                  t         j                  t         j                  t         j                  t         j                  d}|j                  |t         j                        S )z2Map Sarvam language code to pipecat Language enum.)r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   zen-USr3   r4   )r   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   EN_USr@   rA   get)r   r   mappings      rC   r  z+SarvamSTTService._map_language_code_to_enum  s}     ^^^^^^^^^^^^^^^^^^^^^^^^^^
 {{=(..99rE   c                     | j                   duS )z6Check if the Sarvam SDK websocket client is connected.N)r   r   s    rC   _is_keepalive_readyz$SarvamSTTService._is_keepalive_ready  s    ""$..rE   silencec                   K   t        j                  |      j                  d      }| j                  j	                  d      r| j                  nd| j                   }||| j
                  d}| j                  j                  r% | j                  j                  di | d{    y | j                  j                  di | d{    y7 *7 w)zSend silent audio via the Sarvam SDK to keep the connection alive.

        Args:
            silence: Silent 16-bit mono PCM audio bytes.
        r   r   r   NrW   )r   r   r   r   r   rv   r   rO   r   rn   rY   )r   r*  r   r   r   s        rC   _send_keepalivez SarvamSTTService._send_keepalive  s      ''077@ &&11(; ##$1123 	 " ++

 <<,,/$%%//@-@@@0$%%00A=AAA AAs$   B C"C#$CCCCc                 @   K   | j                          d{    y7 w)z$Start processing metrics collection.N)start_processing_metricsr   s    rC   r   zSarvamSTTService._start_metrics  s     ++---s   r_   )1rP   rQ   rR   rS   r]   SettingsrU   r   rs   r   rV   r	   r   intfloatr   r   r   r   rT   r   r   r   r   r   r  r   r   r   r   r   r   r   r   r   bytesr   r   r   r   r   r   r"   r  r  r)  r,  r   __classcell__)r   s   @rC   ri   ri      s   " !H  4i 4:  $ %)!&(,04,;-1$'@U @U }	@U
 PQ
@U c]@U @U %@U ,-@U #5/@U $E?@U "@UD	5X 	5# 	5-hsm -d 6 6> 6 )K )DcN )V!x} !F ! !!+ !(5 (^E4K-H (Tn^`C2\ >*@ NR)-9A(9K : : :&/T /BU B,.rE   ri   )@rS   r   dataclassesr   r   typingr   r   r   r   r	   logurur
   pydanticr   pipecat.frames.framesr   r   r   r   r   r   r   r   r   r   "pipecat.processors.frame_processorr   pipecat.services.sarvam._sdkr   pipecat.services.settingsr   r   r   r   r   pipecat.services.stt_latencyr   pipecat.services.stt_servicer   pipecat.transcriptions.languager   r    pipecat.utils.timer!   (pipecat.utils.tracing.service_decoratorsr"   sarvamair#   sarvamai.core.api_errorr$   sarvamai.core.eventsr%   ModuleNotFoundErrorr   r   r   rV   rD   rH   r[   rU   r]   ri   rW   rE   rC   <module>rE     s}    ( ? ?     > 4  9 3 F / ?,&0.I( Is I8 $  .  "$" #! "!$"')tC$% > ] ] ]~	.z ~	.Q  ,FLL;qc"#FLLXY
&qc*
++,s   =D   D<2D77D<