o
    i                  
   @   s  d Z ddlZddlZddlZddlZddlZddlmZmZ ddl	m
Z
 dejd< ddlmZmZmZmZmZ ddlmZ dd	lmZmZmZ dd
lmZmZmZmZmZmZ ddl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+ z,ddl,m-Z- ddl.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5 ddl6m7Z7 ddl8m9Z9 W n  e:y Z; ze<de;  e<d e=de; dZ;[;ww de(dee> fddZ?eG dd de!Z@G d d! d!e&ZAdS )"a   Google Cloud Speech-to-Text V2 service implementation for Pipecat.

This module provides a Google Cloud Speech-to-Text V2 service with streaming
support, enabling real-time speech recognition with features like automatic
punctuation, voice activity detection, and multi-language support.
    N)	dataclassfield)
traced_sttfalseGRPC_ENABLE_FORK_SUPPORT)AnyAsyncGeneratorListOptionalUnion)logger)	BaseModelFieldfield_validator)CancelFrameEndFrameFrameInterimTranscriptionFrame
StartFrameTranscriptionFrame)	NOT_GIVENSTTSettings	_NotGiven)GOOGLE_TTFS_P99)
STTService)Languageresolve_language)time_now_iso8601)ClientOptions)Aborted)default)GoogleAuthError)	speech_v2)cloud_speech)service_accountzException: zIn order to use Google AI, you need to `pip install pipecat-ai[google]`. Also, set `GOOGLE_APPLICATION_CREDENTIALS` environment variable.zMissing module: languagereturnc                 C   s  i 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t jd	t jd
t jdt jdt jdi 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t jdt jdt j dt j!dt j"di 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 t j/d t j0d!t j1d!t j2d"t j3d"i t j4d#t j5d$t j6d#t j7d%t j8d&t j9d't j:d(t j;d)t j<d*t j=d+t j>d,t j?d-t j@d.t jAd/t jBd0t jCd1t jDd2i t jEd%t jFd3t jGd4t jHd4t jId5t jJd5t jKd6t jLd6t jMd7t jNd8t jOd9t jPd:t jQd7t jRd;t jSd;t jTd<t jUd<i t jVd=t jWd>t jXd?t jYd=t jZd@t j[d@t j\dAt j]dAt j^dBt j_dBt j`dCt jadCt jbdDt jcdDt jddEt jedEt jfdFi t jgdFt jhdGt jidGt jjdHt jkdIt jldIt jmdJt jndJt jodKt jpdKt jqdLt jrdLt jsdMt jtdMt judNt jvdNt jwdOi t jxdOt jydPt jzdPt j{dQt j|dQt j}dRt j~dRt jdSt jdSt jdTt jdTt jdUt jdUt jdVt jdVt jdWt jdWi t jdXt jdXt jdXt jdYt jdYt jdZt jdZt jd[t jd\t jd[t jd]t jd]t jd^t jd^t jd_t jd_t jd`i t jd`t jdat jdat jdbt jdbt jdct jdct jddt jdet jdft jdgt jdht jdit jdjt jdkt jddt jdli t jdmt jdnt jdot jdpt jdqt jdrt jdst jdtt jdut jdvt jdwt jdxt jdxt jdyt jdzt jdyt jd{i t jd{t jd|t jd|t jd}t jd~t jdt jdt jdt jdt jdt jdt jdt jdt jdt jdt jdt jdt jdt jdt jdt jdt jdt jdt jdi}t| |ddS )zMaps Language enum to Google Speech-to-Text V2 language codes.

    Args:
        language: Language enum value.

    Returns:
        Optional[str]: Google STT language code or None if not supported.
    zaf-ZAzsq-ALzam-ETzar-EGzar-AEzar-BHzar-DZzar-IQzar-JOzar-KWzar-LBzar-MAzar-OMzar-QAzar-SAzar-SYzar-TNzar-YEzhy-AMzaz-AZzeu-ESzbn-INzbn-BDzbs-BAzbg-BGzmy-MMzca-ESzcmn-Hans-CNzcmn-Hans-HKzcmn-Hant-TWzyue-Hant-HKzhr-HRzcs-CZzda-DKznl-NLznl-BEen-USzen-AUzen-CAzen-GBzen-GHzen-HKzen-INzen-IEzen-KEzen-NGzen-NZzen-PHzen-SGzen-TZzen-ZAzet-EEzfil-PHzfi-FIzfr-FRzfr-BEzfr-CAzfr-CHzgl-ESzka-GEzde-DEzde-ATzde-CHzel-GRzgu-INziw-ILzhi-INzhu-HUzis-ISzid-IDzit-ITzit-CHzja-JPzjv-IDzkn-INzkk-KZzkm-KHzko-KRzlo-LAzlv-LVzlt-LTzmk-MKzms-MYzml-INzmr-INzmn-MNzne-NPzno-NOzfa-IRzpl-PLzpt-PTzpt-BRz
