+
    QV-j2  ã                   ó  € R t ^ RIt^ RIHt ^RIHt ^RI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 ]P2                  ! ]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)Ú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   "€Úw/Volumes/fast/ai/experiments/ui-tars-smoke/.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]V 3R lR	 l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   r4   r   ÚUNUSED_TRANSCRIPTION_FIELDSÚloggerÚwarning_once)r.   r2   Ú
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   Úrequestr3   )r   r   r   )r   r   s   "€r   r   r,   U   s%   ø€ ÷ (bñ (b©Gð (b¹ÑGXÕ8Xñ (br   c              ƒ  ó,  "  € ^ RI HpHp V! 4       '       g   \        R4      h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_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Úfiler8   z Expected file upload, got stringr9   ÚmodelzExpected model name as stringr   ÚfalseÚtruei�  z;Audio transcription requires sequential generation (not CB))Útransformers.utils.import_utilsrG   rH   ÚImportErrorÚformrB   r4   ÚkeysÚ
isinstancer5   r   ÚreadÚgetÚlowerr*   Úprocess_model_nameÚload_model_and_processorr+   Úget_managerr   Ú_prepare_audio_inputsÚ
_streamingÚ_non_streaming)r.   rE   rG   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¦  é € ÷ 	aá#×%Ò%ÜÐvÓwÐwÙ%×'Ò'ÜØ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ùss   ‚-H°'HÁG.ÁHÁA(G6ÃG1ÃAG6Ä HÄ+G4Ä,B=HÇ)HÇ*HÇ1G6Ç4HÇ6H	Ç<G?Ç=
H	ÈH	È
	Hc                ó.   <€ V ^8„  d   QhRS[ RRRRRS[/# )r   r\   r_   r   r^   r   r3   )Ú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_extractorrl   ÚloadÚioÚBytesIOÚtoÚdeviceÚdtype)r\   r_   r^   ro   rl   Ú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   r3   )r   rg   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   rg   r   )r   r   s   "€r   r   r,   ž   sD   ø€ ÷ #Lñ #Lá$ð#Lð 'ð#Lð *ð	#Lñ
 ð#Lñ 
ñ#Lr   c                ó8  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RR7      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Ú	tokenizerTr   Ú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   r5   )Ú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ÐY]Ô^ˆØ;˜Ð; j°(Ñ;ˆ
÷	Rð 	Rð 	×Ñ˜4Ô õ	*ô !¡£Ð7JÔKÐKr   )r+   r*   N)r   r   r    r!   Ú__doc__r/   rB   rc   ÚstaticmethodrX   rZ   rY   r#   r$   r%   s   @r   r(   r(   8   sY   ø‡ € ñ÷1ð 1÷Yð Y÷(bð (bðT ÷ó ð÷Tð T÷ #Lö #Lr   r(   >   ÚpromptÚincludeÚlanguageÚtemperatureÚresponse_formatÚchunking_strategyÚtimestamp_granularities)r¤   rr   Ú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   r>   r   r=   r(   r   r   r   Ú<module>rµ      su   ðñó 
Ý  å Ý 4ñ ×Òß.ßAÝ\å 'ß QÓ Q÷ ß<ð 
×	Ò	˜HÓ	%€ôÐ,IÐQVõ òÐ ÷ILó ILr   