+
    œ°³j’  ã                   ó  € R t ^ RIt^ RIHt ^RIHt ^RIHtHt ]! 4       '       d   ^ RI	H
t
Ht ^ RIHtHt ^ RIHt ^RIHt ^R	IHtHtHtHt ]'       d	   ^ R
IHtHt ]P4                  ! ]4      t ! R R]RR7      t0 Rmt ! R R4      tR# )z4
Handler for the /v1/audio/transcriptions endpoint.
N)ÚTYPE_CHECKING)Úlogging)Úis_serve_availableÚrequires)ÚHTTPExceptionÚRequest)ÚJSONResponseÚStreamingResponse)ÚTranscriptionCreateParamsBase)ÚModelManager)ÚDirectStreamerÚGenerateManagerÚGenerationStateÚ_StreamError)ÚPreTrainedModelÚProcessorMixinc                   ó,   a € ] tR t^)t o V 3R ltRtV tR# )Ú%TransformersTranscriptionCreateParamsc                ó&   <€ V ^8„  d   Qh/ S[ ;R&   # )é   Ústream)Úbool)ÚformatÚ__classdict__s   "€Úg/home/luca/screen-checking/.venv/lib/python3.14/site-packages/transformers/cli/serving/transcription.pyÚ__annotate__Ú2TransformersTranscriptionCreateParams.__annotate__)   s   ø‡ ‚ Ù�Lò ó    © N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__annotate_func__Ú__static_attributes__Ú__classdictcell__©r   s   @r   r   r   )   s   ø‡ ‡ „ r   r   F)Útotalc                   ó²   a € ] tR t^8t o RtV 3R lR ltV 3R lR ltV 3R lR lt]]	! RR7      V 3R	 lR
 l4       4       t
V 3R lR ltV 3R lR ltRtV tR# )Ú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.
c                ó&   <€ V ^8„  d   QhRS[ RS[/# )r   Úmodel_managerÚgeneration_state)r   r   )r   r   s   "€r   r   Ú!TranscriptionHandler.__annotate__C   s   ø€ ÷ 1ñ 1¡lð 1Áoñ 1r   c                ó   € Wn         W n        R# )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__ÚTranscriptionHandler.__init__C   s   € ð +ÔØ 0Ör   c                ó4   <€ V ^8„  d   QhRS[ S[,          RR/# )r   Ú	form_keysÚreturnN)ÚsetÚstr)r   r   s   "€r   r   r-   L   s#   ø€ ÷ Yñ Y©3©s­8ð Y¸ñ Yr   c                óÔ   € V\        \        R\        4       4      ,
          pV'       d   \        RRV 2R7      hV\        ,          pV'       d   \
        P                  RV 24       R# R# )z&Validate transcription request fields.Ú__mutable_keys__é¦  z"Unexpected fields in the request: ©Ústatus_codeÚdetailz,Ignoring unsupported fields in the request: N)Úgetattrr   r5   r   ÚUNUSED_TRANSCRIPTION_FIELDSÚloggerÚwarning_once)r/   r3   Ú
unexpectedÚunuseds   &&  r   Ú_validate_requestÚ&TranscriptionHandler._validate_requestL   s^   € à¤Ô)NÐPbÔdgÓdiÓ!jÕjˆ
ßÜ¨CÐ:\Ð]gÐ\hÐ8iÔjÐjØÔ8Õ8ˆßÜ×ÑÐ"NÈvÈhÐ WÖXñ r   c                ó6   <€ V ^8„  d   QhRS[ RS[S[,          /# )r   Úrequestr4   )r   r   r	   )r   r   s   "€r   r   r-   U   s%   ø€ ÷ &bñ &b©Gð &b¹ÑGXÕ8Xñ &br   c              ƒ  óø  "  € ^ RI Hp V! 4       '       g   \        R4      hVP                  4       ;_uu_4       GRj  x€L
 pV P	                  \        VP                  4       4      4       VR,          p\        V\        4      '       d   \        RRR7      hVP                  4       G Rj  x€L
 pVR,          p\        V\        4      '       g   \        RR	R7      h\        VP                  R