pa-Guru-INzro-ROzru-RUzsr-RSzsi-LKzsk-SKzsl-SIzes-ESzes-ARzes-BOzes-CLzes-COzes-CRzes-DOzes-ECzes-GTzes-HNzes-MXzes-NIzes-PAzes-PEzes-PRzes-PYzes-SVzes-USzes-UYzes-VEzsu-IDzsw-TZzsw-KEzsv-SEzta-INzta-MYzta-SGzta-LKzte-INzth-THztr-TRzuk-UAzur-INzur-PKzuz-UZzvi-VNzxh-ZAzzu-ZAF)use_base_code)r   AFAF_ZASQSQ_ALAMAM_ETARAR_AEAR_BHAR_DZAR_EGAR_IQAR_JOAR_KWAR_LBAR_MAAR_OMAR_QAAR_SAAR_SYAR_TNAR_YEHYHY_AMAZAZ_AZEUEU_ESBNBN_BDBN_INBSBS_BABGBG_BGMYMY_MMCACA_ESZHZH_CNZH_HKZH_TWYUEYUE_CNHRHR_HRCSCS_CZDADA_DKNLNL_BENL_NLENEN_AUEN_CAEN_GBEN_GHEN_HKEN_INEN_IEEN_KEEN_NGEN_NZEN_PHEN_SGEN_TZEN_USEN_ZAETET_EEFILFIL_PHFIFI_FIFRFR_BEFR_CAFR_CHFR_FRGLGL_ESKAKA_GEDEDE_ATDE_CHDE_DEELEL_GRGUGU_INHEHE_ILHIHI_INHUHU_HUISIS_ISIDID_IDITIT_ITIT_CHJAJA_JPJVJV_IDKNKN_INKKKK_KZKMKM_KHKOKO_KRLOLO_LALVLV_LVLTLT_LTMKMK_MKMSMS_MYMLML_INMRMR_INMNMN_MNNENE_NPNONBNB_NOFAFA_IRPLPL_PLPTPT_BRPT_PTPAPA_INRORO_RORURU_RUSRSR_RSSISI_LKSKSK_SKSLSL_SIESES_ARES_BOES_CLES_COES_CRES_DOES_ECES_ESES_GTES_HNES_MXES_NIES_PAES_PEES_PRES_PYES_SVES_USES_UYES_VESUSU_IDSWSW_KESW_TZSVSV_SETATA_INTA_MYTA_SGTA_LKTETE_INTHTH_THTRTR_TRUKUK_UAURUR_INUR_PKUZUZ_UZVIVI_VNXHZUZU_ZAr   )r%   LANGUAGE_MAP r   O/home/ubuntu/.local/lib/python3.10/site-packages/pipecat/services/google/stt.pylanguage_to_google_stt_language>   s4  		 "#%&')*,-/02356789:<=?@BCEFGIJKLMNOPQRSTUVWXZ[]^`acdefgijlmopqrtuwxz{}~             
                                 !  #  $  &  '  )  *  ,  -  /  0  2  3  5  6  8  9  ;  <  =  ?  @  B  C  E  F  G  I  J  L  M  O  P  R  S  U  V  X  Y  [  \  ^  _  `  a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  t  u  w  x  y  {  |  ~                             	                                    !r   c                   @   s8  e Zd ZU dZedd dZee eB e	d< edd dZ
