o
    )j.                     @   s  d dl mZmZmZmZ d dlZd dlZ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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mZmZ d dlmZmZmZm Z  d dl!m"Z" d d	l#m$Z$ d
dl%m&Z& dgZ'e$ Z(ej)e"j*ej+dG dd deZ,dS )    )absolute_importdivisionprint_functionunicode_literalsN)Models)Model)MODELS)TtsCustomParamsTtsTrainTypendarray_pcm_to_wav)$TtsFrontendInitializeFailedException'TtsFrontendLanguageTypeInvalidExceptionTtsModelConfigurationExceptionTtsVoiceNotExistsException)Tasks)
get_logger   )VoiceSambertHifigan)module_namec                       s   e Zd Z fddZdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Z				dddZddedefddZ  ZS )r   c           	         s  t  j|g|R i | || _|dd| _d| _d|v r*|d }t|tr*|| _d| _d|v rCd|d v rC|d d dd | _| 	||d	i \| _
| _| _t| j
d
kset| jdg d
kritd| jd rw| jd d
 | _ntdtjdkrtdd
d l}| }tj|d}tj|d| _t|d}|| W d    n1 sw   Y  || jstd| j|| jst d| j|| _!d S )Nsample_ratei>  Fis_trainamZlinguistic_unitZhas_maskTcustom_ckptr   voiceszmodelscope error: voices emptyz0modelscope error: voices is empty in voices.json)      z"Python version needs to be <= 3.10zresource.zipresourcerz&modelscope error: resource invalid: {}z+modelscope error: language type invalid: {})"super__init__	model_dirgetr   r   
isinstanceboolignore_mask
load_voicer   	voice_cfg	lang_typelenr   default_voice_namesysversion_infoImportErrorttsfrdZTtsFrontendEngineospathjoinZres_pathzipfileZipFile
extractallZ
initializer   formatZset_lang_typer   frontend)	selfr!   argskwargsr   r.   r6   zip_fileZzip_ref	__class__ i/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/models/audio/tts/sambert_hifi.pyr    '   sX   
$



zSambertHifigan.__init__c           
      C   s   t jt jt jt jt jf}i }i }d}|D ]}||vr!td| q|t j }t|||| j| j	d}	|	||< |g|d< |	j
}|||fS )NPinYinzcustom ckpt must have: )
voice_name
voice_pathr   r%   r   r   )r	   Z
VOICE_NAMEZAM_CKPTZVOC_CKPTZ	AM_CONFIGZ
VOC_CONFIGZTtsModelNotExistsExceptionr   r%   r   r(   )
r7   r!   r   Znecessary_filesr   Z
voices_cfgr(   kr@   voicer=   r=   r>   build_voice_from_customQ   s2   


z&SambertHifigan.build_voice_from_customc                 C   s   i }t j|d}t j|d}d}t|dkr| ||S t j|r*t j|s/|i |fS t|ddd}t|}W d    n1 sFw   Y  d|vrT|i |fS |d D ]!}	t j||	}
t j|
shqXt	|	|
| j
| jd||	< ||	 j}qX|||fS )	Nr   voices.jsonr?   r   r   utf-8encoding)r%   r   )r/   r0   r1   r)   rD   existsopenjsonloadr   r%   r   r(   )r7   r!   r   r   Zvoices_pathvoices_json_pathr(   fr'   namerA   r=   r=   r>   r&   h   s6   



zSambertHifigan.load_voicec                 C   s   t j| jdd}t j|rt | i }g |d< | j D ]	}|d | qt	|ddd}t
|| W d    d S 1 sBw   Y  d S )Nr   rE   wrF   rG   )r/   r0   r1   r!   rI   remover   keysappendrJ   rK   dump)r7   rM   save_voicesrB   rN   r=   r=   r>   rU      s   
"zSambertHifigan.save_voicesc                 C   s   | j | jfS N)r   r'   )r7   r=   r=   r>   
get_voices   s   zSambertHifigan.get_voicesc                 C   s6  t j| jd|}t j|rt| t j|dd |r/t j|r/t j|r/t	|| t j|d}t j|d}|rXt j|rXt jt
rXt j|d}t	|| |rst j|rst jtrst j|d}	t	||	 t j|d}
t j|d}t j|
dd t j|dd t||dd| j|< d S )	Nr   T)exist_okr   Zvoczconfig.yamlZckpt)r@   rA   Zallow_empty)r/   r0   r1   r!   rI   shutilrmtreemakedirsisfilecopy	am_config
voc_configr   r   )r7   r@   audio_configam_config_pathvoc_config_pathZvoice_name_pathZvoice_am_pathZvoice_voc_pathZam_config_nameZvoc_config_nameZam_ckpt_pathZvoc_ckpt_pathr=   r=   r>   create_empty_voice   sB   




