§
    ‚Štj2  ã                   ó  — d Z ddlZddlmZ ddlmZ ddlmZ  e¦   «         rddl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mZmZ erddlmZmZ  ej        e¦  «        Z G d„ ded¬¦  «        Zh d£Z G d„ d¦  «        ZdS )z4
Handler for the /v1/audio/transcriptions endpoint.
é    N)ÚTYPE_CHECKINGé   )Úlogging)Úis_serve_available)ÚHTTPExceptionÚRequest)ÚJSONResponseÚStreamingResponse)ÚTranscriptionCreateParamsBaseé   )ÚModelManager)ÚDirectStreamerÚGenerateManagerÚGenerationStateÚ_StreamError)ÚPreTrainedModelÚProcessorMixinc                   ó   — e Zd ZU eed<   dS )Ú%TransformersTranscriptionCreateParamsÚstreamN)Ú__name__Ú
__module__Ú__qualname__ÚboolÚ__annotations__© ó    úd/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/transformers/cli/serving/transcription.pyr   r   )   s   € € € € € € Ø€L€L�L€L€Lr   r   F)Útotal>   ÚpromptÚincludeÚlanguageÚtemperatureÚresponse_formatÚchunking_strategyÚtimestamp_granularitiesc            
       ó´   — e Zd ZdZdedefd„Zdee         ddfd„Z	d	e
deez  fd
„Zededddddefd„¦   «         Zdedddddedef
d„Zdedddddedef
d„ZdS )ÚTranscriptionHandleraº  Handler for ``POST /v1/audio/transcriptions``.

    Accepts a multipart/form-data request with an audio file and model name,
    runs speech-to-text, and returns an OpenAI-compatible Transcription response.

    Standalone (does not extend :class:`BaseHandler`) because audio requests use
    multipart form data, not JSON bodies, and don't need generation config or
    validation. Shares the :class:`GenerationState` for thread safety.
    Úmodel_managerÚgeneration_statec                 ó"   — || _         || _        dS )zÏ
        Args:
            model_manager (`ModelManager`): Handles model loading, caching, and lifecycle.
            generation_state (`GenerationState`): Shared generation state for thread safety.
        N)r)   r*   )Úselfr)   r*   s      r   Ú__init__zTranscriptionHandler.__init__C   s   € ð +ˆÔØ 0ˆÔÐÐr   Ú	form_keysÚreturnNc                 óÒ   — |t          t          dt          ¦   «         ¦  «        z
  }|rt          dd|› �¬¦  «        ‚|t          z  }|rt
                               d|› �¦  «         dS dS )z&Validate transcription request fields.Ú__mutable_keys__é¦  z"Unexpected fields in the request: ©Ústatus_codeÚdetailz,Ignoring unsupported fields in the request: N)Úgetattrr   Úsetr   ÚUNUSED_TRANSCRIPTION_FIELDSÚloggerÚwarning_once)r,   r.   Ú
unexpectedÚunuseds       r   Ú_validate_requestz&TranscriptionHandler._validate_requestL   sŠ   € à¥Õ)NÐPbÕdgÑdiÔdiÑ!jÔ!jÑjˆ
Øð 	kÝ¨CÐ8iÐ]gÐ8iÐ8iÐjÑjÔjÐjØÕ8Ñ8ˆØð 	YÝ×ÒÐ WÈvÐ WÐ WÑXÔXÐXÐXÐXð	Yð 	Yr   Úrequestc              ƒ   óL  K  — ddl m}m}  |¦   «         st          d¦  «        ‚ |¦   «         st          d¦  «        ‚|                     ¦   «         4 ƒd{V —†}|                      t          |                     ¦   «         ¦  «        ¦  «         |d         }t          |t          ¦  «        rt          dd¬	¦  «        ‚|                     ¦   «         ƒ d{V —†}|d
         }t          |t          ¦  «        st          dd¬	¦  «        ‚t          |                     dd¦  «        ¦  «                             ¦   «         dk    }ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   | j                             |¦  «        }	| j                             |	¦  «        \  }
}| j                             |	¦  «        }t          |t&          ¦  «        st          dd¬	¦  «        ‚|}|                      |||
¦  «        }|r|                      ||
||¦  «        S |                      ||
||¦  «        ƒ d{V —†S )af  Parse multipart form, run transcription, return result.

        Args:
            request (`Request`): FastAPI request containing multipart form data with
                ``file`` (audio bytes), ``model`` (model ID), and optional ``stream`` flag.

        Returns:
            `JSONResponse | StreamingResponse`: Transcription result or SSE stream.
        r   )Úis_librosa_availableÚis_multipart_availablezVMissing librosa dependency for audio transcription. Install with `pip install librosa`zaMissing python-multipart dependency for file uploads. Install with `pip install python-multipart`NÚfiler2   z Expected file upload, got stringr3   ÚmodelzExpected model name as stringr   ÚfalseÚtruei�  z;Audio transcription requires sequential generation (not CB))Útransformers.utils.import_utilsr@   rA   ÚImportErrorÚformr=   r7   ÚkeysÚ