ee eB e	d< edd dZeeB e	d	< ed
d dZeeB e	d< edd dZeeB e	d< edd dZeeB e	d< edd dZeeB e	d< edd dZeeB e	d< edd dZeeB e	d< edd dZeeB e	d< edd dZeeB e	d< dS )GoogleSTTSettingsa  Settings for GoogleSTTService.

    Parameters:
        languages: List of ``Language`` enums for recognition
            (e.g. ``[Language.EN_US]``). Preferred over ``language_codes``.
        language_codes: List of Google STT language code strings
            (e.g. ``["en-US"]``).

            .. deprecated:: 0.0.104
                Use ``languages`` instead. If both are provided, ``languages``
                takes precedence. This field is here just for backward
                compatibility with dict-based settings updates.
        use_separate_recognition_per_channel: Process each audio channel separately.
        enable_automatic_punctuation: Add punctuation to transcripts.
        enable_spoken_punctuation: Include spoken punctuation in transcript.
        enable_spoken_emojis: Include spoken emojis in transcript.
        profanity_filter: Filter profanity from transcript.
        enable_word_time_offsets: Include timing information for each word.
        enable_word_confidence: Include confidence scores for each word.
        enable_interim_results: Stream partial recognition results.
        enable_voice_activity_events: Detect voice activity in audio.
    c                   C      t S Nr   r   r   r   r   <lambda>      zGoogleSTTSettings.<lambda>default_factory	languagesc                   C   r  r  r  r   r   r   r   r    r  language_codesc                   C   r  r  r  r   r   r   r   r    r  $use_separate_recognition_per_channelc                   C   r  r  r  r   r   r   r   r    r  enable_automatic_punctuationc                   C   r  r  r  r   r   r   r   r    r  enable_spoken_punctuationc                   C   r  r  r  r   r   r   r   r    r  enable_spoken_emojisc                   C   r  r  r  r   r   r   r   r    r  profanity_filterc                   C   r  r  r  r   r   r   r   r    r  enable_word_time_offsetsc                   C   r  r  r  r   r   r   r   r    r  enable_word_confidencec                   C   r  r  r  r   r   r   r   r    r  enable_interim_resultsc                   C   r  r  r  r   r   r   r   r    r  enable_voice_activity_eventsN)__name__
__module____qualname____doc__r   r  r	   r   r   __annotations__r	  strr
  boolr  r  r  r  r  r  r  r  r   r   r   r   r   i  s   
 r   c                       s"  e Zd ZU dZeZeed< dZG dd deZ	dddddde
dd	ee d
ee dedee dee	 dee dee f fddZdefddZdeee B deee B fddZdee fddZdd Zdee fddZdedeeef f fd d!Zd"ef fd#d$Zd"ef fd%d&Zd"ef fd'd(Z dddddddddddd)deee  d*ee d+ee d,ee d-ee d.ee d/ee d0ee d1ee d2ee dee ddfd3d4Z!d5d6 Z"d7d8 Z#d9d: Z$d;d< Z%d=e&de'e(df fd>d?Z)e*	dFd@edAedee fdBdCZ+dDdE Z,  Z-S )GGoogleSTTServicea  Google Cloud Speech-to-Text V2 service implementation.

    Provides real-time speech recognition using Google Cloud's Speech-to-Text V2 API
    with streaming support. Handles audio transcription and optional voice activity detection.
    Implements automatic stream reconnection to handle Google's 4-minute streaming limit.

    Parameters:
        InputParams: Configuration parameters for the STT service.
        STREAMING_LIMIT: Google Cloud's streaming limit in milliseconds (4 minutes).

    Raises:
        ValueError: If neither credentials nor credentials_path is provided.
        ValueError: If project ID is not found in credentials.
    	_settingsi c                   @   s  e Zd ZU dZedd dZeeee f e	d< dZ
