o
    ॵ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__TRAIN_TYPE_SAMBERTTRAIN_TYPE_BERTTRAIN_TYPE_VOC r   r   V/home/ubuntu/.local/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 )TtsCustomParams
voice_nameam_ckptvoc_ckpt	am_config
voc_configaudio_configse_filese_modelmvn_fileN)r	   r
   r   
VOICE_NAMEAM_CKPTVOC_CKPT	AM_CONFIG
VOC_CONFIGAUIDO_CONFIGSE_FILESE_MODEL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_lengthnoisy_arraysclean_arraysxylengthr$   r%   offsetr   r   r   
to_segment)   s   
r5   c                 C   sX   | d   d }d| }| | } | d }|  }|||k   d }d| }| | } | S )N   g      ?g&-`ʬ?)mean)r1   rmsscalarpow_x	avg_pow_xrmsx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)matchedkeyvaluer?   r   r   replH   s   

zupdate_conf.<locals>.replzutf-8)encodingwz
\$\{(.*)\})open	readlinesresubwrite)origin_config_filenew_config_filer?   rG   flinesliner   rF   r   update_confF   s   

"rT   wavreturnc                 C   sN  | }d }t |dkrd}t |}zi }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rt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-8ChunkID      Format   Subchunk1IDRIFFWAVEzfmt <I   SubChunk1Size      
SampleRate   .   )r*   rB   structunpack	Exception)rU   datasample_rate	frame_lenfile_lenheader_fieldsr   r   r   extract_pcm_from_wavZ   sb   

rq   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   )rL   matchendgroups)instrtokenfirst_tokenlrr   r   r   expect_token_number}   s   ry   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
fromstringfloat32sizer,   r&   )ru   pos2pos3matstttmp_matr   r   r   expect_kaldi_matrix   s   

r   fsrl   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rtd|d7 }|td|j
7 }|j jdks|j jdkrtjdkr| }|| dj7 }t	|}
td|
d |dd< t|S )NirQ   ur'   zUnsupported data type s   RIFFs       s   WAVEs   fmt    rZ   z<HHIIHHs     ra   s   factz<IIrX   r   l    z!Data exceeds wave file size limits   data>=bigb)r~   kinditemsize
ValueError	bytearrayndimshaperi   packr*   nbytes	byteordersysbyteswapravelviewrl   bytes)r   rl   dkindheader_data
format_tagchannels	bit_depthbytes_per_secondblock_alignfmt_chunk_datar   r   r   r   ndarray_pcm_to_wav   sN   


r   urlc                 C   sT   d }t | }|jd ur$t|jdkr$t }|| }t|\}}||fS | }||fS )Nr   )r   schemer*   r   readrq   )r   rm   resultstoragerl   r   r   r   load_bytes_from_url   s   
r   rD   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   r   r*   r   r   tempfileTemporaryDirectorynamemakedirsjoinbasenamerJ   rN   )
r   rD   wav_scp_path
raw_inputsr   r   rl   work_dirwav_path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rt|jdkrt	 }|
| }t j}t j|sWt | t j|t j| }t|d}|| W d    ||fS 1 szw   Y  ||fS ||fS )Nr   z.txt.scpr   r   )r   r   r   r   lowerendswithr   r   r*   r   r   r   r   r   r   r   r   rJ   rN   )r   text_file_pathr   r   r   rl   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rt|jdkrt }	|	| }|S |S )Nr   zwav.scprI   	r|   r   )r   r   r   r   r   r   SUPPORT_AUDIO_TYPE_SETSr   r   r   r   r   rJ   
writelinesr   r   r*   r   r   )
r   rD   r   wav_namer   r   ftscp_contentr   r   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.
    test1)rD   )r   r,   )r   
audio_scpsr   	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   r   r*   r   r   r   formatr,   )r   r   r   r   r   r   	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rtj|r||sz0t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 )	Nupdate_modellatestmodelz.cache/T)exist_ok)	cache_dirrevisionz(Can not find model name in configuration)__contains__r   rA   rB   r   r   r   r   r   dirnamer   symlinkabspathr   rk   loggerwarning)	model_config
model_path
extra_argsmodel_revision
model_namedst_dir_rootdstdst_direr   r   r   update_local_modelE  s@   
r   )N)-r   rL   ri   r   r   typingr   urllib.parser   numpyr   modelscope.fileio.filer   modelscope.utils.file_utilsr   modelscope.utils.hubr   modelscope.utils.loggerr   r   SEGMENT_LENGTH_TRAINr   objectr   r   r5   r>   rB   rT   r   rq   ry   r   intndarrayr   r   r   r   r   tuplelistr   r   r   r   r   r   r   <module>   s>   #0