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	Z
d dlmZ d dlmZ d dlmZ d dlmZ eƒ ZdZd	ZG d
d„ deƒZG dd„ deƒZefdd„Zdd„ Zdeegfdd„Zdedefdd„Zdd„ Zdd„ Z de!de
j"defdd „Z#d!edeeef fd"d#„Z$d2d!ed$efd%d&„Z%d!efd'd(„Z&d2d!ed$efd)d*„Z'd+ee(e)f fd,d-„Z*d+ee(e)f fd.d/„Z+d0d1„ Z,dS )3é    N)ÚUnion)Úurlparse)ÚHTTPStorage)Úget_model_cache_root)Úsnapshot_download)Ú
get_loggeri€>  )z.flacz.mp3z.oggz.opusz.wavz.pcmc                   @   s   e Zd ZdZdZdZdS )ÚTtsTrainTypeztrain-type-sambertztrain-type-bertztrain-type-vocN)Ú__name__Ú
__module__Ú__qualname__ZTRAIN_TYPE_SAMBERTZTRAIN_TYPE_BERTZTRAIN_TYPE_VOC© r   r   úc/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/utils/audio/audio_utils.pyr      s    r   c                   @   s0   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
S )ÚTtsCustomParamsZ
voice_nameZam_ckptZvoc_ckptZ	am_configZ
voc_configZaudio_configZse_fileZse_modelZmvn_fileN)r	   r
   r   Z
VOICE_NAMEZAM_CKPTZVOC_CKPTZ	AM_CONFIGZ
VOC_CONFIGZAUIDO_CONFIGZSE_FILEZSE_MODELZMVN_FILEr   r   r   r   r      s    r   c           
      C   sš   g }g }t | d | d ƒD ]:\}}tt|d ƒt|d ƒƒ}|d }|d }t||d |ƒD ]}	| ||	| |	… ¡ | ||	| |	… ¡ q.q||dœS )ze
    Dataset mapping function to split one audio into segments.
    It only works in batch mode.
    ÚnoisyÚcleanÚarrayé   )r   r   )ÚzipÚminÚlenÚrangeÚappend)
ÚbatchÚsegment_lengthZnoisy_arraysZclean_arraysÚxÚyÚlengthr   r   Úoffsetr   r   r   Ú
to_segment)   s   þ
r   c                 C   sX   | d   ¡ d }d| }| | } | d }|  ¡ }|||k   ¡ d }d| }| | } | S )Né   g      à?g—&-`¸Ê¬?)Úmean)r   ZrmsZscalarZpow_xZ	avg_pow_xZrmsxZscalarxr   r   r   Ú
audio_norm:   s   r!   Ú	conf_itemc                    s’   ‡ fdd„}t | dd}| ¡ }W d   ƒ n1 sw   Y  t |dƒ}|D ]}t d||¡}| |¡ q(W d   ƒ d S 1 sBw   Y  d S )Nc                    s4   |   d¡}|ˆ v rˆ | }t|tƒst|ƒ}|S d S )Nr   )ÚgroupÚ
isinstanceÚstr)ZmatchedÚkeyÚvalue©r"   r   r   ÚreplH   s   

zupdate_conf.<locals>.replzutf-8)ÚencodingÚwz
\$\{(.*)\})ÚopenÚ	readlinesÚreÚsubÚwrite)Zorigin_config_fileÚnew_config_filer"   r)   ÚfÚlinesÚliner   r(   r   Úupdate_confF   s   

ÿþ"ÿr5   ÚwavÚreturnc                 C   sN  | }d }t |ƒdkr£d}t |ƒ}z†i }t|dd… dƒ|d< t|dd… dƒ|d< t|dd	… dƒ|d
< |d dkrˆ|d dkr|d
 dkr’t d|d	d… ¡d |d< t d|dd… ¡d |d< |d }|d d	krod}n|d dkrxd}n||fW S | ||… }W ||fS W ||fS W ||fS W ||fS  ty¢   Y ||fS w ||fS )Né,   r   é   zUTF-8ZChunkIDé   é   ZFormaté   ZSubchunk1IDZRIFFZWAVEzfmt ú<Ié   ZSubChunk1Sizeé   é   Z
SampleRateé   é.   )r   r%   ÚstructÚunpackÚ	Exception)r6   ÚdataÚsample_rateZ	frame_lenZfile_lenZheader_fieldsr   r   r   Úextract_pcm_from_wavZ   sb   ÿÿÿÿÿÿ
ÿÿ
ëëìüürH   c                 C   s`   t  d| | ¡}|d u rd S | | ¡ d … } t  d| ¡}|d u r"d S | | ¡ d … | ¡ d fS )Nz^\s*z^\s*(-?\d+\.?\d*e?-?\d*?)r   )r.   ÚmatchÚendÚgroups)ÚinstrÚtokenZfirst_tokenÚlrr   r   r   Úexpect_token_number}   s   rO   c                 C   sx   |   dd¡}|   d|¡}g }| |d |…  d¡D ]}tj|tjdd}|jdkr.| |¡ q| |d d … t |¡fS )Nú[r   ú]r   Ú
ú )ÚdtypeÚsep)ÚfindÚsplitÚnpZ
fromstringZfloat32Úsizer   r   )rL   Úpos2Zpos3ZmatZsttZtmp_matr   r   r   Úexpect_kaldi_matrixˆ   s   

