
    &j&                        d dl Zd dlZd dlZ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  ed          ZdZ ed          Z ed          Zedz  Zedz  Zed	z  Zed
z  Zedz  ZdZdZdZdZdZdZdZdZi 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/d0d1d2d3d4d5d6d7Zd8 Zd9 Zd: Z d; Z!d< Z"d= Z#d> Z$d? Z%d@ Z&dA Z'dB Z(dC Z)dD Z*e+dEk    r e*             dS dS )F    N)PathzG/data/video-pipeline/Youtube-Video-Maker/Project/01062026-005-Ly-Nam-Dez"http://192.168.1.201:3900/generatezK/data/video-pipeline/Youtube-Video-Maker/data/voices/template1/refaudio.mp3zJ/data/video-pipeline/Youtube-Video-Maker/data/voices/template1/reftext.txtzaudio/voice_segmentszvoice_segments_manifest.jsonzlogs/step_07_tts_v2_run.logz!logs/step_07_tts_v2_manifest.jsonzscript/scenes.json      x   g)\(?g{Gz?igQ?z0.88III   IIIIV   V   VI   VII   VIII   IX	   X
   XI   XII   XIII   XIV   XV   XVI   XVII            )XVIIIXIXXXc                 0   t          j        d          | z   }t          j                            dd           t                              dd          5 }|                    |dz              d d d            n# 1 swxY w Y   t          |d           d S )	Nz%Y-%m-%d %H:%M:%S Tparentsexist_okautf-8encoding
)flush)timestrftimeLOGparentmkdiropenwriteprint)msglinefs      scripts_run_step_07_tts_v2.pylogrC   !   s    =-..4DJTD111	#	(	( A	t              	$ds   A::A>A>c                 R    t          j        dd|                                           S )Nz\s+ )resubstriptexts    rB   clean_spacesrK   )   s    6&#tzz||,,,    c                 ^    t          t          j        d| t          j                            S )Nz\w+flags)lenrF   findallUrI   s    rB   
word_countrS   -   s#    rz&$bd333444rL   c                     t          |           } | sg S |dk    r| gS t          j        d| t          j                  }d |D             }g }t	          |          D ]\  }}t          |          dk    rt          |          dk    rr|rt          |d         dz   |z             |d<   L|dz   t          |          k     r%t          |dz   ||dz            z             ||dz   <   |                    |           |                    |           |S )	Nheadingu*   [^.!?…]+[.!?…]+(?:[”"])?|[^.!?…]+$rN   c                 J    g | ] }t          |          t          |          !S  )rK   ).0ps     rB   
<listcomp>z(split_voice_segments.<locals>.<listcomp>8   s)    ???|A?\!__???rL   r   r   rE   )rK   rF   rQ   rR   	enumeraterS   rP   append)rJ   
scene_typepartsoutiparts         rB   split_voice_segmentsrc   1   s1   D 	YvJDdRTRVWWWE??e???E
CU## 	 	4dq  SZZ!^^ !&s2w}t';<<BQU##+D3Jq1u,EFFa!e

4    JJtJrL   c                    g fd}| }t          j        d|t           j                  }d |D             }|rLt          |          t          |          z  dk    r)|                                }                    d           t          j        d||          }t          j        dd	|          }t          j        d
d|          }t          |          }|| k    r                    d           |fS )Nc                 j   t                               |                     d                                                    }|r]                    |                     d           d|                     d           d|            |                     d           d| S |                     d          S )Nr	   r   z->r   rE   )ROMANgetgroupupperr]   )mvalchangess     rB   replznormalize_for_tts.<locals>.replI   s    ii

((**++ 	)NNaggajj>>AGGAJJ>>>>???ggajj((3(((wwqzzrL   z[^\W\d_]rN   c                 :    g | ]}|                                 |S rW   )isupper)rX   chs     rB   rZ   z%normalize_for_tts.<locals>.<listcomp>Q   s%    :::BRZZ\\:R:::rL   g?uppercase_to_lowercase_for_ttsu.   (?i)\b(thế\s*k[ỷỉ])\s+([IVXLCDM]{1,6})\bu   \s*[:;\-–—]\s*z, z,\s+z,  tts_pause_normalized)rF   rQ   rR   rP   lowerr]   rG   rK   )rJ   rm   text2lettersupper_lettersrl   s        @rB   normalize_for_ttsrw   G   s   G     Eje24888G::':::M 93}%%G4s::7888FDdERREF($66EF7E5))EE}}-...'>rL   c                    dt          j                    j        z   }g }|                                 D ]6\  }}|                    d| d| d| d                                           7|                                D ]\  }}t          |          }t          j        t          |                    d         pd}|                    d| d| d|j
         d	| d
	                                |                                z   dz              |                    d| d                                           |d                    |          fS )Nz----OmniVoiceBoundaryz--z(
Content-Disposition: form-data; name="z"

z
r   zapplication/octet-streamz"; filename="z"
Content-Type: z

s   
z--
rL   )uuiduuid4hexitemsr]   encoder   	mimetypes
guess_typestrname
read_bytesjoin)	fieldsfilesboundarychunkskeyvaluepathrY   mimes	            rB   	multipartr   ^   s   &)99HFllnn s s
Uh8hhshh]bhhhooqqrrrr[[]] p p	TJJ#CFF++A.L2L  K8  K  Ks  K  Kabag  K  K  }A  K  K  K  R  R  T  T  WX  Wc  Wc  We  We  e  ho  o  	p  	p  	p  	p
MM'x'''..00111SXXf%%%%rL   c                     t          |                                           d d         }|                    d          rd|d d         v rdndS )Nr$   s   RIFFs   WAVEr   wavunknown)r   r   
startswith)r   datas     rB   	probe_fmtr   k   sO    ::  ""3B3'DOOG,,TD"I1E1E559TrL   c                     	 t          j        dddddddt          |           gdd	
          }t          |                                          S # t
          $ r Y d S w xY w)Nffprobe-verrorz-show_entrieszformat=durationz-ofzdefault=nw=1:nk=1Tr   )rJ   timeout)
