
    5fi                     J   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 d dl	m
Z
 d dlmZmZmZ  ed      Z e j                   dd      Zd	Zd
dgdgdZdgdgdZd ej*                         iZd Zej1                  d      d        Z	 	 d$dedeeee   f   dedee   dee   f
dZej9                  d       edd       edd       edd       fdedee   dee   fd!       Zej9                  d"       edd       edd       edd       fdedee   dee   fd#       Zy)%    N)FastAPIHTTPExceptionQuery)JSONResponse)ListDictOptionalzTTS Arena Audio Server)titleAUDIO_BASE_PATHz/root/tts_arena/audioszmetadata.csvAdamBillAlice)malefemaleRohitDivyadatac                 4    t        |       j                         S )z$Normalize text to ensure cache hits.)strstrip)texts    /root/tts_arena/main.pynormalize_textr   !   s    t9??    startupc                     	 t         j                  j                  t              r~t	        j
                  t              } d| j                  v rKd| j                  v r=| d   j                  t              | d<   | t        d<   t        dt        |        d       yt        d       yt        dt         d	       y# t        $ r}t        d
|        Y d}~yd}~ww xY w)z2Loads the single unified metadata CSV into memory.r   filename
text_cleanr   u   ✅ Metadata: Loaded z sentence mappings.u9   ⚠️ Metadata CSV missing 'text' or 'filename' columns.u   ⚠️ 'z%' not found. Audio lookups will fail.u    ❌ Critical Error Loading CSV: N)ospathexistsMETADATA_FILEpdread_csvcolumnsapplyr   dbprintlen	Exception)dfes     r   	load_datar-   %   s    677>>-(]+B #
bjj(@#%f:#3#3N#C< 6
-c"gY6IJKQRH]O+PQR 604556s$   BB7 B7 #B7 7	C CC
model_name
gender_mapsentencegendernamec           
         |s|st        dd      t        j                  d      }||j                  rt        dd      t	        |      }||d   |k(     }|j                  rt        dd	      |j
                  d
   d   }g }	|r|g}	n;|r9|j                  |g       }	|	st        dd|       t        j                  |	       d }
d }|	D ]M  }t        j                  j                  t        | ||      }t        j                  j                  |      sI|}
|} n |
s%|rd| dnd| d}t        dd| d| d|  d      	 t        |
d      5 }|j                         }t        j                   |      j#                  d      }d d d        t%        | ||d      S # 1 sw Y   xY w# t&        $ r}t        ddt)        |             d }~ww xY w)Ni  z+You must provide either 'gender' or 'name'.)status_codedetailr   i  zMetadata database not loaded.r   i  zSentence not found in index.r   r   z No speakers defined for gender: z	speaker ''zany z speakerzAudio 'z' not found for z in .rbzutf-8)modelr   speaker_foundaudio_base64)contenti  zFile processing error: )r   r'   getemptyr   ilocrandomshuffler   r    joinr   r!   openreadbase64	b64encodedecoder   r*   r   )r.   r/   r0   r1   r2   r+   
clean_sentmatchtarget_filenamecandidate_speakers
found_pathfound_speakerspeakerpotential_pathsearch_criteria
audio_fileaudio_bytesbase64_stringr,   s                      r   _get_audio_responserT   9   s    $4abb 
B	zRXX4STT)Jr,:-.E{{4RSS jjmJ/O "V	'^^FB7!C:Z[aZb8cdd)* JM% oz7O\77>>.)'J#M 15IdV1-T&;R_--=o=NdS]R^^_`
 	
X*d# 	Jz$//+K",,[9@@IM	J '*)	%
  			J 	J  X6McRSfX4VWWXs0   F* 5FF* F'#F* *	G3GGz/elevenlabs.zText content)descriptionz^(male|female)$)regexzSpecific speaker namec                 *    t        dt        | ||      S )N
elevenlabsr.   r/   r0   r1   r2   )rT   ELEVENLABS_GENDER_MAPr0   r1   r2   s      r   get_elevenlabs_audior\      s      ( r   z/parlerc                 *    t        dt        | ||      S )NparlerrY   )rT   PARLER_GENDER_MAPr[   s      r   get_parler_audior`      s      $ r   )NN)r   pandasr#   rE   r@   fastapir   r   r   fastapi.responsesr   typingr   r   r	   appgetenvr   r"   rZ   r_   	DataFramer'   r   on_eventr-   r   rT   r=   r\   r`    r   r   <module>rj      s   	    1 1 * ' ',- "))-/GH Vi  Ii  LBLLN i6 6. !GXGXS$s)^$GX GX SM	GX
 3-GXV #>:!$.?@2IJSM 3-  #>:!$.?@2IJSM 3- r   