o
    W+ i.  ã                   @   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   ún/home/app/PaddleOCR-VL-test/.venv_paddleocr/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ÚnpÚ
fromstringZfloat32Úsizer   r   )rL   Úpos2Zpos3Ú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_datarZ   r   r   r   Úndarray_pcm_to_wav–   sN   

ÿ
rs   Ú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   )rt   rG   ÚresultÚstoragerF   r   r   r   Úload_bytes_from_urlÆ   s   
þry   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   ru   r   r   rv   ÚtempfileÚTemporaryDirectoryÚnameÚmakedirsÚjoinÚbasenamer,   r0   )
rt   r&   Úwav_scp_pathÚ
raw_inputsrw   rx   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 )Nrz   z.txtú.scpr   r{   )r|   r}   r~   r   ÚlowerÚendswithr   ru   r   r   rv   r€   r   r‚   rƒ   r„   r…   r,   r0   )rt   Ztext_file_pathr‡   rw   rx   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   )r|   r}   r…   r~   rŒ   r   ÚSUPPORT_AUDIO_TYPE_SETSr€   r   r‚   rƒ   r„   r,   Ú
writelinesr   ru   r   r   rv   )
rt   r&   r†   Zwav_namer‰   rˆ   ÚftZscp_contentrw   rx   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_scpsrt   Ú	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 {}.)r|   r}   r~   rŒ   r   r‘   r   ru   r   r   rv   rh   Úformatr   )r•   r–   rt   r—   rw   rx   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%   r|   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)-r|   r.   rC   ro   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   rr   rH   rO   r]   ÚintZndarrayrs   ry   rŠ   r   r”   ÚtupleÚlistr˜   rš   r¨   r   r   r   r   Ú<module>   s>   #0