subprocesscheck_outputr   floatrH   	Exception)r   r`   s     rB   durationr   p   s    %y$Rcejl  BE  FJ  BK  BK  'L  SW  ac  d  d  dSYY[[!!!   tts   AA 
AAc                 2   |                      d          }dt           dt           dt           dt	          t
          dz             d	}t          j        dd	d
ddt          |           d|t          |          g	d           |	                    |            d S )Nz.clean.tmp.wavzBsilenceremove=start_periods=1:start_duration=0.03:start_threshold=zdB,afade=t=in:st=0:d=z,apad=pad_dur=z,adelay=  z:all=1ffmpegz-yr   r   z-iz-af<   r   )
with_suffixEDGE_TRIM_DBFADE_SECTRAILING_SILENCE_SECintLEADING_SILENCE_SECr   
check_callr   replace)r   tmpafs      rB   postprocess_audior   x   s    


+
,
,C	:\ 	: 	:%	: 	:,	: 	: )D011	: 	: 	:  8T4$D		5RTVYZ]V^V^_ikllllKKrL   c                    t                                           rt                               d          nd}| d|t          dddd}t	          |d	t
          i          \  }}t          j                            t          |d
d|z   id          }t          j        
                    |t                    5 }|                                }|j                            d
d          }	d d d            n# 1 swxY w Y   |                    d          }
|
                    |           t#          |
          dk    rt%          d|	 d|d d                   |
                    |           t)          |           t+          |          S )Nr2   r3    vi24z2.0	broadcast)rJ   languageref_textspeednum_stepguidance_scaleeffect_preset	ref_audiozContent-Typezmultipart/form-data; boundary=POST)r   headersmethodr   z.tmpr   zunexpected format ct=z first=r   )REF_TEXTexists	read_textSPEEDr   	REF_AUDIOurllibrequestRequestENDPOINTurlopenTTS_TIMEOUTreadr   rg   r   write_bytesr   RuntimeErrorr   r   r   )rJ   r`   r   r   r   bodyreqrespblobctr   s              rB   request_ttsr      s   7?7H7HPx!!7!333bH$ F vY'?@@NHd
.
 
 ~OorzOz>{  EK
   L  LC			[		9	9 2Tyy{{\nb112 2 2 2 2 2 2 2 2 2 2 2 2 2 2 //&
!
!COOD~~K2KKd3B3iKKLLLKKcC==s   30C//C36C3c           
      x   t          | d                   }|                                re|                                j        dk    rHt	          |          }| d         | d         dt          |          |                                j        |dS |j                            dd           d }t          d	t          d	z             D ]}	 |
                    d
           t          | d         |          }| d         | d         d|t          |          |                                j        || d         dc S # t          $ rd}t          |          }|
                    d
           t          d| d          d| d|            t          j        d|z             Y d }~d }~ww xY w| d         | d         d|d dS )N
