
    qih.                        d Z ddlZddlZddlmZ ddlmZmZ ddlZddl	m
Z
 ddlmZ ddlmZmZmZ ddl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edee   fdZ e G d de             Z! G d de      Z"y)zFal speech-to-text service implementation.

This module provides integration with Fal's Wizper API for speech-to-text
transcription using segmented audio processing.
    N)	dataclass)AsyncGeneratorOptional)logger)	BaseModel)
ErrorFrameFrameTranscriptionFrame)STTSettings_warn_deprecated_param)FAL_TTFS_P99)SegmentedSTTService)Languageresolve_language)time_now_iso8601)
traced_sttlanguagereturnc                     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         j0                  dt         j2                  dt         j4                  dt         j6                  dt         j8                  dt         j:                  dt         j<                  dt         j>                  dt         j@                  d t         jB                  d!t         jD                  d"i t         jF                  d#t         jH                  d$t         jJ                  d%t         jL                  d&t         jN                  d't         jP                  d(t         jR                  d)t         jT                  d*t         jV                  d+t         jX                  d,t         jZ                  d-t         j\                  d.t         j^                  d/t         j`                  d0t         jb                  d1t         jd                  d2t         jf                  d3i t         jh                  d4t         jj                  d5t         jl                  d6t         jn                  d7t         jp                  d8t         jr                  d9t         jt                  d:t         jv                  d;t         jx                  d<t         jz                  d=t         j|                  d>t         j~                  d?t         j                  d@t         j                  dAt         j                  dBt         j                  dCt         j                  dDi t         j                  dEt         j                  dFt         j                  dGt         j                  dHt         j                  dIt         j                  dJt         j                  dKt         j                  dLt         j                  dMt         j                  dNt         j                  dOt         j                  dPt         j                  dQt         j                  dRt         j                  dSt         j                  dTt         j                  dUt         j                  dVt         j                  dWt         j                  dXt         j                  dYt         j                  dZt         j                  d[t         j                  d\t         j                  d]t         j                  d^t         j                  d_t         j                  d`t         j                  dat         j                  dbi}t        | |dcd      S )ezConvert a Language enum to Fal's Wizper language code.

    Args:
        language: The Language enum value to convert.

    Returns:
        The corresponding Fal Wizper language code, or None if not supported.
    afamarasazbabebgbnbobrbscacscydadeeleneseteufafifofrglguhahehihrhthuhyidisitjajwkakkkmknkolalblnloltlvmgmimkmlmnmrmsmtmynenlnnnoocpaplpsptrorusasdsiskslsnsosqsrsusvswtatetgthtktltrttukuruzviyiyozhT)use_base_code)dr   AFAMARASAZBABEBGBNBOBRBSCACSCYDADEELENESETEUFAFIFOFRGLGUHAHEHIHRHTHUHYIDISITJAJWKAKKKMKNKOLALBLNLOLTLVMGMIMKMLMNMRMSMTMYNENLNNNOOCPAPLPSPTRORUSASDSISKSLSNSOSQSRSUSVSWTATETGTHTKTLTRTTUKURUZVIYIYOZHr   )r   LANGUAGE_MAPs     J/opt/pipecat/venv/lib/python3.12/site-packages/pipecat/services/fal/stt.pylanguage_to_fal_languager      s   cTcTc 	Tc 	T	c
 	Tc 	Tc 	Tc 	Tc 	Tc 	Tc 	Tc 	Tc 	Tc 	Tc 	Tc  	T!c" 	T#c$ 	T%c& 	T'c( 	T)c* 	T+c, 	T-c. 	T/c0 	T1c2 	T3c4 	T5c6 	T7c8 	T9c: 	T;c< 	T=c> 	T?c@ 	TAcB 	TCcD 	TEcF 	TGcH 	TIcJ 	TKcL 	TMcN 	TOcP 	TQcR 	TScT 	TUcV 	TWcX 	TYcZ 	T[c\ 	T]c^ 	T_c` 	Tacb 	Tccd 	Tecf 	Tgch 	Ticj 	Tkcl 	Tmcn 	Tocp 	Tqcr 	Tsct 	Tucv 	Twcx 	Tycz 	T{c| 	T}c~ 	Tc@ 	TAcB 	TCcD 	TEcF 	TGcH 	TIcJ 	TKcL 	TMcN 	TOcP 	TQcR 	TScT 	TUcV 	TWcX 	TYcZ 	T[c\ 	T]c^ 	T_c` 	Tacb 	Tccd 	Tecf 	Tgch 	Ticj 	Tkcl 	TTTTTTTTTTTTTEcLJ Hl$GG    c                       e Zd ZdZy)FalSTTSettingszSettings for FalSTTService.N)__name__
