o
    q_Ni(                     @  s  d Z ddlmZ ddlZddlZejejejeZ	ej
jdddddd	d
dddddddddddddddddddddd d!d"d#jeje	d$d%d%d&d'd(jeje	d$d%d)d*d'd(jeje	d$d%d+d,d'd(jeje	d$d-d.d'd(d/Zz
ejjd0d'd1ZW n ey   dZY nw ejd2ed3Zejd4erd5eini ejd6gdd7d8d9d:d;d<	ejd=d>d?G d@dA dAZe dBdC Zejd4erd5eini d8dDdEdF Z e! dGdH Z"dS )Ia  
Modal entrypoint for Veena3 TTS service.

Deploys a GPU-backed ASGI app with:
- True streaming TTS
- Autoscaling (0 to N containers)
- Per-container concurrency (vLLM batching)
- Memory snapshots for fast cold starts

Usage:
    # Deploy to Modal
    modal deploy veena3modal/app.py
    
    # Serve locally (for testing)
    modal serve veena3modal/app.py
    
    # Run a single function
    modal run veena3modal/app.py::tts_api
    )annotationsNz3.10)python_versionffmpeggitztorch>=2.0.0ztorchaudio>=2.0.0ztransformers>=4.35.0zvllm>=0.4.0zfastapi[standard]>=0.100.0zuvicorn[standard]>=0.23.0znumpy>=1.24.0zscipy>=1.10.0zlibrosa>=0.10.0zsoundfile>=0.12.0zpydantic>=2.0.0zprometheus_client>=0.17.0zsupabase>=2.0.0zeinops>=0.6.0zeinx>=0.2.0zomegaconf>=2.3.0zsafetensors>=0.5.0zsoxr>=0.5.0zmatplotlib>=3.8.0znatsort>=8.0.0zjoblib>=1.0.0z0pip install --no-cache-dir nvidia-ml-py3 || truetruez3/root/external/sparktts:/root/external/AP-BWE:/rootz:2025-12-25-sr-chunking-support-autoscaling-instrumentation)AUTH_BYPASS_MODE
PYTHONPATH_IMAGE_BUILD_VERSIONz0mkdir -p /root/external/sparktts/sparktts/modelsz/mkdir -p /root/external/sparktts/sparktts/utilsexternalsparktts /root/external/sparktts/sparkttsT)
local_pathremote_pathcopymodels'/root/external/sparktts/sparktts/modelsutilsz&/root/external/sparktts/sparktts/utilszAP-BWEz/root/external/AP-BWEveena3modalzveena3-models)create_if_missing
veena3-tts)nameimagez	A100-80GB/modelszveena3-secrets   i,  iX  i  F)	gpuvolumessecretsmin_containersbuffer_containersscaledown_windowtimeoutstartup_timeoutenable_memory_snapshot      )
max_inputstarget_inputsc                   @  s0   e Zd ZdZe dd Ze dd ZdS )
TTSServicez
    TTS service class with model lifecycle management.
    
    Uses @modal.enter for model loading (once per container).
    c           	   
   C  s  ddl }ddl}|j|jd |t}|d |jdd}|jdd}|j	
|s<|d	|  |d
 dS z)ddlm} |||j	
|rM|nddd|j	
|d| _|d| jj  W dS  ty } z|d|  ddl}|  W Y d}~dS d}~ww )zm
        Load TTS model when container starts.
        
        Called once per container lifecycle.
        r   N)levelu"   🚀 Starting TTS model loading...
MODEL_PATHz/models/spark_tts_4speakerAP_BWE_CHECKPOINT_DIRz/models/ap_bwe/16kto48kzModel path not found: z,TTS will return 503 until model is available)initialize_runtimecudag333333?)
model_pathsr_checkpoint_dirdevicegpu_memory_utilization	enable_sru   ✅ TTS model loaded: u   ❌ Model loading failed: )osloggingbasicConfigINFO	getLogger__name__infoenvirongetpathexistswarning veena3modal.services.tts_runtimer+   runtimemodel_version	Exceptionerror	traceback	print_exc)	selfr2   r3   loggerr-   sr_pathr+   erC    rI   Q/home/ubuntu/.cursor/worktrees/spark__SSH__216.81.248.184_/nef/veena3modal/app.py
load_model   sB   



zTTSService.load_modelc                 C  s   ddl m} | S )z?
        Return FastAPI ASGI app for serving requests.
        r   )
create_app)veena3modal.api.fastapi_apprL   )rE   rL   rI   rI   rJ   serve   s   zTTSService.serveN)	r7   
__module____qualname____doc__modalenterrK   asgi_apprN   rI   rI   rI   rJ   r'      s    
1r'   c                   C  s   ddddS )zF
    Simple health check that can be called from Modal dashboard.
    okr   z0.1.0)statusserviceversionrI   rI   rI   rI   rJ   health_check   s   rY   )r   r   r    c            
      C  s  ddl } ddl}| jdd|jdd i i i d}z/ddl}| jd| |  | jd| jd	td
d | j	 D dd d|d< W n t
yc } zdt|i|d< W Y d}~nd}~ww g d}|D ];}| j|rz| |}|dd |d |< W qj t
y } zd| |d |< W Y d}~qjd}~ww d|d |< qjg d}|D ])}	zt|	 d|d |	< W q t
y } zd| |d |	< W Y d}~qd}~ww |S )z{
    Debug function to test import paths and file structure.
    Run with: modal run veena3modal/app.py::debug_imports
    r   Nr   NOT_SET
   )
pythonpathsys_pathfilesimport_tests	env_debugHOSTNAMEMODAL_CONTAINER_IDMODAL_TASK_IDc                 S  s   g | ]	}| d r|qS )MODAL_)
startswith).0krI   rI   rJ   
<listcomp>  s    z!debug_imports.<locals>.<listcomp>2   )ra   SOCKET_HOSTNAMEPIDrb   rc   
MODAL_KEYSr`   rB   )z/rootz/root/externalz/root/external/sparkttsr   r   z/root/veena3modalr      r^   zERROR: DOES_NOT_EXIST)r   zsparktts.modelszsparktts.models.audio_tokenizerr   zveena3modal.corezveena3modal.processingzveena3modal.audioOKr_   zFAILED: )r2   sysr9   r:   r;   socketgethostnamegetpidsortedkeysrA   strr<   listdir
__import__)
r2   rp   resultsrq   rH   dirs_to_checkdr^   r_   modulerI   rI   rJ   debug_imports   sT   
	





r}   c                  C  sF   ddl } td td td t }td t| j|dd dS )	zT
    Local entrypoint for testing.
    
    Usage: modal run veena3modal/app.py
    r   NzVeena3 TTS Modal Appz(========================================u/   
🔍 Running debug_imports on GPU container...u   
📊 Debug Results:   )indent)jsonprintr}   remotedumps)r   resultrI   rI   rJ   mainD  s   r   )#rQ   
__future__r   r2   rR   r;   dirnameabspath__file__	REPO_ROOTImagedebian_slimapt_installpip_installrun_commandsenvadd_local_dirjoinadd_local_python_sourcer   Volume	from_namemodel_volumerA   AppappclsSecret
concurrentr'   functionrY   r}   local_entrypointr   rI   rI   rI   rJ   <module>   s    $@EKQX
D

J