audio_pathr   scene_idvoice_segment_idskipped_exists)r   r   statusoutputbytesr   Tr.   r   )
missing_oktts_textoknormalization)r   r   r   attemptr   r   r   r   zERROR z	 attempt=rE   r   failed)r   r   r   r   r   )r   r   statst_sizer   r   r:   r;   rangeMAX_ATTEMPTSunlinkr   r   rC   r7   sleep)itemr`   durlastr   excs         rB   generater      s{   
tL!
"
"C
zz|| z

*T11smm ,$GYBZfv  CF  GJ  CK  CK  VY  V^  V^  V`  V`  Vh  vy  z  z  	zJTD111DL1,-- 	$ 	$	$JJ$J'''d:.44C $Z 0dK]F^jn  |C  OR  SV  OW  OW  be  bj  bj  bl  bl  bt  BE  X\  ]l  Xm  n  n  n  n  n 	$ 	$ 	$s88DJJ$J'''L01LLGLLdLLMMMJq7{########		$
 Z(dCU>Vbjuy  HL  M  M  Ms   A,D77
F%AF  F%c                  .   t          j        t                              d                    d         } g }| D ]}|d         }|                    dd          }|                    d          p|                    d          pd}t          ||          }t          |d	          D ]\  }}t          |          \  }	}
|                    t          j
        ||| d
|d|t          |          |||	t          t          |z  d|ddz            t          t          dz  | dz            |
d           t          j                            dd           t                              t          j        t          j
        dd|ddd          d           |S )Nr2   r3   scenesr   typer   	narrationrJ   r   _seg_03dseg_z.wavzimages/scenesz.png)
project_idr   r^   r   segment_index_in_scenesegments_in_scenesource_narrationrJ   r   r   
image_pathr   Tr.   !sentence_split_user_qa_edge_cleanu   Heading scenes stay separate. Normal narration splits only on sentence-ending punctuation (. ! ? …); 2-3 word non-heading fragments merge into previous/next segment. No duration or ASR validation.)r   version
split_ruler|   Fr	   ensure_asciiindent)jsonloadsSCENES_JSONr   rg   rc   r\   rw   r]   PROJECTr   rP   r   	AUDIO_DIRTEXT_MANIFESTr:   r;   
write_textdumps)r   r|   scenesidstyper   r_   idxrb   r   rl   s              rB   build_itemsr     s   Z--w-??@@JFE  J		&"%%IIk**Eeii.?.?E2	$Y66"5!,, 	 	IC 1$ 7 7HgLL%l#'*$:$:$:$:$:*-%(ZZ$-$!)c/4H34H4H4H4H"HII!'O";lll"JKK!(     	  td;;;TZl6 _	) )
 !% % %
 07  8 8 8 LrL   c                     t                               dd           t                      } t          dt	          |            dt
                      g }t          j                            t
                    5 fd| D             }t          j        	                    |          D ]}|
                                }|                    |           |d         d	v rMt          |d          d
|d          d
|                    d           d|                    d                      t          d|d          d
|                    d                      	 d d d            n# 1 swxY w Y   d |D             }t          j        dd|sdndt	          |           t	          |           t	          |          z
  ||d}t                              t!          j        |dd          d           t          dt!          j        |d         |d         t	          |           dd          z              |rt%          d          d S )Nr   r2   r3   z2START sentence_split_user_qa voice_segments total=z	 workers=)max_workersc                 F    g | ]}                     t          |          S rW   )submitr   )rX   r   executors     rB   rZ   zmain.<locals>.<listcomp>   s'    EEEt8??8T22EEErL   r   )r   r   rE   r   r   z dur=r   zfailed r   c                 *    g | ]}|d          dk    |S )r   r   rW   )rX   rs     rB   rZ   zmain.<locals>.<listcomp>   s&    <<<AAhK8$;$;a$;$;$;rL   r   r   	completedpartial_failed)r   stepr   r   total_voice_segmentsdoner   resultsFr	   r   zDONE r  )r   r  total)r   )r9   r  r  rC   rP   WORKERS
concurrentfuturesThreadPoolExecutoras_completedresultr]   rg   r   r   MANIFESTr   r  
SystemExit)r|   r  r  futurer  r   manifestr  s          @rB   mainr      s   NN2N(((MME[SZZ[[RY[[\\\G			.	.7	.	C	C RxEEEEuEEE (55g>> 	R 	RF]]__FNN6"""h#;;;vh'yy&1C*DyyvzzRYGZGZyyagakaklvawawyyzzzzPf%78PP6::g;N;NPPQQQQ	RR R R R R R R R R R R R R R R =<<<<Fl6%+A++1A #E

E

S[[(	 	H 
8%JJJU\]]]$*(:HVDT_bch_i_ijjy~  A  A  A +)***+ +s   :CE&&E*-E*__main__),concurrent.futuresr  r   r~   rF   r   r7   urllib.requestr   ry   pathlibr   r   r   r   r   r   r   r9   r  r   r  r   r   r   r   r   r   r   rf   rC   rK   rS   rc   rw   r   r   r   r   r   r   r  r   __name__rW   rL   rB   <module>r&     s            				                
$X
Y
Y/D^__	4\]],,	::--88,,
   	mQ  	mtA  	meA  	md1  	mS  	m4  	m%  	m&  	m4  	m#b  	mQUVX  	mY^_a  	mbhik  	mlqrt  	muyz|  	m  ~C  DF  	m  GM  NP  	m  Y[  bd  jl  	m  	m  	m  - - -5 5 5  ,  .
& 
& 
&U U U
      2M M M(  D+ + +> zDFFFFF rL   