o
    i                     @  s   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Zd dl	Z	d dl
mZmZ d dlmZ d@ddZd	d
 Zdd ZdAddZdBdCddZdDddZdEd!d"ZdBdFd&d'ZdGdHd,d-Z	(dGdId1d2ZdJdKd5d6ZdLd8d9ZdMd<d=Zd>d? ZdS )N    )annotationsN)defaultdict)files)Stylelazy_pinyinpad_sequencec                 C  sR   t |  t| tjd< t|  tj|  tj|  dtj	j
_dtj	j
_d S )NPYTHONHASHSEEDTF)randomseedstrosenvirontorchmanual_seedcudamanual_seed_allbackendscudnndeterministic	benchmark)r    r   F/home/ubuntu/.local/lib/python3.10/site-packages/f5_tts/model/utils.pyseed_everything   s   


r   c                 C  s   | d uS Nr   )vr   r   r   exists    s   r   c                 C  s   t | r| S |S r   )r   )r   dr   r   r   default$   s   r   package_namer   returnboolc                 C  s4   zdd l }|j| d u}|W S  ty   Y dS w )Nr   F)	importlibutil	find_spec	Exception)r   r"   package_existsr   r   r   is_package_available(   s   r'   tint['b']length
int | Nonebool['b n']c                 C  s@   t |s|  }tj|| jd}|d d d f | d d d f k S Ndevice)r   amaxr   aranger/   )r(   r*   seqr   r   r   lens_to_mask5   s    r3   seq_lenstartendc                 C  sh   |    }tj||jd }|d d d f |d d d f k}|d d d f |d d d f k }||@ S r-   )maxitemr   r1   r/   long)r4   r5   r6   max_seq_lenr2   
start_maskend_maskr   r   r   mask_from_start_end_indices=   s
     r=   frac_lengths
float['b']c                 C  sF   ||    }| | }t|}||   jdd}|| }t| ||S )Nr   min)r9   r   	rand_likeclampr=   )r4   r>   lengths	max_startrandr5   r6   r   r   r   mask_from_frac_lengthsE   s   
rG   float['b n d']maskfloat['b d']c                 C  sl   t |s
| jddS t|d d d d d f | tjd| jd} | jdd}| jdd}||jdd S )N   )dimg        r.   g      ?r@   )	r   meanr   wheretensorr/   sumfloatrC   )r(   rI   numdenr   r   r   maybe_masked_meanP   s   ,rT   text	list[str]int['b nt']c                 C  s    dd | D }t ||dd} | S )Nc                 S  s    g | ]}t g t|d qS )UTF-8)r   rO   bytes.0r(   r   r   r   
<listcomp>]   s     z&list_str_to_tensor.<locals>.<listcomp>Tpadding_valuebatch_firstr   )rV   r_   list_tensorsr   r   r   list_str_to_tensor\   s   rb   list[str] | list[list[str]]vocab_char_mapdict[str, int]c                   s$    fdd| D }t ||dd} | S )Nc                   s$   g | ]}t  fd d|D qS )c                   s   g | ]}  |d qS r   )get)r\   crd   r   r   r]   h   s    z.list_str_to_idx.<locals>.<listcomp>.<listcomp>)r   rO   r[   ri   r   r   r]   h   s   $ z#list_str_to_idx.<locals>.<listcomp>Tr^   r   )rV   rd   r_   list_idx_tensorsr   ri   r   list_str_to_idxc   s   rk   pinyin	tokenizerc                 C  s(  |dv rRt jtdd|  d| d}t|ddd}i }t|D ]\}}|||d	d
 < q$W d	   n1 s;w   Y  t|}|d dksNJ d||fS |dkr^d	}d}||fS |dkrt| ddd}i }t|D ]\}}|||d	d
 < qpW d	   n1 sw   Y  t|}||fS )aI  
    tokenizer   - "pinyin" do g2p for only chinese characters, need .txt vocab_file
                - "char" for char-wise tokenizer, need .txt vocab_file
                - "byte" for utf-8 tokenizer
                - "custom" if you're directly passing in a path to the vocab.txt you want to use
    vocab_size  - if use "pinyin", all available pinyin types, common alphabets (also those with accent) and symbols
                - if use "char", derived from unfiltered character & symbol counts of custom dataset
                - if use "byte", set to 256 (unicode byte range)
    )rl   charf5_ttsz
../../data_z
/vocab.txtrzutf-8)encodingNrU    r   zHmake sure space is of idx 0 in vocab.txt, cuz 0 is used for unknown charbyte   custom)r   pathjoinr   joinpathopen	enumeratelen)dataset_namerm   tokenizer_pathfrd   irn   
vocab_sizer   r   r   get_tokenizerp   s0   
$	r   Tc              
   C  sN  g }t dddddd}dd }| D ]}g }||}t|D ]}}tt|d}|t|krG|rA|dkrA|d	 d
vrA|d || q!|rs|dt| krst	|t
jdd}	t|D ]\}
}||rj|d ||	|
  q]q!|D ](}t|dk r|| qu||r|d |t	|t
jdd qu|| quq!|| q|S )N,"');u   “u   ”u   ‘u   ’c                 S  s   d|   ko	dkS   S )Nu   ㄀u   鿿r   )rh   r   r   r   
is_chinese   s   z*convert_char_to_pinyin.<locals>.is_chineserY   rK   rU   z :'"rs      T)styletone_sandhiru   )r   	maketrans	translaterjiebacutr|   rZ   appendextendr   r   TONE3r{   ord)	text_list	polyphonefinal_text_listcustom_transr   rV   	char_listsegseg_byte_lenseg_r   rh   r   r   r   convert_char_to_pinyin   s>   



r      
   c                 C  sf   t t}tt| | d D ]}| |||  }||  d7  < q| D ]\}}||kr0 dS q%dS )NrK   TF)r   intranger|   items)rV   r*   	tolerancepattern_countr   patterncountr   r   r   repetition_found   s   r   c                 C  sj   d}g dg dg dg dg dg dd}| | g }|s+tjd	d
| d
 ||dS |tj|||d S )Ng      ?)r   r                )r   r   r      r   r   r   )r   r   r   r   r   r      r   )r   r   r   r   r      r      r      r   )r   r   r   r   r   r   r      r   r   r   r   r   )r   rK   r   r   r      r      r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   rK   )r/   dtype)rg   r   linspacerO   )nr/   r   dtpredefined_timestepsr(   r   r   r   get_epss_timesteps   s   r   rf   )r   r   r    r!   r   )r(   r)   r*   r+   r    r,   )r4   r)   r5   r)   r6   r)   )r4   r)   r>   r?   )r(   rH   rI   r,   r    rJ   )rU   )rV   rW   r    rX   )rV   rc   rd   re   r    rX   )rl   )rm   r   )T)r   r   )
__future__r   r   r
   collectionsr   importlib.resourcesr   r   r   pypinyinr   r   torch.nn.utils.rnnr   r   r   r   r'   r3   r=   rG   rT   rb   rk   r   r   r   r   r   r   r   r   <module>   s0   





$
+