__module____qualname____doc__ r   r   r   r      s    %r   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dde	d		d
e
e   de
ej                     dededede
e   de
e   de
e   de
e   f fdZdefdZdede
e   fdZe	 ddedede
e   fd       Zdedeedf   fdZ xZS )FalSTTServicezSpeech-to-text service using Fal's Wizper API.

    This service uses Fal's Wizper API to perform speech-to-text transcription on audio
    segments. It inherits from SegmentedSTTService to handle audio buffering and speech detection.
    	_settingsc                   d    e Zd ZU dZej
                  Zee   ed<   dZ	e
ed<   dZe
ed<   dZe
ed<   y	)
FalSTTService.InputParamsa  Configuration parameters for Fal's Wizper API.

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

        Parameters:
            language: Language of the audio input. Defaults to English.
            task: Task to perform ('transcribe' or 'translate'). Defaults to 'transcribe'.
            chunk_level: Level of chunking ('segment'). Defaults to 'segment'.
            version: Version of Wizper model to use. Defaults to '3'.
        r   
transcribetasksegmentchunk_level3versionN)r   r   r   r   r   r   r   r   __annotations__r   strr   r   r   r   r   InputParamsr      s:    
	 (0{{(8$2 c $S$r   r   Nr   r   r   )	api_keyaiohttp_sessionr   r   r   sample_rateparamssettingsttfs_p99_latencyr   r   r   r   r   r   r   r   r   c       	         f   t        dt        t        j                              }|t	        dt                |sw|j
                  t        |j
                        |_        |j                  dk7  r|j                  }|j                  dk7  r|j                  }|j                  dk7  r|j                  }||j                  |       t        | ,  d||	|d|
 || _        || _        || _        |xs t        j                   dd	      | _        | j"                  st%        d
      || _        |du | _        y)ah  Initialize the FalSTTService with API key and parameters.

        Args:
            api_key: Fal API key. If not provided, will check FAL_KEY environment variable.
            aiohttp_session: Optional aiohttp ClientSession for HTTP requests.
                If not provided, a session will be created and managed internally.
            task: Task to perform (``"transcribe"`` or ``"translate"``).
                Defaults to ``"transcribe"``.
            chunk_level: Level of chunking (``"segment"``). Defaults to ``"segment"``.
            version: Version of Wizper model to use. Defaults to ``"3"``.
            sample_rate: Audio sample rate in Hz. If not provided, uses the pipeline's rate.
            params: Configuration parameters for the Wizper API.

                .. deprecated:: 0.0.105
                    Use ``settings=FalSTTSettings(...)`` for model/language and
                    direct init parameters for task/chunk_level/version 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
            **kwargs: Additional arguments passed to SegmentedSTTService.
        N)modelr   r   r   r   r   )r   r   r   FAL_KEY zQFAL_KEY must be provided either through api_key parameter or environment variabler   )r   r   r   r   r   r   r   r   r   apply_updatesuper__init___task_chunk_level_versionosgetenv_api_key
