
    i                         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j2                  e      Z G d ded      Zh dZ G d d      Zy)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<   y)%TransformersTranscriptionCreateParamsstreamN)__name__
__module____qualname__bool__annotations__     w/var/www/vps2.regionflexible.com/Desarrollo/venv/lib/python3.12/site-packages/transformers/cli/serving/transcription.pyr   r   )   s    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y)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                      || _         || _        y)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         j                  z
  }|rt        dd|       |t        z  }|rt        j                  d|        yy)z&Validate transcription request fields.i  z"Unexpected fields in the request: )status_codedetailz,Ignoring unsupported fields in the request: N)r   __mutable_keys__r   UNUSED_TRANSCRIPTION_FIELDSloggerwarning_once)r,   r.   
unexpectedunuseds       r   _validate_requestz&TranscriptionHandler._validate_requestL   sV    !F!W!WW
C:\]g\h8ijj88"Nvh WX r   requestc                 
  K   ddl m}m}  |       st        d       |       st        d      |j	                         4 d{   }| j                  t        |j                                      |d   j                          d{   }|d   }t        |j                  dd	            j                         d
k(  }ddd      d{    | j                  j                        }| j                  j                  |      \  }	}
| j                  j!                  |      }| j#                  |
|	      }r| j%                  ||	|
|      S | j'                  ||	|
|       d{   S 7 "7 7 # 1 d{  7  sw Y   xY w7  w)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filemodelr   falsetrue)transformers.utils.import_utilsr<   r=   ImportErrorformr9   setkeysreadstrgetlowerr)   process_model_nameload_model_and_processorr*   get_manager_prepare_audio_inputs
_streaming_non_streaming)r,   r:   r<   r=   rD   
file_bytesr?   r   model_id_and_revisionaudio_modelaudio_processorgen_manageraudio_inputss                r   handle_requestz#TranscriptionHandler.handle_requestU   sq     	a#%vww%'s  <<> 	H 	HT""3tyy{#34#F|0022JME(G45;;=GF		H 	H !% 2 2 E Ee L'+'9'9'R'RSh'i$_++778MN11*o{[??;_l[[((k?T`aaa	H2	H 	H 	H 	H bsg   AFE%F?E,E(5E,<FE*BF F!F(E,*F,E>2E53E>:FrQ   rT   r   rS   r   c                    ddl }|j                  j                  }|j                  t	        j
                  |       |d      \  }} |||d      j                  |j                        }|d   j                  |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_extractorr\   loadioBytesIOtodevicedtype)rQ   rT   rS   r_   r\   audio_array_rV   s           r   rN   z*TranscriptionHandler._prepare_audio_inputsw   s    
 	'99GG bjj&<UYZQ&{-`dehh
 *66F)G)J)J;K\K\)]%&r   rU   rV   c                    K   ddl m}  |j                  |j                  fi | d {   }|j	                  |d      d   }t         ||      j                  d            S 7 <w)Nr   )TranscriptionTskip_special_tokens)text)exclude_none)openai.types.audiorj   async_submitgeneratebatch_decoder	   
model_dump)r,   rU   rS   rT   rV   rj   generated_idsrm   s           r   rP   z#TranscriptionHandler._non_streaming   sj      	56k66{7K7K\|\\++Mt+TUVWMt4??T?RSS ]s   'A(A&=A(c                 (  
 dd l }t        |d      r|j                  n|}|j                         |j	                         t        |j                  d      }i |d|i

fd}|j                  |       fd}	t         |	       d	      S )
Nr   	tokenizerTrk   streamerc            	          	  j                   di  y # t        $ r8} j                  j                  t	        t        |                    Y d } ~ y d } ~ ww xY w)Nr   )rq   	Exceptioncall_soon_threadsafe
put_nowaitr   rH   )erS   
gen_kwargsloopqueues    r   _runz-TranscriptionHandler._streaming.<locals>._run   sP    R$$$2z2 R))%*:*:LQ<PQQRs    	A.AAc                    K   	 j                          d {   } | y t        | t              rd| j                   d y d|  d I7 5w)Nzdata: {"error": "z"}

zdata: z

)rI   
isinstancer   msg)rm   r   s    r   sse_genz0TranscriptionHandler._streaming.<locals>.sse_gen   sW     "YY[(<dL1.txxj@@tfD)) (s   AA6Aztext/event-stream)
media_type)	asynciohasattrrv   get_running_loopQueuer   
_tokenizersubmitr
   )r,   rU   rS   rT   rV   r   rv   rw   r   r   r}   r~   r   s     `       @@@r   rO   zTranscriptionHandler._streaming   s     	18+1VO--\k	'')&}}!)"6"6eY]^;;j(;
	R 	4 	* !7JKKr   )r   r   r   __doc__r   r   r-   rE   rH   r9   r   r	   r
   rW   staticmethodbytesdictrN   r   rP   rO   r   r   r   r(   r(   8   s    1l 1o 1Y3s8 Y Y bG  bGX8X  bD ,<K\	 T$T 'T *	T
 T 
T #L$#L '#L *	#L
 #L 
#Lr   r(   )r   rb   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   r5   r   r4   r(   r   r   r   <module>r      st    
    4 .A\ ' Q Q < 
		H	%,IQV  AL ALr   