o
    ݈hX                     @   s   d Z ddlZddlZddlZddlmZmZ ddlm	Z	m
Z
mZ dZdZdZdZ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S )a.  
This file contains functions for make ASS-format subtitle files based on the generated alignment.
ASS files can be generated highlighting token-level alignments or word-level alignments.
In both cases, 'segment' boundaries will be used to determine which parts of the text will appear
at the same time. 
For the token-level ASS files, the text will be highlighted token-by-token, with the timings determined 
by the NFA alignments. 
For the word-level ASS files, the text will be highlighted word-by-word, with the timings determined
by the NFA alignemtns.
    N)BLANK_TOKENSPACE_TOKEN)SegmentTokenWordi  i   
      c                 C   s   t | } t| d\}}t|d\}}tt|}t|dkr"d| }tt|}t|dkr2d| }|d}t|dd dkrEd| }| d| d| }|S )N<      0z.2f.r   :)floatdivmodstrroundlensplit)seconds_floatmmss_decimalshhsrt_format_time r   ]/var/www/eduai.edurigo.com/doc_train/edurigo_ai/Puru/tts/BhasaAnuvaad/utils/make_ass_files.pyseconds_to_ass_format(   s   r   c                 C   s    | \}}}|d|d|dS )Nxr   )rgb_listrgbr   r   r   rgb_list_to_hex_bgr>   s   
r!   c                 C   sr   | j s| S |jrt| |} t| j}|j|j }W d    n1 s$w   Y  t| |||} t	| |||} | S )N)
segments_and_tokensresegment_text_to_fill_spaceresegment_utt_objsf	SoundFileaudio_filepathframes
sampleratemake_word_level_ass_filemake_token_level_ass_file)utt_objoutput_dir_rootass_file_configf	audio_durr   r   r   make_ass_filesC   s   
r1   c                 C   s,   d}| j D ]}|jtkr|t|j7 }q|S )Nr   )tokenstextr   r   )wordn_charstokenr   r   r   _get_word_n_charsZ   s   

r7   c                 C   s@   d}| j D ]}|jtkr|d7 }q|jtkr|t|j7 }q|S )Nr   r
   )words_and_tokensr3   r   r   r   )segmentr5   word_or_tokenr   r   r   _get_segment_n_charsb   s   



r;   c                 C   sp  g }| j D ]}t|tu r||j q|| qtt t |j	d  }t
t |j	d  }||jkr6|j}t|| }g }d}|D ]}	t|	tu rT||	 |d7 }qB |t  |t|k r|| }	t|	tu r|d jsy|d j|	 n0t|	}
t|d }|
| |k r|d j|	 n|t  |d j|	 n|d j|	 |d7 }|t|k sa|| _ | S )Ng333333?gffffff?r   r
   )r"   typer   extendr8   append
PLAYERRESXMARGINLMARGINRfontsize
PLAYERRESYMARGINVmax_lines_per_segmentintr   r   r   r7   r;   )r,   r.   all_words_and_tokenssegment_or_tokenapprox_chars_per_lineapprox_lines_per_segmentmax_chars_per_segmentnew_segments_and_tokensall_words_and_tokens_pointerr:   this_word_n_charssegment_so_far_n_charsr   r   r   r$   l   sL   





r$   c                  C   s  i dddddt |jddddd	d
dd
dddddddddddddddddddddd t tt tt tdd}|jdkrQd|d< n|jdkr[d|d< n|jdkred |d< ntd!tj	|d"d#}tj
|d$d% tj	|| j d&}d't|j d( }d't|j d( }d't|j d( }	t|d)}
d*d+	|  }d,d-	|  }|
d.t d/t d0| d1| d2	 g }| jD ]}t|tu r|}|jD ]}t|tu r|| q nq|	d3	d4d5 |D  d6 }d7td8 d-t|d8 j d9|  }|
|d1  | jD ]}t|tu r|}g }|jD ]}t|tu r6|| q(t|D ]\}}d3	d:d5 |d | D }|d;krW|d37 }|| d6 }|t |d< k ryd3d3	d=d5 ||d< d  D  }nd;}|	| d6 }||j! d6 }||j! d6 }d7t|j d-t|j" d9| | |  }|
|d1  |t |d< k rt#|| j"}t#||d<  j}|| d>krd7t| d-t| d9| | |  }|
|d1  q<qg }| jd d d? D ]!}t|tu r|}|jD ]}t|tu r|| q nq|d3	d@d5 |D  d6 }d7t|d? j" d-tt$%|d<  d9|  }|
|d1  W d    n	1 sRw   Y  || j&dA< | S )BNNameDefaultFontnameArialFontsizePrimaryColour&HffffffSecondaryColourOutlineColour&H0
BackColourBoldr   Italic	Underline	StrikeOutScaleX100ScaleYSpacingAngleBorderStyle1OutlineShadow	AlignmentMarginLMarginRMarginVEncodingtop8rj   center5bottom2>got an unexpected value for ass_file_config.vertical_alignmentasswordsTexist_ok.ass{\c&H&}wFormat: , Style: ,+[Script Info]
ScriptType: v4.00+
PlayResX: 
PlayResY: z