z!SambertHifigan.create_empty_voicec                 C      || j vrdS | j | jS N )r   r`   r7   rC   r=   r=   r>   get_voice_audio_config_path      
z*SambertHifigan.get_voice_audio_config_pathc                 C   s*   || j vrdS | j | jr| j | jS dS re   )r   Z	se_enableZse_model_pathrg   r=   r=   r>   get_voice_se_model_path   s
   
z&SambertHifigan.get_voice_se_model_pathc                 C   rd   re   )r   Zlang_dirrg   r=   r=   r>   get_voice_lang_path   ri   z"SambertHifigan.get_voice_lang_pathc                 C   s*   || j vrtd| d| j | |S )Nmodelscope error: Voice  not exists)r   r   forward)r7   r@   textr=   r=   r>   synthesis_one_sentences   s
   

z&SambertHifigan.synthesis_one_sentencesNFc                 C   s  t d |d }|d }	|d }
|d }d }|| jvrI|s&tdt d|dd	}|d
d}tj|v r=ts=t	dtj
|v rHtsHt	dn-| j| }|j}|j}|rvd|v rf|d }tj|rf|}d
|v rv|d
 }tj|rv|}td tj|v rtd tj }|tj }|||	|||| tj | }td| d  ntd tj
|v rtd tj }|tj
 }|||
|||| tj | }td| d  d S td d S )Ninfowork_dirZ
am_tmp_dirZvoc_tmp_dirdata_dirrl   rm   r^   zam_config.yamlr_   zvoc_config.yamlz*training new voice am with empty am_configz,training new voice voc with empty voc_configzStart training....zStart SAMBERT training...z%SAMBERT training spent: {:.2f} hours
g      @zskip SAMBERT training...zStart HIFIGAN training...z%HIFIGAN training spent: {:.2f} hours
zskip HIFIGAN training...)pltZset_loglevelr   r   r@   r"   r
   ZTRAIN_TYPE_SAMBERTr^   Z TtsTrainingCfgNotExistsExceptionZTRAIN_TYPE_VOCr_   ra   rb   r/   r0   rI   loggerrq   datetimenowZtrain_sambertr5   total_secondsZtrain_hifigan)r7   rC   dirsZ
train_typeZconfigs_path_dictZignore_pretrainZcreate_if_not_existsZhparamrr   Zam_dirZvoc_dirrs   Ztarget_voicera   rb   Zam_overrideZvoc_overrideZ	totaltimeZhparamsr=   r=   r>   train   s   


















zSambertHifigan.trainro   r@   c           	      C   s   | j }|d ur	|}| j|}dd | D }tjddd}|D ] }| d}| ||d }d| }tj	||
ddd	}q!t| j|S )
Nc                 S   s   g | ]}|d kr|qS )rf   r=   ).0sr=   r=   r>   
<listcomp>  s    z*SambertHifigan.forward.<locals>.<listcomp>r   Zint16)Zdtype	r   g      @)Zaxis)r*   r6   Zgen_tacotron_symbols
splitlinesnpemptystripsplitrp   rS   Zastyper   r   )	r7   ro   r@   rC   resultZtextsZaudio_totallineZaudior=   r=   r>   rn   
  s   zSambertHifigan.forward)NFFNrV   )__name__
__module____qualname__r    rD   r&   rU   rW   rc   rh   rj   rk   rp   rz   strrn   __classcell__r=   r=   r;   r>   r   #   s"    *

E)-
__future__r   r   r   r   rv   r/   rY   r+   waver2   rK   Zmatplotlib.pyplotZpyplotrt   numpyr   yamlZmodelscope.metainfor   Zmodelscope.models.baser   Zmodelscope.models.builderr   Z"modelscope.utils.audio.audio_utilsr	   r
   r   Z%modelscope.utils.audio.tts_exceptionsr   r   r   r   Zmodelscope.utils.constantr   Zmodelscope.utils.loggerr   rC   r   __all__ru   Zregister_moduleZtext_to_speechZsambert_hifiganr   r=   r=   r=   r>   <module>   s2   