ee e	d< dZee e	d	< d
Zee e	d< dZee e	d< dZee e	d< dZee e	d< dZee e	d< dZee e	d< d
Zee e	d< dZee e	d< edddedee fddZedee fddZdS )zGoogleSTTService.InputParamsa  Configuration parameters for Google Speech-to-Text.

        .. deprecated:: 0.0.105
            Use ``settings=GoogleSTTService.Settings(...)`` instead.

        Parameters:
            languages: Single language or list of recognition languages. First language is primary.
            model: Speech recognition model to use.
            use_separate_recognition_per_channel: Process each audio channel separately.
            enable_automatic_punctuation: Add punctuation to transcripts.
            enable_spoken_punctuation: Include spoken punctuation in transcript.
            enable_spoken_emojis: Include spoken emojis in transcript.
            profanity_filter: Filter profanity from transcript.
            enable_word_time_offsets: Include timing information for each word.
            enable_word_confidence: Include confidence scores for each word.
            enable_interim_results: Stream partial recognition results.
            enable_voice_activity_events: Detect voice activity in audio.
        c                   C   s   t jgS r  )r   rm   r   r   r   r   r    s    z%GoogleSTTService.InputParams.<lambda>r  r  latest_longmodelFr
  Tr  r  r  r  r  r  r  r  before)moder&   c                 C   s   t |tr|gS |S )zEnsure languages is always a list.

            Args:
                v: Single Language enum or list of Language enums.

            Returns:
                List[Language]: List of configured languages.
            )
isinstancer   )clsvr   r   r   validate_languages  s   
z/GoogleSTTService.InputParams.validate_languagesc                 C   s   t | jtsJ | jS )zGet languages as a guaranteed list.

            Returns:
                List[Language]: List of configured languages.
            )r   r  listselfr   r   r   language_list  s   z*GoogleSTTService.InputParams.language_listN)r  r  r  r  r   r  r   r   r	   r  r  r
   r  r
  r  r  r  r  r  r  r  r  r  r   classmethodr#  propertyr'  r   r   r   r   InputParams  s$   
 "
r*  Nglobal)credentialscredentials_pathlocationsample_rateparamssettingsttfs_p99_latencyr,  r-  r.  r/  r0  r1  r2  c                   s  | j dtjgdddddddddddd}	|durM| d |sMt|j|	_|j|	_|j|	_|j	|	_	|j
|	_
|j|	_|j|	_|j|	_|j|	_|j|	_|j|	_|durV|	| t jd|||	d| || _d| _d| _d| _d| _g | _g | _d| _d| _d| _d| _d| _d| _ d| _!d}
| jd	krt"| j d
d}
d}|rt#$|}|%d| _&t'j()|}n?|rt*|}t#+|}|%d| _&W d   n1 sw   Y  t'j(,|}nzt-dgd\}}|| _&W n	 t.y   Y nw |st/d| j&st/dt0j1||
d| _2dS )a  Initialize the Google STT service.

        Args:
            credentials: JSON string containing Google Cloud service account credentials.
            credentials_path: Path to service account credentials JSON file.
            location: Google Cloud location (e.g., "global", "us-central1").
            sample_rate: Audio sample rate in Hertz.
            params: Configuration parameters for the service.

                .. deprecated:: 0.0.105
                    Use ``settings=GoogleSTTService.Settings(...)`` instead.

            settings: Runtime-updatable settings. When provided alongside deprecated
                ``params``, ``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
            **kwargs: Additional arguments passed to STTService.
        Nr  FT)r%   r  r	  r  r
  r  r  r  r  r  r  r  r  r0  )r/  r2  r1  r   r+  z-speech.googleapis.com)api_endpoint
