o
    پi8                     @   s2  d Z ddlZddlZddlZddlZddlmZmZ ddlm	Z	m
Z
mZmZmZmZ ddlZddlZddlZzddlm  mZ W n eyL   dZY nw zddlZW n ey^   dZY nw 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$ e$e%Z&eG d	d
 d
Z'eG dd dZ(eG dd dZ)eG dd dZ*eG dd dZ+dee,ee, f dee,ee, f dee-ee- f de.e,e,e,f fddZ/eG dd dZ0de	dej1dB fddZ2dej1dee3 d e3d!e3de3f
d"d#Z4de,fd$d%Z5d&e,dej1d'e3d(e,ddf
d)d*Z6d&e,de	d+e7d e3dee3 ddfd,d-Z8d.e d/edefd0d1Z9d2e	de	d3e3de	fd4d5Z:ddddddd6d7ee	 d8ed e3d9e;d:e
e3ge,f de	dee3 d;ee7e	  d<ee7e	  d=ee7e	  d>ee3 de7e, fd?d@Z<	A			dDd2e	d8ed e3d9e;d&ee, dee3 d>ee3 fdBdCZ=dS )Ez
DiffGenerator module for sglang-diffusion.

This module provides a consolidated interface for generating videos using
diffusion models.
    N)	dataclassfield)AnyCallableListOptionalSequenceUnion)DataTypeSamplingParams)Req)
ServerArgs)CYANRESETinit_loggerc                   @   sr   e Zd ZU eeee f ed< dZeeeeee  f  ed< dZ	eeee f ed< dZ
eeee f ed< dS )
SetLoraReqlora_nicknameN	lora_pathalltarget      ?strength)__name__
__module____qualname__r	   strr   __annotations__r   r   r   r   float r   r   c/home/ubuntu/.local/lib/python3.10/site-packages/sglang/multimodal_gen/runtime/entrypoints/utils.pyr   +   s
   
  r   c                   @   s&   e Zd ZU dZeed< dZeed< dS )MergeLoraWeightsReqr   r   r   r   N)r   r   r   r   r   r   r   r   r   r   r   r   r    3   s   
 r    c                   @   s   e Zd ZU dZeed< dS )UnmergeLoraWeightsReqr   r   N)r   r   r   r   r   r   r   r   r   r   r!   9   s   
 r!   c                   @      e Zd ZdS )ListLorasReqNr   r   r   r   r   r   r   r#   >       r#   c                   @   r"   )ShutdownReqNr$   r   r   r   r   r&   C   r%   r&   r   r   r   returnc                 C   s   t | tr*d| }t |trd|n|}t |tr%ddd |D n|d}n#| }t |tr3|nd|}t |ttfrC|dn	ddd |D }|||fS )z4Format success message for single or multiple LoRAs.z, c                 s       | ]}|d V  qdS .2fNr   .0sr   r   r   	<genexpr>R       z&format_lora_message.<locals>.<genexpr>r*   c                 s   r(   r)   r   r+   r   r   r   r.   \   r/   )
isinstancelistjoinr   intr   )r   r   r   nickname_str
target_strstrength_strr   r   r   format_lora_messageH   s   



r7   c                   @   s   e Zd ZU dZdZeed< dZeed< dZeed< dZ	e
dB ed< dZedB ed< dZeed	< dZeed
< eedZeed< dZeed< dZeed< dZeed< dZeed< dZe
dB ed< dS )GenerationResultz9Result of a single generation request from DiffGenerator.Nsamplesframesaudiopromptsize        generation_timepeak_memory_mb)default_factorymetricstrajectory_latentstrajectory_timestepstrajectory_decodedr   prompt_indexoutput_file_path)r   r   r   __doc__r9   r   r   r:   r;   r<   r   r=   tupler?   r   r@   r   dictrB   rC   rD   rE   rF   r3   rG   r   r   r   r   r8   a   s   
 r8   r;   c                 C   s   | du rdS t | tjr|   dd  }nt | tj	r1| j