isinstanceÚstrr   ÚreadÚgetÚlowerr)   Úprocess_model_nameÚload_model_and_processorr*   Úget_managerr   Ú_prepare_audio_inputsÚ
_streamingÚ_non_streaming)r,   r>   r@   rA   rH   Ú
file_fieldÚ
file_bytesrC   r   Úmodel_id_and_revisionÚaudio_modelÚaudio_processorÚbase_managerÚgen_managerÚaudio_inputss                  r   Úhandle_requestz#TranscriptionHandler.handle_requestU   sô  è è € ð 	aÐ`Ð`Ð`Ð`Ð`Ð`Ð`à#Ð#Ñ%Ô%ð 	xÝÐvÑwÔwÐwØ%Ð%Ñ'Ô'ð 	ÝØsñô ð ð —<’<‘>”>ð 		Hð 		Hð 		Hð 		Hð 		Hð 		Hð 		H TØ×"Ò"¥3 t§y¢y¡{¤{Ñ#3Ô#3Ñ4Ô4Ð4Ø˜fœˆJÝ˜*¥cÑ*Ô*ð `Ý#°Ð<^Ð_Ñ_Ô_Ð_Ø)ŸšÑ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0ˆJØ˜”MˆEÝ˜e¥SÑ)Ô)ð ]Ý#°Ð<[Ð\Ñ\Ô\Ð\Ý˜Ÿš (¨GÑ4Ô4Ñ5Ô5×;Ò;Ñ=Ô=ÀÒGˆFð		Hð 		Hð 		Hñ 		Hô 		Hð 		Hð 		Hð 		Hð 		Hð 		Hð 		Hð 		Hð 		Hð 		Hð 		Hð 		Hð 		Hð 		Hð 		Hð 		Hð 		Hð 		Hð 		Høøøð 		Hð 		Hð 		Hð 		Hð !%Ô 2× EÒ EÀeÑ LÔ LÐØ'+Ô'9×'RÒ'RÐShÑ'iÔ'iÑ$ˆ�_ØÔ,×8Ò8Ð9NÑOÔOˆÝ˜,­Ñ8Ô8ð 	wÝ¨CÐ8uÐvÑvÔvÐvØ"ˆØ×1Ò1°*¸oÈ{Ñ[Ô[ˆàð 	\Ø—?’? ;°¸_ÈlÑ[Ô[Ð[Ø×(Ò(¨°kÀ?ÐT`ÑaÔaÐaÐaÐaÐaÐaÐaÐas   ÁC$EÅ
EÅErV   rY   r   rX   r   c                 ó  — ddl }|j        j        }|                     t	          j        | ¦  «        |d¬¦  «        \  }} |||d¬¦  «                             |j        ¦  «        }|d                              |j        ¦  «        |d<   |S )z-Load audio bytes and convert to model inputs.r   NT)ÚsrÚmonoÚpt)Úsampling_rateÚreturn_tensorsÚinput_features)	ÚlibrosaÚfeature_extractorrb   ÚloadÚioÚBytesIOÚtoÚdeviceÚdtype)rV   rY   rX   re   rb   Úaudio_arrayÚ_r\   s           r   rR   z*TranscriptionHandler._prepare_audio_inputs   s•   € ð
 	ˆˆˆà'Ô9ÔGˆØ Ÿš¥b¤j°Ñ&<Ô&<ÀÐUY˜ÑZÔZ‰ˆ�QØ&� {À-Ð`dÐeÑeÔe×hÒhØÔñ