project_idz.https://www.googleapis.com/auth/cloud-platform)scopeszNo valid credentials provided.z#Project ID not found in credentials)r,  client_optionsr   )3Settingsr   rm   "_warn_init_param_moved_to_settingsr$  r'  r  r  r
  r  r  r  r  r  r  r  r  apply_updatesuper__init__	_location_stream_config_streaming_task_stream_start_time_last_audio_input_audio_input_result_end_time_is_final_end_time_final_request_end_time_bridging_offset_last_transcript_was_final_new_stream_restart_counterr   jsonloadsget_project_idr$   Credentialsfrom_service_account_infoopenloadfrom_service_account_filer    r!   
ValueErrorr"   SpeechAsyncClient_client)r&  r,  r-  r.  r/  r0  r1  r2  kwargsdefault_settingsr6  credsjson_account_infofr4  	__class__r   r   r;    s   







zGoogleSTTService.__init__r&   c                 C   s   dS )zCheck if the service can generate metrics.

        Returns:
            bool: True, as this service supports metrics generation.
        Tr   r%  r   r   r   can_generate_metricsc  s   z%GoogleSTTService.can_generate_metricsr%   c                 C   s$   t |trdd |D S t|pdS )zConvert Language enum(s) to Google STT language code(s).

        Args:
            language: Single Language enum or list of Language enums.

        Returns:
            str | List[str]: Google STT language code(s).
        c                 S   s   g | ]}t |p	d qS )r'   )r   .0langr   r   r   
<listcomp>u  s    zAGoogleSTTService.language_to_service_language.<locals>.<listcomp>r'   )r   r$  r   )r&  r%   r   r   r   language_to_service_languagek  s   
	z-GoogleSTTService.language_to_service_languagec                    s8    j jr fdd j jD S  j jrt j jS dgS )a-  Resolve the current language settings to Google STT language code strings.

        Prefers ``languages`` (``Language`` enums) over the deprecated
        ``language_codes`` (raw strings). Falls back to ``["en-US"]``.

        Returns:
            List[str]: Google STT language code strings.
        c                    s   g | ]}  |qS r   )rb  r^  r%  r   r   ra    s    z8GoogleSTTService._get_language_codes.<locals>.<listcomp>r'   )r  r  r	  r$  r%  r   r%  r   _get_language_codesx  s
   	z$GoogleSTTService._get_language_codesc                    s6   | j rtd |  I dH  |  I dH  dS dS )z.Reconnect the stream if it's currently active.z0Reconnecting stream due to configuration changesN)r?  r   debug_disconnect_connectr%  r   r   r   _reconnect_if_needed  s   
z%GoogleSTTService._reconnect_if_neededr  c                    sp   t   t d t dt W d   n1 sw   Y  td|  | | jt	|dI dH  dS )a+  Update the service's recognition languages.

        .. deprecated:: 0.0.104
            Use ``STTUpdateSettingsFrame`` with ``GoogleSTTService.Settings(languages=...)``
            instead.

        Args:
            languages: List of languages for recognition. First language is primary.
        alwayszdset_languages() is deprecated. Use STTUpdateSettingsFrame with self.Settings(languages=...) instead.NzSwitching STT languages to: )r  )
warningscatch_warningssimplefilterwarnDeprecationWarningr   rd  _update_settingsr7  r$  )r&  r  r   r   r   set_languages  s   


 zGoogleSTTService.set_languagesdeltac                    s   ddl m} ||jr|jg|_t|_||jr:t  td tj	dt
dd W d   n1 s5w   Y  t |I dH }|rL|  I dH  |S )a  Apply settings delta and reconnect if anything changed.

        Handles ``language`` from base ``set_language`` by converting it to
        ``languages``. Emits a deprecation warning if ``language_codes`` is
        used. All other fields (model, boolean flags) are applied directly.
        Reconnects the stream on any change.

        Args:
            delta: A settings delta.

        Returns:
            Dict mapping changed field names to their previous values.
        r   )is_givenrh  zaself.Settings.language_codes is deprecated. Use self.Settings.languages (List[Language]) instead.   )