€r[   ÚfsrF   c              	   C   sÒ  |j j}|dks|dks|dkr|j jdkstd|j › ƒ‚tƒ }|d7 }|d7 }|d7 }|d	7 }|dkr8d
}nd}|jdkrBd}n|jd }|j jd }| |d  | }||d  }t d||| |||¡}	|dksr|dksr|	d7 }	|t dt	|	ƒ¡7 }||	7 }|dks˜|dks˜|d7 }|t dd|jd ¡7 }t	|ƒd d|j
  dkr©tdƒ‚|d7 }|t d|j
¡7 }|j jdksÇ|j jdkrËtjdkrË| ¡ }|| ¡  d¡j7 }t	|ƒ}
t d|
d ¡|dd…< t|ƒS )NÚir2   Úur   zUnsupported data type s   RIFFs       s   WAVEs   fmt é   r:   z<HHIIHHs     r=   s   factz<IIr9   r   l   ÿÿ z!Data exceeds wave file size limits   dataú>ú=ÚbigÚb)rT   ÚkindÚitemsizeÚ
ValueErrorÚ	bytearrayÚndimÚshaperC   Úpackr   ÚnbytesÚ	byteorderÚsysÚbyteswapZravelÚviewrF   Úbytes)r\   rF   ZdkindZheader_dataZ
format_tagZchannelsZ	bit_depthZbytes_per_secondZblock_alignZfmt_chunk_datarY   r   r   r   Úndarray_pcm_to_wav–   sN   

ÿ
rq   Úurlc                 C   sT   d }t | ƒ}|jd ur$t|jƒdkr$tƒ }| | ¡}t|ƒ\}}||fS | }||fS )Nr   )r   Úschemer   r   ÚreadrH   )rr   rG   ÚresultÚstoragerF   r   r   r   Úload_bytes_from_urlÆ   s   
þrw   r&   c           
      C   sÚ   d }d }t j | ¡r| }||fS |  d¡rit| ƒ}|jd urit|jƒdkritƒ }| | ¡}t	 