R4      4      P                  4       R8H  pRRR4      GRj  x€L
  V P                  P                  X4      pV P                  P                  V4      w  ršV P                   P#                  V4      p\        V\$        4      '       g   \        RRR7      hTpV P'                  XW©4      pX'       d   V P)                  WÉW­4      # V P+                  WÉW­4      G Rj  x€L
 #  EL— EL. LÈ  + GRj  x€L 
 '       g   i     Lß; i L(5i)a6  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.
)Úis_multipart_availablezaMissing python-multipart dependency for file uploads. Install with `pip install python-multipart`NÚfiler9   z Expected file upload, got stringr:   ÚmodelzExpected model name as stringr   ÚfalseÚtruei�  z;Audio transcription requires sequential generation (not CB))Útransformers.utils.import_utilsrH   ÚImportErrorÚformrC   r5   ÚkeysÚ
isinstancer6   r   ÚreadÚgetÚlowerr+   Úprocess_model_nameÚload_model_and_processorr,   Úget_managerr   Ú_prepare_audio_inputsÚ
_streamingÚ_non_streaming)r/   rF   rH   rO   Ú
file_fieldÚ
file_bytesrJ   r   Úmodel_id_and_revisionÚaudio_modelÚaudio_processorÚbase_managerÚgen_managerÚaudio_inputss   &&            r   Úhandle_requestÚ#TranscriptionHandler.handle_requestU   s‘  é € õ 	Ká%×'Ò'ÜØsóð ð —<‘<—>—>”> TØ×"Ñ"¤3 t§y¡y£{Ó#3Ô4Ø˜f�ˆJÜ˜*¤c×*Ò*Ü#°Ð<^Ô_Ð_Ø)Ÿ™Ó0×0ˆJØ˜•MˆEÜ˜e¤S×)Ò)Ü#°Ð<[Ô\Ð\Ü˜Ÿ™ (¨GÓ4Ó5×;Ñ;Ó=ÀÑGˆF÷ "—>ð !%× 2Ñ 2× EÑ EÀeÓ LÐØ'+×'9Ñ'9×'RÑ'RÐShÓ'iÑ$ˆØ×,Ñ,×8Ñ8Ð9NÓOˆÜ˜,¬×8Ò8Ü¨CÐ8uÔvÐvØ"ˆØ×1Ñ1°*¸oÓ[ˆçØ—?‘? ;¸_Ó[Ð[Ø×(Ñ(¨À?Óa×aÐaò+ "ò
 1÷ "—>—>’>úñ* bùsl   ‚;G:½G¾G:ÁA(GÂ)GÂ*AGÄG:ÄGÄB=G:ÇG8ÇG:ÇGÇG:ÇG5	Ç"G%Ç#
