o
    㥵ip                     @   s  d dl Z d dlZd dlZd dlmZ d dlZd dlZd dlZ	d dl
Z
d dlmZmZmZmZmZ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mZ d dlmZmZm Z  d dl!m"Z# d d	l$m%Z% d d
l&m'Z'm(Z( e)e*ddZ+e Z,e,dG dd deZ-e,j.ddeeeddf fddZ/e,j.ddeeeddf fddZ0e,j.ddeeeddf fddZ1dS )    N)
HTTPStatus)BodyHTTPExceptionHttpViewJSONResponseRoutesStreamResponserequest)logger)	Annotated)ServeTTSRequestServeVQGANDecodeRequestServeVQGANDecodeResponseServeVQGANEncodeRequestServeVQGANEncodeResponse)buffer_to_async_generatorget_content_typeinference_async)inference_wrapper)ModelManager)batch_vqgan_decodecached_vqgan_batch_encodeNUM_SAMPLES   z
/v1/healthc                   @   s$   e Zd Zedd Zedd ZdS )Healthc                       t ddiS Nstatusokr   cls r"   F/home/ubuntu/.local/lib/python3.10/site-packages/tools/server/views.pyget0      z
Health.getc                    r   r   r   r    r"   r"   r#   post4   r%   zHealth.postN)__name__
__module____qualname__classmethodr$   r&   r"   r"   r"   r#   r   .   s
    
r   z/v1/vqgan/encodereqT)	exclusivec                    sf   t jjj}|j}t }t|| j}t	dt | d dd t
jtdd |D dt
jdS )	Nz[EXEC] VQGAN encode time:   .2fmsc                 S   s   g | ]}|  qS r"   )tolist).0ir"   r"   r#   
<listcomp>F   s    z vqgan_encode.<locals>.<listcomp>)tokensoption)r	   appstatemodel_managerdecoder_modeltimer   audiosr
   info	ormsgpackpackbr   OPT_SERIALIZE_PYDANTIC)r+   r9   r:   
start_timer4   r"   r"   r#   vqgan_encode9   s   
 rB   z/v1/vqgan/decodec                    sx   t jjj}|j}dd | jD }t }t||}t	dt | d dd dd |D }t
jt|dt
jd	S )
Nc                 S   s   g | ]
}t j|t jd qS ))dtype)torchtensorint)r1   tokenr"   r"   r#   r3   R       z vqgan_decode.<locals>.<listcomp>z[EXEC] VQGAN decode time: r-   r.   r/   c                 S   s   g | ]
}| tj qS r"   )astypenpfloat16tobytes)r1   audior"   r"   r#   r3   V   rH   )r<   r5   )r	   r7   r8   r9   r:   r4   r;   r   r
   r=   r>   r?   r   r@   )r+   r9   r:   r4   rA   r<   r"   r"   r#   vqgan_decodeK   s   

 rN   z/v1/ttsc                    s   t jj}|j}|j}|jj}|jdkr't| j	|jkr't
tjd|j d| jr6| jdkr6t
tjdd| jrLtt| |dd| j it| jdS tt| |}t }tj|||| jd	 tt| dd| j it| jdS )
Nr   z Text is too long, max length is )contentwavz"Streaming only supports WAV formatzContent-Dispositionzattachment; filename=audio.)iterableheaderscontent_type)format)r	   r7   r8   r9   tts_inference_enginer:   sample_ratemax_text_lengthlentextr   r   BAD_REQUEST	streamingrT   r   r   r   next	inferenceioBytesIOsfwriter   getvalue)r+   	app_stater9   enginerV   fake_audiosbufferr"   r"   r#   tts_   sH   

rg   )2r^   osr;   httpr   numpyrJ   r>   	soundfiler`   rD   kui.asgir   r   r   r   r   r   r	   logurur
   typing_extensionsr   fish_speech.utils.schemar   r   r   r   r   tools.server.api_utilsr   r   r   tools.server.inferencer   r]   tools.server.model_managerr   tools.server.model_utilsr   r   rF   getenvMAX_NUM_SAMPLESroutesr   r&   rB   rN   rg   r"   r"   r"   r#   <module>   s4    $	



"