tjdd}t|dd}ndS |jdkrP|jd dkrP|d}|jdkrP|jd dks?|jdkre|jd |jd k re|dd}|jdkr||jd d	kr||jd dkr|| }|S )
zQConvert audio (torch / numpy) into a float32 numpy array in [-1, 1], best-effort.Ng      r   F)copy   r         )r0   torchTensordetachr   clampcpunumpynpndarrayastypefloat32clipndimshapesqueeze	transposeflatten)r;   audio_npr   r   r   _normalize_audio_to_numpyt   s    
&r`   r_   audio_sample_ratefps
num_framesc                 C   s   |durt |nd}|du sd|  krdksln d}zF|r&t|t| nd}|dkr\| jdkr8t | jd nt | jd }t tt|| }d|  krSdkr_n W |S |}W |S W |S W |S  tyk   Y |S w |S )	zLPick a plausible sample rate, falling back to inferring from video duration.Ni@  i  i]  r>   r   rM   )r3   r   rZ   r[   round	Exception)r_   ra   rb   rc   selected_sr
duration_s	audio_leninferred_srr   r   r   _pick_audio_sample_rate   s0   
rk   c                  C   s~   d} t d}|r|} z
td urt } W n	 ty   Y nw d}| r7tj| r0tj| }nt | d u}|s=t	d| S )NffmpegFzffmpeg not found)
shutilwhich_imageio_ffmpegget_ffmpeg_exerf   ospathisabsexistsRuntimeError)
ffmpeg_exeffmpeg_on_path	ffmpeg_okr   r   r   _resolve_ffmpeg_exe   s&   
ry   save_file_pathsample_raterv   c                 C   s\  |  ddd d }d }zvtd u rtdtjddd}|j}W d    n1 s*w   Y  t||| tj|d	d
| d
|dddddd|gdtj	tj	d t
||  W |rhzt
| W n	 tyg   Y nw t
j|rzt
| W d S  ty   Y d S w d S |rzt
| W n	 ty   Y nw t
j|rzt
| W w  ty   Y w w w )N.rL   r   z.tmp_mux.mp4z;scipy is required to mux audio into mp4 (pip install scipy)z.wavF)suffixdeletez-yz-iz-c:vrK   z-c:aaacz-strictexperimentalT)checkstdoutstderr)rsplitscipy_wavfileru   tempfileNamedTemporaryFilenamewrite
subprocessrunDEVNULLrq   replaceremoveOSErrorrr   rt   )rz   r_   r{   rv   merged_pathtmp_wav_pathfr   r   r   _mux_audio_np_into_mp4   sr   r   r:   c           	   
   C   s   t |}|du r
dS t|||t|d}zt }t| |||d tdt |  t  W dS  t	yI } zt
dt| W Y d}~dS d}~ww )zBest-effort mux audio into an already-written mp4 at save_file_path.

    Any failure should keep the silent video and only log a warning.
    N)r_   ra   rb   rc   )rz   r_   r{   rv   zMerged video saved to z5Failed to mux audio into mp4 (saved silent video): %s)r`   rk   lenry   r   loggerinfor   r   rf   warningr   )	rz   r;   r:   rb   ra   r_   rg   rv   er   r   r   _maybe_mux_audio_into_mp4   s2   r   server_argssampling_paramsc                 C   s   t || jjd}z|j}W n ty   d}Y nw |r ||jd< ||  |jdur/|jdks9|jdurE|jdkrEt	d|j d|j |S )zB
    Create a Req object with sampling_params as a parameter.
    )r   VSA_sparsityNdiffusers_kwargsr   z.Height and width must be positive, got height=z, width=)
r   attention_backend_configr   r   AttributeErrorextraadjust_sizewidthheight
ValueError)r   r   reqr   r   r   r   prepare_request  s$   


r   sample
output_idxc                 C   s   |du r| S t |tjr|jdkr|jd |kr|| nd}nt |tjr7|jdkr7|jd |kr5|| nd}|durLt | ttfrHt	| dksL| |fS | S )z9Attach per-sample audio for video outputs when available.NrM   r   )
r0   rO   rP   rZ   r[   rU   rV   rI   r1   r   )r   r;   r   r   r   r   attach_audio_to_video_sample7  s   r   )r;   ra   samples_out
audios_out
frames_outoutput_compressionoutputs	data_typesave_outputbuild_output_pathr   r   r   r   c             
   C   s  g }t | D ]~\}}||}|}|tjkrt|||}t|||||||
d}|dur/|| |durv|tjkrq|}t|tjrS|j	dkrS|j
d |krP|| nd}nt|tjrk|j	dkrk|j
d |kri|| nd}|| n|| |	dur|	| || q|S )z8Save outputs to files and return the list of file paths.)ra   r   NrM   r   )	enumerater
   VIDEOr   post_process_sampleappendr0   rO   rP   rZ   r[   rU   rV   )r   r   rb   r   r   r;   ra   r   r   r   r   output_pathsidxoutputrz   r   r:   
audio_itemr   r   r   save_outputsK  s<   
	



r   Tc                 C   s  d}t | ttfrt| dkr| \} }d}t | tjrC|  dkr&| d} | d dd	tj
} | dddd  }	t|	}nt | tjsRtdt|  | }
|
jdkri|
jd d	v re|
d
 }
n|
d }
|
jdkrxtdt|
j |
jd d	vr|
jd d	v rt|
}| dkr|d}|d dd	tj
}|dddd  }	t|	}n|
jtj
krt|
ddd tj
}
t|
}|re|r`tjtj|dd |tjkr|dur|d nd}tj ||||! d|d t"|||||d nP|dur	|nd}t|dkrHt#|D ]0\}}|$dd}t|dkr6|d  d| d|d  }n| d| }tj%|||d qn
tj%||d |d t&'dt( | t)  |S t&'d |S )z;
    Process sample output and save video if necessary
    NrM      rL      r   zUnsupported sample type: rd   )rL   r      )N.).Nr   zUnexpected numpy sample shape: r>   r   g     o@T)exist_ok
      libx264)rb   formatcodecquality)rz   r;   r:   rb   ra   K   r|   _)r   zOutput saved to z)No output path provided, output not saved)*r0   rI   r1   r   rO   rP   dim	unsqueezerR   touint8permuterS   rT   rU   rV   	TypeErrortyperZ   r[   r   
from_numpydtyperY   rW   rq   makedirsrr   dirnamer
   r   imageiomimsaveget_default_extensionr   r   r   imwriter   r   r   r   )r   r   rb   r   rz   ra   r   r;   r:   videosarrtr   iimagepartsindexed_pathr   r   r   r   {  s   







		
r   )TNNN)>rH   rq   rm   r   r   dataclassesr   r   typingr   r   r   r   r   r	   r   rT   rU   rO   scipy.io.wavfileiowavfiler   ImportErrorimageio_ffmpegro   4sglang.multimodal_gen.configs.sample.sampling_paramsr
   r   ;sglang.multimodal_gen.runtime.pipelines_core.schedule_batchr   )sglang.multimodal_gen.runtime.server_argsr   1sglang.multimodal_gen.runtime.utils.logging_utilsr   r   r   r   r   r   r    r!   r#   r&   r   r   rI   r7   r8   rV   r`   r3   rk   ry   r   r1   r   r   r   boolr   r   r   r   r   r   <module>   s*   


3
&


	



4