G5	Ç.G5	Ç0	G:)Úbackendsc                ó.   <€ V ^8„  d   QhRS[ RRRRRS[/# )r   r\   r_   r   r^   r   r4   )ÚbytesÚdict)r   r   s   "€r   r   r-      s-   ø€ ÷ ñ ÙðØ,<ðØK\ðá	ñr   c                ó  € ^ RI pVP                  P                  pVP                  \        P
                  ! V 4      VRR7      w  rVV! WTRR7      P                  VP                  4      pVR,          P                  VP                  4      VR&   V# )z-Load audio bytes and convert to model inputs.NT)ÚsrÚmonoÚpt)Úsampling_rateÚreturn_tensorsÚinput_features)	ÚlibrosaÚfeature_extractorrm   ÚloadÚioÚBytesIOÚtoÚdeviceÚdtype)r\   r_   r^   rp   rm   Úaudio_arrayÚ_rb   s   &&&     r   rX   Ú*TranscriptionHandler._prepare_audio_inputs}   sƒ   € ó 	à'×9Ñ9×GÑGˆØ Ÿ™¤b§j¢j°Ó&<ÀÐUY˜ÓZ‰ˆÙ& {Ð`dÔe×hÑhØ×Ñó
ˆð *6Ð6FÕ)G×)JÑ)JÈ;×K\ÑK\Ó)]ˆÐ%Ñ&ØÐr   c          
      ó4   <€ V ^8„  d   QhRS[ RRRRRS[RS[/# ©r   ra   r^   r   r_   r   rb   r4   )r   rh   r   )r   r   s   "€r   r   r-   �   sD   ø€ ÷ Tñ Tá$ðTð 'ðTð *ð	Tñ
 ðTñ 
ñTr   c              ƒ  óÜ   "  € ^ RI Hp VP                  ! VP                  3/ VB G Rj  x€L
 pVP	                  VRR7      ^ ,          p\        V! VR7      P                  RR7      4      #  L@5i)é    )ÚTranscriptionNT)Úskip_special_tokens)Útext)Úexclude_none)Úopenai.types.audior   Úasync_submitÚgenerateÚbatch_decoder   Ú
model_dump)r/   ra   r^   r_   rb   r   Úgenerated_idsr�   s   &&&&&   r   rZ   Ú#TranscriptionHandler._non_streaming�   sg   é € õ 	5à)×6Ò6°{×7KÑ7KÑ\È|Ñ\×\ˆØ×+Ñ+¨MÈtÐ+ÓTÐUVÕWˆÜ™M¨tÔ4×?Ñ?ÈTÐ?ÓRÓSÐSñ ]ùs   ‚'A,©A*ªAA,c          
      ó4   <€ V ^8„  d   QhRS[ RRRRRS[RS[/# r|   )r   rh   r	   )r   r   s   "€r   r   r-   �   sD   ø€ ÷ #Lñ #Lá$ð#Lð 'ð#Lð *ð	#Lñ
 ð#Lñ 
ñ#Lr   c                ó4  aa
aa€ ^ RI p\        VR4      '       d   VP                  MTpVP                  4       oVP	                  4       o\        VP                  SS4      p/ VCRV/Co
VV
VV3R lpVP                  V4       V3R lp	\        V	! 4       RR7      # )r~   NÚ	tokenizerÚstreamerc            	      ó¼   <€  SP                   ! R/ SB  R #   \         d:   p SP                  SP                  \	        \        T 4      4      4        R p ? R # R p ? ii ; i)Nr   )r…   Ú	ExceptionÚcall_soon_threadsafeÚ
put_nowaitr   r6   )Úer^   Ú
gen_kwargsÚloopÚqueues    €€€€r   Ú_runÚ-TranscriptionHandler._streaming.<locals>._run®   sN   ø€ ðRØ×$Ò$Ñ2 zÔ2øÜô RØ×)Ñ)¨%×*:Ñ*:¼LÌÈQËÓ<P×QÒQûðRús   ƒ —A¢.AÁAc                 óº   <"  €  SP                  4       G Rj  x€L
 p V f   R# \        V \        4      '       d   RV P                   R25x € R# RV  R25x € KU   L@5i)TNzdata: {"error": "z"}

zdata: z

)rS   rQ   r   Úmsg)r�   r•   s    €r   Ússe_genÚ0TranscriptionHandler._streaming.<locals>.sse_gen¶   sV   øé € ØØ"ŸY™Y›[×(�Ø’<ÙÜ˜d¤L×1Ò1Ø.¨t¯x©x¨j¸Ð@Ó@ÙØ˜t˜f DÐ)Õ)ñ )ùs   ƒA˜A™AAztext/event-stream)Ú
media_type)	ÚasyncioÚhasattrrŒ   Úget_running_loopÚQueuer   Ú
_tokenizerÚsubmitr	   )r/   ra   r^   r_   rb   r�   rŒ   r�   r–   rš   r“   r”   r•   s   &&f&&     @@@r   rY   ÚTranscriptionHandler._streaming�   s“   û€ ó 	ä18¸È+×1VÒ1V�O×-Ò-Ð\kˆ	Ø×'Ñ'Ó)ˆØ&Ÿ}™}›ˆÜ! )×"6Ñ"6¸¸eÓDˆØ;˜Ð; j°(Ñ;ˆ
÷	Rð 	Rð 	×Ñ˜4Ô õ	*ô !¡£Ð7JÔKÐKr   )r,   r+   N)rp   )r   r    r!   r"   Ú__doc__r0   rC   rc   Ústaticmethodr   rX   rZ   rY   r$   r%   r&   s   @r   r)   r)   8   sf   ø‡ € ñ÷1ð 1÷Yð Y÷&bð &bðP Ù�|Ô$÷ó %ó ð÷Tð T÷ #Lö #Lr   r)   >   ÚpromptÚincludeÚlanguageÚtemperatureÚresponse_formatÚchunking_strategyÚtimestamp_granularities) r¤   rs   Útypingr   Úutilsr   Úutils.import_utilsr   r   Úfastapir   r   Úfastapi.responsesr   r	   Ú.openai.types.audio.transcription_create_paramsr
   r+   r   r   r   r   r   Útransformersr   r   Ú
get_loggerr   r?   r   r>   r)   r   r   r   Ú<module>rµ      su   ðñó 
Ý  å ß >ñ ×Òß.ßAÝ\å 'ß QÓ Q÷ ß<ð 
×	Ò	˜HÓ	%€ôÐ,IÐQVõ òÐ ÷HLó HLr   