o
    ´‹
jJ  ã                   @   sF   d dl Z d dlZd dlmZ dd„ Zdefdd„Zdd	„ Zd
d„ ZdS )é    N)ÚCoqpitc                 C   s   |   ¡ } t ddd„ | ¡S )Nz(?!^)_([a-zA-Z])c                 S   s   |   d¡ ¡ S )Né   )ÚgroupÚupper)Úm© r   úN/home/kuhnn/.local/lib/python3.10/site-packages/TTS/vocoder/models/__init__.pyÚ<lambda>	   s    zto_camel.<locals>.<lambda>)Ú
capitalizeÚreÚsub)Útextr   r   r   Úto_camel   s   r   Úconfigc              
   C   sä   d| v rd| v rt  d¡}t|dƒ}nRt  d| j ¡  ¡}| j ¡ dkr*t|dƒ}n;| j ¡ dkr7t|dƒ}n.| j ¡ d	krDt|d
ƒ}n!z
t|t| jƒƒ}W n tyd } z
td| j› dƒ|‚d}~ww td 	| j¡ƒ | 
| ¡S )z(Load models directly from configuration.Údiscriminator_modelÚgenerator_modelzTTS.vocoder.models.ganÚGANúTTS.vocoder.models.ÚwavernnÚWavernnÚganÚwavegradÚWavegradúModel z not exist!Nz > Vocoder Model: {})Ú	importlibÚimport_moduleÚgetattrÚmodelÚlowerr   ÚModuleNotFoundErrorÚ
ValueErrorÚprintÚformatÚinit_from_config)r   ÚMyModelÚer   r   r   Úsetup_model   s$   
€ÿ
r&   c                 C   s¢  t d | j¡ƒ t d| j ¡  ¡}t|t| jƒƒ}| j ¡ dv r1|d| jd ddœ| j	¤Ž}|S | j ¡ dv rN|| jd ddd	| j	d
 d| j	d d}|S | jdv rWt
dƒ‚| j ¡ dv rt|| jd ddd| j	d
 d| j	d d}|S | j ¡ dv r‘|| jd ddd	| j	d
 d| j	d d}|S | j ¡ dv r·|ddd| j	d | j	d ddd| jd ddd| j	d
 d}|S | j ¡ dv rÈ|di | j	¤Ž}|S td| j› dƒ‚) z$TODO: use config object as argumentsz > Generator Model: {}r   Úhifigan_generatorÚnum_melsr   )Úin_channelsÚout_channelsÚmelgan_generatoré   i   Úupsample_factorsé   Únum_res_blocks)r)   r*   Úproj_kernelÚbase_channelsr-   Ú
res_kernelr/   Úmelgan_fb_generatorz4melgan_fb_generator is now fullband_melgan_generatorÚmultiband_melgan_generatoré   i€  Úfullband_melgan_generatorÚparallel_wavegan_generatorÚstacksé@   é€   ç        T)r)   r*   Úkernel_sizer/   r8   Úres_channelsÚgate_channelsÚskip_channelsÚaux_channelsÚdropoutÚbiasÚuse_weight_normr-   Úunivnet_generatorr   z not implemented!Nr   )r!   r"   r   r   r   r   r   r   ÚaudioÚgenerator_model_paramsr    ÚNotImplementedError©Úcr$   r   r   r   r   Úsetup_generator"   s|   5Ìù3
Öù'âùìóüÿrJ   c                 C   sL  t d | j¡ƒ d| jv rt d¡}n
t d| j ¡  ¡}t|t| j ¡ ƒƒ}| jdv r/|ƒ }| jdv rP|| jd | jd | j	d	 | j	d
 | j	d | j	d d}| jdv rh|ddd| j	d | j	d | j	d d}| jdkr…|ddd| j	d | j	d ddddddddid }| jd!krœ|ddd| j	d dddddidd"	}| jd#kr¤|ƒ }|S )$z$TODO: use config objekt as argumentsz > Discriminator Model: {}Úparallel_waveganz1TTS.vocoder.models.parallel_wavegan_discriminatorr   Úhifigan_discriminatorÚrandom_window_discriminatorr(   Ú
hop_lengthÚuncond_disc_donwsample_factorsÚcond_disc_downsample_factorsÚcond_disc_out_channelsÚwindow_sizes)Úcond_channelsrN   rO   rP   rQ   rR   Úmelgan_multiscale_discriminatorr   )é   r.   r1   Úmax_channelsÚdownsample_factors)r)   r*   Úkernel_sizesr1   rV   rW   Ú'residual_parallel_wavegan_discriminatorr.   Ú
num_layersr8   r9   r:   r;   TÚ	LeakyReLUÚnegative_slopegš™™™™™É?)r)   r*   r<   rZ   r8   r=   r>   r?   rA   rB   Únonlinear_activationÚnonlinear_activation_paramsÚparallel_wavegan_discriminator)	r)   r*   r<   rZ   Úconv_channelsÚdilation_factorr]   r^   rB   Úunivnet_discriminator)
r!   r"   r   r   r   r   r   r   rE   Údiscriminator_model_paramsrH   r   r   r   Úsetup_discriminatora   sn   


ú
ú
ô
÷
rd   )r   r   Úcoqpitr   r   r&   rJ   rd   r   r   r   r   Ú<module>   s    ?