stacklevelN)pipecat.services.settingsrq  r%   r  r   r	  ri  rj  rk  rl  rm  r:  rn  rg  )r&  rp  rq  changedr[  r   r   rn    s$   




	z!GoogleSTTService._update_settingsframec                    &   t  |I dH  |  I dH  dS )zStart the STT service and establish connection.

        Args:
            frame: The start frame triggering the service start.
        N)r:  startrf  r&  rv  r[  r   r   rx       zGoogleSTTService.startc                    rw  )zStop the STT service and clean up resources.

        Args:
            frame: The end frame triggering the service stop.
        N)r:  stopre  ry  r[  r   r   r{    rz  zGoogleSTTService.stopc                    rw  )zCancel the STT service and clean up resources.

        Args:
            frame: The cancel frame triggering the service cancellation.
        N)r:  cancelre  ry  r[  r   r   r|    rz  zGoogleSTTService.cancel)r  r  r  r  r  r  r  r  r  r  r.  r  r  r  r  r  r  r  r  r  c                   s
  t   t d t dt W d   n1 sw   Y  |  }|dur-t||_|dur4||_|dur;||_	|durB||_
|durI||_|durP||_|durW||_|dur^||_|	dure|	|_|
durl|
|_|dur{td|  || _| |I dH  dS )a  Update service options dynamically.

        .. deprecated::
            Use ``STTUpdateSettingsFrame`` with ``GoogleSTTService.Settings(...)``
            instead.

        Args:
            languages: New list of recognition languages.
            model: New recognition model.
            enable_automatic_punctuation: Enable/disable automatic punctuation.
            enable_spoken_punctuation: Enable/disable spoken punctuation.
            enable_spoken_emojis: Enable/disable spoken emojis.
            profanity_filter: Enable/disable profanity filter.
            enable_word_time_offsets: Enable/disable word timing info.
            enable_word_confidence: Enable/disable word confidence scores.
            enable_interim_results: Enable/disable interim results.
            enable_voice_activity_events: Enable/disable voice activity detection.
            location: New Google Cloud location.

        Note:
            Changes that affect the streaming configuration will cause
            the stream to be reconnected.
        rh  z[update_options() is deprecated. Use STTUpdateSettingsFrame with self.Settings(...) instead.NzUpdating location to: )ri  rj  rk  rl  rm  r7  r$  r  r  r  r  r  r  r  r  r  r  r   rd  r<  rn  )r&  r  r  r  r  r  r  r  r  r  r  r.  rp  r   r   r   update_options  sB   
&

zGoogleSTTService.update_optionsc                    s   t d tt d | _d| _tjtjtj	tj	j
j| jdd|  | jjtj| jj| jj| jj| jj| jj| jjddtj| jj| jjdd	| _t | _| |  | _ | !d
I dH  dS )z3Initialize streaming recognition config and stream.z#Connecting to Google Speech-to-Text  T   )encodingsample_rate_hertzaudio_channel_count)r  r  r  r  r  r  )explicit_decoding_configr	  r  features)r  interim_results)configstreaming_featureson_connectedN)"r   rd  inttimer@  rH  r#   StreamingRecognitionConfigRecognitionConfigExplicitDecodingConfigAudioEncodingLINEAR16r/  rc  r  r  RecognitionFeaturesr  r  r  r  r  r  StreamingRecognitionFeaturesr  r  r>  asyncioQueue_request_queuecreate_task_stream_audior?  _call_event_handlerr%  r   r   r   rf  0  s<   

zGoogleSTTService._connectc                    s>   | j rtd | | j I dH  d| _ | dI dH  dS )z)Clean up streaming recognition resources.z(Disconnecting from Google Speech-to-TextNon_disconnected)r?  r   rd  cancel_taskr  r%  r   r   r   re  U  s   
zGoogleSTTService._disconnectc              
   C  s  d| j  d| j d}td|  zRtj|| jdV  	 | j I dH }| j	  t