[V4+ Styles]

\

[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text

 c                 S      g | ]}|j qS r   r3   .0r   r   r   r   
<listcomp>       z,make_word_level_ass_file.<locals>.<listcomp>{\r}Dialogue: 0,r   ,Default,,0,0,0,,c                 S   r   r   r   r   r   r   r   r     r    r
   c                 S   r   r   r   r   r   r   r   r     r   MbP?r<   c                 S   r   r   r   r   r   r   r   r   =  r   words_level_ass_filepath)'r   rC   rA   rB   rE   vertical_alignment
ValueErrorospathjoinmakedirsutt_idr!   text_already_spoken_rgbtext_being_spoken_rgbtext_not_yet_spoken_rgbopenkeysvalueswriter@   rD   r"   r=   r   r8   r   r?   r   t_startrstrip	enumerater   r3   t_endr   mathceilsaved_output_files) r,   r-   r.   r0   default_style_dict
output_diroutput_filealready_spoken_color_codebeing_spoken_color_codenot_yet_spoken_color_coder/   default_style_top_linedefault_style_bottom_linewords_in_first_segmentrI   first_segmentr:   text_before_speechsubtitle_textr9   words_in_segmentword_ir4   text_before
text_afteraligned_textaligned_text_offlast_word_endnext_word_startwords_in_final_segmentfinal_segmenttext_after_speechr   r   r   r*      s$  
	













&

(
jr*   c                 C   s  i dddddt |jddddd	d
dd
dddddddddddddddddddddd t tt tt tdd}|jdkrQd|d< n|jdkr[d|d< n|jdkred |d< ntd!tj	|d"d#}tj
|d$d% tj	|| j d&}d't|j d( }d't|j d( }d't|j d( }	t|d)'}
d*d+	|  }d,d-	|  }|
d.t d/t d0| d1| d2	 g }| jD ]1}t|tu r|jD ]#}t|tu r|jtkr|| q|jD ]}|jtkr|| qq nq|D ]}|j d3d4|_|j t!d4|_q|	d5	d6d7 |D  d8 }d9t"d: d-t"|d: j# d;|$  }|
|d1  | jD ]}t|tu r:|}g }|jD ])}t|tu rh|jtkrf|| qR|jD ]}|jtkrx|| qkqR|D ]}|j d3d4|_|j t!d4|_q~t%|D ]\}}d5	d<d7 |d | D }|| d8 }|t&|d= k rd5	d>d7 ||d= d  D }nd5}|	| d8 }||j d8 }||j d8 }d9t"|j# d-t"|j' d;| | |$  }|
|d1  |t&|d= k r8t(|| j'}t(||d=  j#}|| d?kr8d9t"| d-t"| d;| | |$  }|
|d1  qqBg }| jd d d@ D ]9}t|tu r~|jD ])}t|tu rh|jtkrf|| qR|jD ]}|jtkrx|| qkqR nqF|D ]}|j d3d4|_|j t!d4|_q|d5	dAd7 |D  d8 }d9t"|d@ j' d-t"t)*|d=  d;|$  }|
|d1  W d    n	1 sw   Y  || j+dB< | S )CNrQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ro   rp   rj   rq   rr   rs   rt   ru   rv   r2   Trx   rz   r{   r|   r}   r~   r   r   r   r   r   z*
ScaledBorderAndShadow: yes

[V4+ Styles]
r   r   u   ▁r   r   c                 S   r   r   
text_casedr   r   r   r   r     r   z-make_token_level_ass_file.<locals>.<listcomp>r   r   r   r   c                 S   r   r   r   r   r   r   r   r     r   r
   c                 S   r   r   r   r   r   r   r   r     r   r   r<   c                 S   r   r   r   r   r   r   r   r     r   tokens_level_ass_filepath),r   rC   rA   rB   rE   r   r   r   r   r   r   r   r!   r   r   r   r   r   r   r   r@   rD   r"   r=   r   r8   r   r3   r   r?   r2   r   replacer   r   r   r   r   r   r   r   r   r   r   )r,   r-   r.   r0   r   r   r   r   r   r   r/   r   r   tokens_in_first_segmentrI   r:   r6   r   r   r9   tokens_in_segmenttoken_ir   r   r   r   last_token_endnext_token_starttokens_in_final_segmentr   r   r   r   r+   L  sf  
	


















"



(  
r+   )__doc__r   r   	soundfiler%   utils.constantsr   r   utils.data_prepr   r   r   r@   rD   rA   rB   rE   r   r!   r1   r7   r;   r$   r*   r+   r   r   r   r   <module>   s(   
D 