ô 
ˆð *6Ð6FÔ)G×)JÒ)JÈ;ÔK\Ñ)]Ô)]ˆÐ%Ñ&ØÐr   r[   r\   c              ƒ   óØ   K  — ddl m}  |j        |j        fi |¤Žƒ d {V —†}|                     |d¬¦  «        d         }t           ||¬¦  «                             d¬¦  «        ¦  «        S )Nr   )ÚTranscriptionT©Úskip_special_tokens)Útext)Úexclude_none)Úopenai.types.audiorp   Úasync_submitÚgenerateÚbatch_decoder	   Ú
model_dump)r,   r[   rX   rY   r\   rp   Úgenerated_idsrs   s           r   rT   z#TranscriptionHandler._non_streamingŽ   s“   è è € ð 	5Ð4Ð4Ð4Ð4Ð4à6˜kÔ6°{Ô7KÐ\Ð\È|Ð\Ð\Ð\Ð\Ð\Ð\Ð\Ð\ˆØ×+Ò+¨MÈtÐ+ÑTÔTÐUVÔWˆÝ˜M˜M¨tÐ4Ñ4Ô4×?Ò?ÈTÐ?ÑRÔRÑSÔSÐSr   c                 óJ  ‡‡
‡‡— dd l }t          |d¦  «        r|j        n|}|                     ¦   «         Š|                     ¦   «         Št          |j        ‰‰d¬¦  «        }i |¥d|i¥Š
ˆˆ
ˆˆfd„}|                     |¦  «         ˆfd„}	t           |	¦   «         d¬	¦  «        S )
Nr   Ú	tokenizerTrq   Ústreamerc            	      ó¾   •— 	  ‰j         di ‰¤Ž d S # t          $ r@} ‰                     ‰j        t	          t          | ¦  «        ¦  «        ¦  «         Y d } ~ d S d } ~ ww xY w)Nr   )rw   Ú	ExceptionÚcall_soon_threadsafeÚ
put_nowaitr   rK   )ÚerX   Ú
gen_kwargsÚloopÚqueues    €€€€r   Ú_runz-TranscriptionHandler._streaming.<locals>._run¯   s„   ø€ ðRØ$�Ô$Ð2Ð2 zÐ2Ð2Ð2Ð2Ð2øÝð Rð Rð RØ×)Ò)¨%Ô*:½LÍÈQÉÌÑ<PÔ<PÑQÔQÐQÐQÐQÐQÐQÐQÐQøøøøðRøøøs   ƒ ’
Aœ5AÁAc                 ó¤   •K  — 	 ‰                      ¦   «         ƒ d {V —†} | €d S t          | t          ¦  «        rd| j        › d�W V — d S d| › d�W V — ŒM)NTzdata: {"error": "z"}

zdata: z

)rM   rJ   r   Úmsg)rs   r…   s    €r   Ússe_genz0TranscriptionHandler._streaming.<locals>.sse_gen·   s‡   øè è € ð*Ø"ŸYšY™[œ[Ð(Ð(Ð(Ð(Ð(Ð(�Ø�<Ø�EÝ˜d¥LÑ1Ô1ð Ø@¨t¬xÐ@Ð@Ð@Ð@Ð@Ð@Ð@Ø�FØ)˜tÐ)Ð)Ð)Ð)Ð)Ð)Ð)ð*r   ztext/event-stream)Ú
media_type)	ÚasyncioÚhasattrr|   Úget_running_loopÚQueuer   Ú
_tokenizerÚsubmitr
   )r,   r[   rX   rY   r\   r‹   r|   r}   r†   r‰   rƒ   r„   r…   s     `       @@@r   rS   zTranscriptionHandler._streamingž   sõ   øøøø€ ð 	ˆˆˆå18¸È+Ñ1VÔ1VÐk�OÔ-Ð-Ð\kˆ	Ø×'Ò'Ñ)Ô)ˆØ&Ÿ}š}™œˆÝ! )Ô"6¸¸eÐY]Ð^Ñ^Ô^ˆØ;˜Ð; j°(Ð;Ð;ˆ
ð	Rð 	Rð 	Rð 	Rð 	Rð 	Rð 	Rð 	Rð 	×Ò˜4Ñ Ô Ð ð	*ð 	*ð 	*ð 	*ð 	*õ !  ¡¤Ð7JÐKÑKÔKÐKr   )r   r   r   Ú__doc__r   r   r-   r7   rK   r=   r   r	   r
   r]   ÚstaticmethodÚbytesÚdictrR   r   rT   rS   r   r   r   r(   r(   8   sw  € € € € € ðð ð1 lð 1Àoð 1ð 1ð 1ð 1ðY¨3¨s¬8ð Y¸ð Yð Yð Yð Yð(b¨Gð (b¸ÐGXÑ8Xð (bð (bð (bð (bðT ðØðØ,<ðØK\ðà	ðð ð ñ „\ððTà$ðTð 'ðTð *ð	Tð
 ðTð 
ðTð Tð Tð Tð #Là$ð#Lð 'ð#Lð *ð	#Lð
 ð#Lð 
ð#Lð #Lð #Lð #Lð #Lð #Lr   r(   )r‘   rh   Útypingr   Úutilsr   Úutils.import_utilsr   Úfastapir   r   Úfastapi.responsesr	   r
   Ú.openai.types.audio.transcription_create_paramsr   r)   r   r   r   r   r   Útransformersr   r   Ú
get_loggerr   r9   r   r8   r(   r   r   r   ú<module>r�      s�  ððð ð 
€	€	€	Ø  Ð  Ð  Ð  Ð  Ð  à Ð Ð Ð Ð Ð Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4ð ÐÑÔð ]Ø.Ð.Ð.Ð.Ð.Ð.Ð.Ð.ØAÐAÐAÐAÐAÐAÐAÐAØ\Ð\Ð\Ð\Ð\Ð\à 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ Qð ð =Ø<Ð<Ð<Ð<Ð<Ð<Ð<Ð<ð 
ˆÔ	˜HÑ	%Ô	%€ðð ð ð ð Ð,IÐQVð ñ ô ð ðð ð Ð ðILð ILð ILð ILð ILñ ILô ILð ILð ILð ILr   