t d | j | jkrYtd	 | j| _g | _|  jd
7  _| j|I dH  W dS | j| tj|dV  q ty } z| jd| |dI dH   d}~ww )z6Generates requests for the streaming recognize method.z	projects/z/locations/z/recognizers/_zUsing recognizer path: )
recognizerstreaming_configTNr~  z9Streaming limit reached, initiating graceful reconnectionr  )audioUnknown error occurred: 	error_msg	exception)rM  r<  r   tracer#   StreamingRecognizeRequestr>  r  rL  	task_doner  r  r@  STREAMING_LIMITrd  rB  rA  rI  putappend	Exception
push_error)r&  recognizer_path
audio_dataer   r   r   _request_generator^  s4   

z#GoogleSTTService._request_generatorc              
      s6  zy	 zF| j  rtdI dH  W q| jj|  dI dH }| |I dH  tt		 d | j
 | jkrDtd tt		 d | _
nW W dS W n0 tyy } z$| jd| |dI dH  td	I dH  tt		 d | _
W Y d}~nd}~ww q ty } z| jd| |dI dH  W Y d}~dS d}~ww )
z0Handle bi-directional streaming with Google STT.Tg{Gz?N)requestsr~  z!Reconnecting stream after timeoutr  r  r  )r  emptyr  sleeprU  streaming_recognizer  _process_responsesr  r  r@  r  r   rd  r  r  )r&  r  r  r   r   r   r    s6   

(zGoogleSTTService._stream_audior  c                 C  s2   | j r|  I dH  | j|I dH  dV  dS )zProcess an audio chunk for STT transcription.

        Args:
            audio: Raw audio bytes to transcribe.

        Yields:
            Frame: None (actual transcription frames are pushed via internal processing).
        N)r?  start_processing_metricsr  r  )r&  r  r   r   r   run_stt  s
   	
zGoogleSTTService.run_stt
transcriptis_finalc                    s   d S r  r   )r&  r  r  r%   r   r   r   _handle_transcription  s   z&GoogleSTTService._handle_transcriptionc                    s^  z|2 zx3 dH W }t t d | j | jkr!td  W dS |js%q|jD ]S}|js.q(|jd j}|s7q(| 	 d }|j
rgd| _| t|| jt ||dI dH  |  I dH  | j|d|dI dH  q(d| _| t|| jt ||dI dH  q(q6 W dS  ty } z	t|  d	  d}~w ty } z| jd
| |dI dH   d}~ww )z(Process streaming recognition responses.Nr~  z-Stream timeout reached in response processingr   T)result)r  r%   FzQ Stream aborted due to inactivity (no audio input). Reconnecting automatically...r  r  )r  r  r@  r  r   rd  resultsalternativesr  rc  r  rG  
push_framer   _user_idr   stop_processing_metricsr  r   r   r  r  )r&  r  responser  r  primary_languager  r   r   r   r    sn   


	/z#GoogleSTTService._process_responsesr  ).r  r  r  r  r   r7  r  r  r   r*  r   r
   r  r  floatr;  r  r]  r   r	   rb  rc  rg  ro  dictr   rn  r   rx  r   r{  r   r|  r}  rf  re  r  r  bytesr   r   r  r   r  r  __classcell__r   r   r[  r   r    s   
 <	 "(		
	

K%	#$r  )Br  r  rJ  osr  ri  dataclassesr   r   (pipecat.utils.tracing.service_decoratorsr   environtypingr   r   r	   r
   r   logurur   pydanticr   r   r   pipecat.frames.framesr   r   r   r   r   r   rt  r   r   r   pipecat.services.stt_latencyr   pipecat.services.stt_servicer   pipecat.transcriptions.languager   r   pipecat.utils.timer   google.api_core.client_optionsr   google.api_core.exceptionsr   google.authr    google.auth.exceptionsr!   google.cloudr"   google.cloud.speech_v2.typesr#   google.oauth2r$   ModuleNotFoundErrorr  errorr  r  r   r   r  r   r   r   r   <module>   sP   
   -'