¡ j}t j |¡s=t  |¡ t j |t j | ¡¡}t|dƒ}	|	 |¡ W d   ƒ ||fS 1 s`w   Y  ||fS ||fS )NÚhttpr   Úwb)ÚosÚpathÚexistsÚ
startswithr   rs   r   r   rt   ÚtempfileÚTemporaryDirectoryÚnameÚmakedirsÚjoinÚbasenamer,   r0   )
rr   r&   Úwav_scp_pathÚ
raw_inputsru   rv   rF   Úwork_dirÚwav_pathZfbr   r   r   Úgenerate_scp_from_urlÓ   s*   




ÿþrˆ   c                 C   s  d }d }t j | ¡s|  d¡s| }||fS t j | ¡r/|  ¡  d¡s)|  ¡  d¡r/| }||fS t| ƒ}|jd urƒt|jƒdkrƒt	ƒ }| 
| ¡}t ¡ j}t j |¡sWt  |¡ t j |t j | ¡¡}t|dƒ}| |¡ W d   ƒ ||fS 1 szw   Y  ||fS ||fS )Nrx   z.txtú.scpr   ry   )rz   r{   r|   r}   ÚlowerÚendswithr   rs   r   r   rt   r~   r   r€   r   r‚   rƒ   r,   r0   )rr   Ztext_file_pathr…   ru   rv   rF   r†   Úfpr   r   r   Úgenerate_text_from_urlì   s2   ÿ



ÿþr   c           
      C   s  d }|d ur|nt j | ¡}t j | ¡r|  ¡  d¡r| }|S t j | ¡rk|  ¡  t¡rk| }t ¡ j	}t j |¡s>t  
|¡ t j |d¡}t|dƒ}d ||g¡d }| |¡ W d   ƒ |S 1 sdw   Y  |S t| ƒ}|jd ur…t|jƒdkr…tƒ }	|	 | ¡}|S |S )Nr‰   zwav.scpr+   ú	rR   r   )rz   r{   rƒ   r|   rŠ   r‹   ÚSUPPORT_AUDIO_TYPE_SETSr~   r   r€   r   r‚   r,   Ú
writelinesr   rs   r   r   rt   )
rr   r&   r„   Zwav_namer‡   r†   ÚftZscp_contentru   rv   r   r   r   Úgenerate_scp_for_sv	  s0   


þý
r’   Úurlsc                 C   s(   g }| D ]}t |dd}| |¡ q|S )zK
    generate audio_scp files from url input for speaker verification.
    Ztest1)r&   )r’   r   )r“   Ú
audio_scpsrr   Ú	audio_scpr   r   r   Úgenerate_sv_scp_from_url%  s
   r–   c                 C   s€   g }| D ]9}t j |¡r| ¡  t¡r|}n"t|ƒ}|jdur1t|jƒdkr1t	ƒ }| 
|¡}|}ntd |¡ƒ‚| |¡ q|S )zJ
    generate audio_scp files from url input for speaker diarization.
    Nr   zCan't download from {}.)rz   r{   r|   rŠ   r‹   r   r   rs   r   r   rt   rf   Úformatr   )r“   r”   rr   r•   ru   rv   Z	wav_bytesr   r   r   Úgenerate_sd_scp_from_url0  s   ÿ
r˜   c           	   
   C   s"  d|v r
|d s
d S d }d|v r|d dkrd }n|d }|   d¡rŠ| d }tƒ }t|tƒr„tj |¡r†| |¡sˆz0tj |d| ¡}tj 	|¡}tj
|dd tj |¡s`t tj |¡|¡ t|||d W d S  tyƒ } zt t|ƒ¡ W Y d }~d S d }~ww d S d S d S t d¡ d S )	NZupdate_modelZlatestÚmodelz.cache/T)Úexist_ok)Ú	cache_dirÚrevisionz(Can not find model name in configuration)Ú__contains__r   r$   r%   rz   r{   r|   r}   r‚   Údirnamer   ÚsymlinkÚabspathr   rE   ÚloggerÚwarning)	Zmodel_configZ
model_pathÚ
extra_argsZmodel_revisionZ
model_nameZdst_dir_rootÚdstZdst_dirÚer   r   r   Úupdate_local_modelE  s@   
ÿÿý€ÿór¦   )N)-rz   r.   rC   rm   r~   Útypingr   Úurllib.parser   ÚnumpyrX   Zmodelscope.fileio.filer   Zmodelscope.utils.file_utilsr   Zmodelscope.utils.hubr   Zmodelscope.utils.loggerr   r¡   ZSEGMENT_LENGTH_TRAINr   Úobjectr   r   r   r!   r%   r5   rp   rH   rO   r[   ÚintZndarrayrq   rw   rˆ   r   r’   ÚtupleÚlistr–   r˜   r¦   r   r   r   r   Ú<module>   s>   #0