
    Z j2                        S r SSKrSSKJr  SSKJr  SSKJr  \" 5       (       a  SSKJ	r	J
r
  SSKJrJr  SS	KJr  S
SKJr  S
SKJrJrJrJr  \(       a  SSKJrJr  \R2                  " \5      r " S S\SS9r1 Skr " S S5      rg)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                        \ rS rSr% \\S'   Srg)%TransformersTranscriptionCreateParams)   stream N)__name__
__module____qualname____firstlineno__bool__annotations____static_attributes__r       w/root/GenerationalWealth/GenerationalWealth/venv/lib/python3.13/site-packages/transformers/cli/serving/transcription.pyr   r   )   s    Lr    r   F)total>   promptincludelanguagetemperatureresponse_formatchunking_strategytimestamp_granularitiesc            
           \ rS rSrSrS\S\4S jrS\\	   SS4S	 jr
S
\S\\-  4S jr\S\SSSSS\4S j5       rS\SSSSS\S\4
S jrS\SSSSS\S\4
S jrSrg)TranscriptionHandler8   a  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                     Xl         X l        g)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    	form_keysreturnNc                     U[        [        S[        5       5      -
  nU(       a  [        SSU 3S9eU[        -  nU(       a  [
        R                  SU 35        gg)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)r0   r3   
unexpectedunuseds       r!   _validate_request&TranscriptionHandler._validate_requestL   s^    )NPbdgdi!jj
C:\]g\h8ijj88"Nvh WX r    requestc                   #    SSK JnJn  U" 5       (       d  [        S5      eU" 5       (       d  [        S5      eUR	                  5        ISh  vN nU R                  [        UR                  5       5      5        US   n[        U[        5      (       a
  [        SSS	9eUR                  5       I Sh  vN nUS
   n[        U[        5      (       d
  [        SSS	9e[        UR                  SS5      5      R                  5       S:H  nSSS5      ISh  vN   U R                  R                  W5      n	U R                  R!                  U	5      u  pU R"                  R%                  U	5      n[        U[&        5      (       d
  [        SSS	9eUnU R)                  WX5      nW(       a  U R+                  XX5      $ U R-                  XX5      I Sh  vN $  GN GN! N! , ISh  vN  (       d  f       N= f N&7f)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.
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filer7   z Expected file upload, got stringr8   modelzExpected model name as stringr   falsetruei  z;Audio transcription requires sequential generation (not CB))transformers.utils.import_utilsrF   rG   ImportErrorformrB   r<   keys
isinstancestrr   readgetlowerr-   process_model_nameload_model_and_processorr.   get_managerr   _prepare_audio_inputs
_streaming_non_streaming)r0   rD   rF   rG   rN   
file_field
file_bytesrI   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""3tyy{#34fJ*c**#<^__)00JMEeS))#<[\\(G45;;=GF "> !% 2 2 E Ee L'+'9'9'R'RSh'i$,,889NO,88C8uvv"11*o[??;_[[((?aaa+ "
 1 ">>>* bsi   AG3GG3A G1G2AGG3GB8G3
G1G3GG3G.G G.*G3r\   r_   r   r^   r   c                 
   SSK nUR                  R                  nUR                  [        R
                  " U 5      USS9u  pVU" XTSS9R                  UR                  5      nUS   R                  UR                  5      US'   U$ )z-Load audio bytes and convert to model inputs.r   NT)srmonopt)sampling_ratereturn_tensorsinput_features)	librosafeature_extractorri   loadioBytesIOtodevicedtype)r\   r_   r^   rl   ri   audio_array_rb   s           r!   rX   *TranscriptionHandler._prepare_audio_inputs   s    
 	'99GG bjj&<UYZ&{`dehh
 *66F)G)J)J;K\K\)]%&r    ra   rb   c                    #    SSK Jn  UR                  " UR                  40 UD6I S h  vN nUR	                  USS9S   n[        U" US9R                  SS95      $  N37f)Nr   )TranscriptionTskip_special_tokens)text)exclude_none)openai.types.audiorx   async_submitgeneratebatch_decoder	   
model_dump)r0   ra   r^   r_   rb   rx   generated_idsr{   s           r!   rZ   #TranscriptionHandler._non_streaming   sg      	5)66{7K7K\|\\++Mt+TUVWMt4??T?RSS ]s   'AA4Ac                 *  ^^
^^ SS K n[        US5      (       a  UR                  OUnUR                  5       mUR	                  5       m[        UR                  TTSS9n0 UESU0Em
UU
UU4S jnUR                  U5        U4S jn	[        U	" 5       SS	9$ )
Nr   	tokenizerTry   streamerc            	         >  TR                   " S0 TD6  g ! [         a8  n TR                  TR                  [	        [        U 5      5      5         S n A g S n A ff = f)Nr   )r   	Exceptioncall_soon_threadsafe
put_nowaitr   rQ   )er^   
gen_kwargsloopqueues    r!   _run-TranscriptionHandler._streaming.<locals>._run   sN    R$$2z2 R))%*:*:LQ<PQQRs    
A.AAc                    >#     TR                  5       I S h  vN n U c  g [        U [        5      (       a  SU R                   S37v   g SU  S37v   MP   N<7f)Nzdata: {"error": "z"}

zdata: z

)rS   rP   r   msg)r{   r   s    r!   sse_gen0TranscriptionHandler._streaming.<locals>.sse_gen   sY     "YY[(<dL11.txxj@@tfD)) (s   AA=Aztext/event-stream)
media_type)	asynciohasattrr   get_running_loopQueuer   
_tokenizersubmitr
   )r0   ra   r^   r_   rb   r   r   r   r   r   r   r   r   s     `       @@@r!   rY   TranscriptionHandler._streaming   s     	18+1V1VO--\k	'')&}}!)"6"6eY]^;;j(;
	R 	R 	4 	* !7JKKr    )r.   r-   )r   r   r   r   __doc__r   r   r1   r<   rQ   rB   r   r	   r
   rc   staticmethodbytesdictrX   r   rZ   rY   r   r   r    r!   r+   r+   8   s    1l 1o 1Y3s8 Y Y(bG (bGX8X (bT ,<K\	 T$T 'T *	T
 T 
T #L$#L '#L *	#L
 #L 
#Lr    r+   )r   ro   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	%,IQV  IL ILr    