o
    
j"                     @   s  d dl Z d dlZd dlZd dlZd dlZd dlmZ d dl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 d dlmZ d d	lmZ d
d Ze  Zeejd ZeeZej rke   e!  dZ"dZ#dZ$dZ%dZ&ej re   e!  ej'durej"se(ej'\Z"Z#Z)ej*du re)d nej*e_*ej*durej%se(ej*\Z%Z&Z+ej"durej"Z"ej#Z#ej$Z$ej%durej%Z%ej&Z&ee"e#e$de%e&ddej,d	Z-e.e-j/doe-j/j0dkpe-j1duZ2e3e-j/ddZ4e.e-j/doe-j/j5dkpe-j6duZ7e3e-j/ddZ8e-j9:ddZ;ee<Z=de>de
e>e?f fddZ@e=Addd ZBe=Addd  ZCe ZDe=jAd!d"d#gd$d%d& ZEe=jAd'd"gd$d(d) ZFe=jAd*d"gd$d+d, ZGe=jAd-d"d#gd$d.d/ ZHd0d1 ZIe<d2krseI  dS dS )3    N)Path)Lock)Union)parse_qs)Flaskrender_templaterender_template_stringrequest	send_file)load_config)ModelManager)Synthesizerc                  C   s   dd } t  }|jd| ddddd |jd	td
dd |jdtd dd |jdd tdd |jdtd dd |jdtdd d |jdtdd d |jdtdd d |jdtddd |jd| ddd |jd | dd!d |jd"| dd#d |S )$Nc                 S   s   |   dv S )N)true1yes)lower)x r   D/home/kuhnn/.local/lib/python3.10/site-packages/TTS/server/server.pyconvert_boolean   s   z)create_argparser.<locals>.convert_booleanz--list_models?TFz2list available pre-trained tts and vocoder models.)typenargsconstdefaulthelpz--model_namez$tts_models/en/ljspeech/tacotron2-DDCzUName of one of the pre-trained tts models in format <language>/<dataset>/<model_name>)r   r   r   z--vocoder_namez+name of one of the released vocoder models.z--config_pathzPath to model config file.)r   r   r   z--model_pathzPath to model file.z--vocoder_pathzPath to vocoder model file. If it is not defined, model uses GL as vocoder. Please make sure that you installed vocoder library before (WaveRNN).)r   r   r   z--vocoder_config_pathz"Path to vocoder model config file.z--speakers_file_pathz"JSON file for multi-speaker model.z--porti  zport to listen on.z
--use_cudaztrue to use CUDA.z--debugz true to enable Flask debug mode.z--show_detailszGenerate model detail page.)argparseArgumentParseradd_argumentstrint)r   parserr   r   r   create_argparser   sJ   r"   z../.models.jsondefault_vocoder )	tts_checkpointtts_config_pathtts_speakers_filetts_languages_filevocoder_checkpointvocoder_configencoder_checkpointencoder_configuse_cudanum_speakers   speaker_managernum_languageslanguage_manageruse_gstF	style_wavreturnc                 C   s0   | rt j| r| dr| S t| } | S dS )a  Transform an uri style_wav, in either a string (path to wav file to be use for style transfer)
    or a dict (gst tokens/values to be use for styling)

    Args:
        style_wav (str): uri

    Returns:
        Union[str, dict]: path to file (str) or gst style (dict)
    z.wavN)ospathisfileendswithjsonloads)r4   r   r   r   style_wav_uri_to_dict   s   

r<   /c                	   C   s:   t dtjtttd urtjnd td urtjtdS d tdS )Nz
index.html)show_detailsuse_multi_speakeruse_multi_languagespeaker_idslanguage_idsr3   )	r   argsr>   r?   r@   r0   
name_to_idr2   r3   r   r   r   r   index   s   rE   z/detailsc                  C   s   t jd urtjt jrtt j} n	t jd urtt} t jd ur-tjt jr-tt j}nt jd ur7tt}nd }t	dt j
| |t jdS )Nzdetails.html)r>   model_configr*   rC   )rC   config_pathr6   r7   r8   r   
model_namevocoder_config_pathvocoder_namer   r>   __dict__)rF   r*   r   r   r   details   s    


rL   z/api/ttsGETPOST)methodsc                  C   s   t h tjdptjdd} tjdptjdd}tjdp)tjdd}tjdp6tjdd}t|}td	|   td
|  td|  tj| |||d}t	
 }t|| W d    n1 smw   Y  t|ddS )Ntextr$   z
speaker-id
speaker_idzlanguage-idlanguage_idz	style-wavr4    > Model input: z > Speaker Idx: z > Language Idx: )speaker_namelanguage_namer4   	audio/wavmimetype)lockr	   headersgetvaluesr<   printsynthesizerttsioBytesIOsave_wavr
   )rP   speaker_idxlanguage_idxr4   wavsoutr   r   r   r_      s   r_   z/localesc                  C   s0   t jdurt jd} ng d} td| d dS )z$MaryTTS-compatible /locales endpointNr=   r$   enr$   r   z{{ locale }}
r/   )localerC   rH   splitr   model_detailsr   r   r   mary_tts_api_locales   s   
rn   z/voicesc                  C   s8   t jdurt jd} ng d} td| d | d ddS )	z#MaryTTS-compatible /voices endpointNr=   rg   z%{{ name }} {{ locale }} {{ gender }}
   r/   u)nameri   genderrj   rl   r   r   r   mary_tts_api_voices   s   
rs   z/processc                  C   s   t < tjdkrttjdd} | ddgd }ntjdd}td|  t	|}t
 }t|| W d   n1 sAw   Y  t|d	d
S )z$MaryTTS-compatible /process endpointrN   T)as_text
INPUT_TEXTr$   r   rS   NrV   rW   )rY   r	   methodr   get_datar[   rC   r]   r^   r_   r`   ra   rb   r
   )datarP   re   rf   r   r   r   mary_tts_api_process   s   

ry   c                   C   s   t jtjdtjd d S )Nz::)debughostport)apprunrC   rz   r|   r   r   r   r   main   s   r   __main__)Jr   r`   r:   r6   syspathlibr   	threadingr   typingr   urllib.parser   flaskr   r   r   r	   r
   
TTS.configr   TTS.utils.manager   TTS.utils.synthesizerr   r"   
parse_argsrC   __file__parentr7   managerlist_modelsexit
model_pathrG   speakers_file_pathvocoder_pathrI   rH   download_model
model_itemrJ   _r-   r^   hasattr	tts_modelr.   r'   r?   getattrr0   r1   r(   r@   r2   
tts_configr[   r3   __name__r}   r   dictr<   routerE   rL   rY   r_   rn   rs   ry   r   r   r   r   r   <module>   s   
-










