o
    Mi&                     @  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?d@ d@Zejd4erd5eini ejd6gdd7d8d9d:dAe dBdC Z e dDdE Z!ejd4erd5eini d8dFdGdH Z"e# dIdJ Z$dS )Ka  
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)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imageL40S/modelszveena3-secrets   i,  iX  i  )	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)	selfr3   r4   loggerr.   sr_pathr,   erD    rJ   Q/home/ubuntu/.cursor/worktrees/spark__SSH__216.81.248.184_/byy/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_apprN   )rF   rN   rJ   rJ   rK   serve   s   zTTSService.serveN)	r8   
__module____qualname____doc__modalenterrL   asgi_apprQ   rJ   rJ   rJ   rK   r(      s    
1r(   )r   r   r   r   r   r    r!   r"   c                  C  s   ddl m}  |  S )z
    Standalone ASGI app function.
    
    Note: Model will be loaded on first request (higher TTFB).
    For production, use TTSService class with @modal.enter.
    r   rM   rO   rM   rJ   rJ   rK   tts_api   s   rX   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versionrJ   rJ   rJ   rJ   rK   health_check   s   r]   )r   r   r!   c            	      C  s  ddl } ddl}| jdd|jdd i i d}g d}|D ];}| j|rTz| |}|dd |d	 |< W q tyS } zd
| |d	 |< W Y d}~qd}~ww d|d	 |< qg d}|D ])}zt| d|d |< W qa ty } zd| |d |< W Y d}~qad}~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)z/rootz/root/externalz/root/external/sparkttsr   r   z/root/veena3modalr      rb   zERROR: DOES_NOT_EXIST)r   zsparktts.modelszsparktts.models.audio_tokenizerr   zveena3modal.corezveena3modal.processingzveena3modal.audioOKrc   zFAILED: )	r3   sysr:   r;   r<   r=   listdirrB   
__import__)	r3   rg   resultsdirs_to_checkdrb   rI   rc   modulerJ   rJ   rK   debug_imports	  s8   



rn   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printrn   remotedumps)rq   resultrJ   rJ   rK   mainI  s   rv   )%rT   
__future__r   r3   rU   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_volumerB   AppappclsSecret
concurrentr(   functionrW   rX   r]   rn   local_entrypointrv   rJ   rJ   rJ   rK   <module>   s    $@EKQX
E


;