ValueError_session_owns_session)selfr   r   r   r   r   r   r   r   r   kwargsdefault_settings	__class__s               r   r   zFalSTTService.__init__   s,   L *-hkk:
 "8^<??.0H0Y$-;;,.!;;D%%2"("4"4K>>S($nnG ))(3 	
#-%	
 		
 
';299Y#;}}c  7F,4r   r   c                      y)zCheck if the service can generate processing metrics.

        Returns:
            True, as Fal STT service supports metrics generation.
        Tr   )r
  s    r   can_generate_metricsz"FalSTTService.can_generate_metrics  s     r   r   c                     t        |      S )zConvert a Language enum to Fal's service-specific language code.

        Args:
            language: The language to convert.

        Returns:
            The Fal-specific language code, or None if not supported.
        )r   )r
  r   s     r   language_to_service_languagez*FalSTTService.language_to_service_language  s     (11r   
transcriptis_finalc                 @   K   | j                          d{    y7 w)z+Handle a transcription result with tracing.N)stop_processing_metrics)r
  r  r  r   s       r   _handle_transcriptionz#FalSTTService._handle_transcription  s     
 **,,,s   audioc                :  K   	 | j                          d{    | j                  st        j                         | _        dt	        j
                  |      j                          }d|i}| j                  j                  | j                  j                  |d<   | j                  | j                  |d<   | j                  | j                  |d<   | j                  | j                  |d<   d| j                   d	d
}| j                  j                  d||      4 d{   }|j                  dk7  rI|j                          d{   }t!        d|j                   d|        	 ddd      d{    y|j#                          d{   }ddd      d{    rd|v r|d   j%                         }|r| j'                  |d| j                  j                         d{    t)        j*                  d| d       t-        || j.                  t1               t3        | j                  j                        |       yyyy7 67 17 7 7 7 # 1 d{  7  sw Y   xY w7 # t4        $ r}	t!        d|	        Y d}	~	yd}	~	ww xY ww)a  Transcribes an audio segment using Fal's Wizper API.

        Args:
            audio: Raw audio bytes in WAV format (already converted by base class).

        Yields:
            Frame: TranscriptionFrame containing the transcribed text, or ErrorFrame on failure.

        Note:
            The audio is already in WAV format from the SegmentedSTTService.
            Only non-empty transcriptions are yielded.
        Nzdata:audio/x-wav;base64,	audio_urlr   r   r   r   zKey zapplication/json)AuthorizationzContent-Typezhttps://fal.run/fal-ai/wizper)jsonheaders   zFal API error (z): )errortextTzTranscription: [])resultzUnknown error occurred: )start_processing_metricsr  aiohttpClientSessionbase64	b64encodedecoder   r   r  r  r  r  poststatusr  r   r  stripr  r   debugr
   _user_idr   r   	Exception)
r
  r  data_uripayloadr  resp
error_textresponser  es
             r   run_sttzFalSTTService.run_stt  su    .	C//111== ' 5 5 71&2B2B52I2P2P2R1STH((3G~~&&2&*nn&=&=
#zz%"&**  ,)-):):&}}(%)]]	"#'!7 2G
 }}))/ *  	- 	- ;;#%'+yy{!2J$_T[[MZL+YZZ	- 	- 	- "&,	- 	- Fh.'--/44T4AXAXYYYLL#3D6!;<,(* !8!89'   /x? 2(	- "3	- -	- 	- 	- 	- Z  	C%=aS#ABBB	Cs   JI3 IDI3 I I3 ##II$I+I3 6I7I3 ;J<IIII3 I A	I3 )I1*AI3 	JI3 I3 II3 II3 I."I%#I.*I3 3	J<JJJJ)N)r   r   r   r   r   Settingsr   r   r   r   r   r   r#  r$  intfloatr   boolr  r   r  r   r  bytesr   r	   r4  __classcell__)r  s   @r   r   r      s>    Hi * "&;? $%)(,-1,8P5 #P5 "'"7"78	P5
 P5 P5 P5 c]P5 %P5 >*P5 #5/P5dd 	2X 	2(3- 	2 IM--)--9A#- -;C5 ;C^E4K-H ;Cr   r   )#r   r%  r  dataclassesr   typingr   r   r#  logurur   pydanticr   pipecat.frames.framesr   r	   r
   pipecat.services.settingsr   r   pipecat.services.stt_latencyr   pipecat.services.stt_servicer   pipecat.transcriptions.languager   r   pipecat.utils.timer   (pipecat.utils.tracing.service_decoratorsr   r   r   r   r   r   r   r   <module>rF     s     	 ! +    G G I 5 < F / ?nHx nHHSM nHb 	[ 	 	CC' CCr   