
    "jd#                        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dZdZd	Zd
ZdZdZdZedz  Zedz  Zedz  Zedz  Zedz  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)PathzT/data/video-pipeline/Youtube-Video-Maker/Project/31052026-001-Nguyen-Hue-Quang-Trungz"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.txt   g      ?g?       igQ?zaudio/voice_segmentszaudio/sceneszlogs/step_07_tts_v2_run.logz!logs/step_07_tts_v2_manifest.jsonz1audio/voice_segments/voice_segments_manifest.jsonu   Đọc giọng kể chuyện lịch sử Việt Nam, trầm, chậm rãi, rõ chữ. Mỗi đoạn là một câu hoặc cụm ngắt mạnh, không đọc vội, giữ nhịp kể chuyện.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      r/data/video-pipeline/Youtube-Video-Maker/Project/31052026-001-Nguyen-Hue-Quang-Trung/scripts_run_step_07_tts_v2.pylogrC      s    	+	,	,S	0DJTD111	#w	'	'@1aggd4i.@.@.@@@@@@@@@@@@@@@@	$ds   A::A>A>c                     t          j        d|                                 t           j                  }d |D             }t	          |          S )Nu-   [^.!?…:]+[.!?…:]+(?:[”"])?|[^.!?…:]+$flagsc                     g | ]>}|                                 t          j        d d|                                           ?S )z\s+ )stripresub).0ps     rB   
<listcomp>z(split_voice_segments.<locals>.<listcomp>#   s?    
F
F
FaAGGII
F26&#q!!''))
F
F
F    )rJ   findallrI   Umerge_short_segments)textpartss     rB   split_voice_segmentsrU   !   sF    
*Etzz||[][_
`
`
`E
F
F5
F
F
FE&&&rO   c                 ^    t          t          j        d| t          j                            S )Nz\w+rE   )lenrJ   rP   rQ   rS   s    rB   
word_countrY   '   s#    rz&$bd333444rO   c                     t          |           t          k     p)t          |                                           t          k     S )N)rY   MIN_TTS_WORDSrW   rI   MIN_TTS_CHARSrX   s    rB   is_short_segmentr]   +   s/    dm+Ps4::<</@/@=/PPrO   c                     t          |           dk    r| S g }| D ]}|s|                    |           t          |          rH|d                                         dz   |                                z                                   |d<   qt          |d                   rH|d                                         dz   |                                z                                   |d<   |                    |           |S )Nr   rH   )rW   appendr]   rstriplstriprI   )rT   mergedparts      rB   rR   rR   /   s    
5zzQF 	  	  	MM$D!! 	 r
))++C/=DDFFF2JJfRj)) 	 r
))++C/=DDFFF2JJMM$MrO   c                    g fd}t          j        d||           }|}t          j        dd|          }t          j        dd|          }t          j        dd|          }t          j        d	d
|                                          }||k    r                    d           |                                }||k    r                    d           |fS )Nc                 n   |                      d                                          }t                              |          }|r]                    |                      d           d|                      d           d|            |                      d           d| S |                      d          S )Nr   r   z->r   rH   )groupupperROMANgetr`   )mnumeralvalchangess      rB   replznormalize.<locals>.replB   s    

  ""		'(:(:C 	)NNaggajj>>AGGAJJ>>>>???ggajj((3(((wwqzzrO   u.   (?i)\b(thế\s*k[ỷỉ])\s+([IVXLCDM]{1,6})\bu   \s*[:;\-–—]\s*z, u   ([.!?…])\s+z\1\nz,\s+z,  z\n{2,}r5   $punctuation_pause_normalized_for_ttslowercase_for_omnivoice)rJ   rK   rI   r`   lower)rS   ro   text2beforerr   rn   s        @rB   	normalizeru   @   s    G     &BD$
O
OEF
&&e
4
4E
&!7E
2
2E
&%
'
'E
&D%
(
(
.
.
0
0Ef}}gnn%KLLL
++--Ee||W^^$=>>>'>rO   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--
rO   )uuiduuid4hexitemsr`   encoder   	mimetypes
guess_typestrname
read_bytesjoin)	fieldsfilesbchunkskvpathrM   mimes	            rB   	multipartr   T   s   djll..AF||~~ f f![1[[[[TU[[[bbddeeee++-- c c$
t**9/A77:X>Xd  B1  B  B  B  BXYX^  B  Bsw  B  B  B  I  I  K  K  LM  LX  LX  LZ  LZ  Z  [b  b  	c  	c  	c  	c
MM.q...''))***SXXfrO   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   `   sO    	d			 	 "	%DOOG,,TD"I1E1E559TrO   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   )rS   timeout)
subprocesscheck_outputr~   floatrI   	Exception)r   outs     rB   durationr   e   s    #YtGOL]^cdwx{  }A  yB  yB  %C  JN  XZ  [  [  [SYY[[!!!   tts   AA 
AAc                 R   |                      d          }dt           dt           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=z4dB:stop_periods=1:stop_duration=0.08:stop_threshold=zdB,afade=t=in:st=0:d=z,areverse,afade=t=in:st=0:d=z,areverse,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   m   s    


+
,
,C	8\ 	8 	8<H	8 	8%	8 	8 &	8 	8 -		8 	8
 )$.//	8 	8 	8  8Dgd3t99U2cRUhhWacddddKKrO   c           
         t          | d                   }|                                rc|                                j        dk    rF| d         | d         dt	          |          |                                j        t          |          dS |j                            dd           t                                          rt          	                    d	
          nd}| d         d|ddddd}dt          i}d }t          dd          D ]}	 t          ||          \  }}t          j                            t           |dd|z   id          }	t          j                            |	d          5 }
|
                                }|
j                            dd          }d d d            n# 1 swxY w Y   |                    d          }|                    |           t/          |          dk    rt1          d| d|d d                    |                    |           t5          |           | d         | d         d!|t	          |          |                                j        t          |          | d"         d#c S # t6          $ rO}t	          |          }t9          d$| d          d%| d&|            t;          j        d'|z             Y d }~d }~ww xY w| d         | d         d(|t	          |          d)S )*N
audio_pathr   scene_idvoice_segment_idskipped_exists)r   r   statusoutputbytesr   Tr.   r2   r3    tts_textviz0.8816z2.0	broadcast)rS   languageref_textspeednum_stepguidance_scaleeffect_preset	ref_audior   r   zContent-Typezmultipart/form-data; boundary=POST)r   headersmethodi,  r   z.tmpr   zunexpected format ct=z first=r   oknormalization)r   r   r   attemptr   r   r   r   zERROR z	 attempt=rH   r   failed)r   r   r   r   r   )r   existsstatst_sizer~   r   r:   r;   REF_TEXT	read_text	REF_AUDIOranger   urllibrequestRequestENDPOINTurlopenreadr   rj   r   write_bytesr   RuntimeErrorr   r   r   rC   r7   sleep)itemr   r   r   r   lastr   r   bodyreqrblobctr   es                  rB   generater   {   s,   T,  C
zz|| y

*T11
+tDV?Waq{~  @C  |D  |D  MP  MU  MU  MW  MW  M_  ks  tw  kx  kx  y  y  	yJTD1115=__5F5FNX111BH
#txPVbfx}  OZ  [  [Fy
!E	D1:: r r
	rVU++FAd&&xT>RrstRtBu  ~D&  E  EC''S'99 CQVVXX!)--r"B"BrC C C C C C C C C C C C C C C''C)>)>)>~~u$$L9iQS9i9i\`adbdad\e9i9i,j,j&jKK/444#J/4HZC[eit{  FI  JM  FN  FN  WZ  W_  W_  Wa  Wa  Wi  u}  ~A  uB  uB  SW  Xg  Sh  i  i  i  i  i 	r 	r 	rQDYd+=&>YYYYSWYYZZZ\`\fghipgp\q\q\q\q\q\q\q\q	rJ'4@R;S]enr|  AD  }E  }E  F  F  Fs?   A!J/0F+J+F/	/J2F/	3CJ
KAKKc                     t          j        t          dz                      d                    d         } g }| D ]}|                    d          dk    r	|d         gnt          |d                   }t          |d          D ]\  }}t          |          \  }}|d	          d
|d}t          |d	         z  d|ddz  }	|	                    |d	         ||t          |          |                    d          ||d         ||t          t          dz  |d	          dz            t          |	          d           |S )Nzscript/scenes.jsonr2   r3   scenestypeheading	narrationr   r   _seg_03dseg_z.wavzimages/scenesz.png)r   r   segment_index_in_scenesegments_in_scene
scene_typerS   source_narrationr   r   
image_pathr   )jsonloadsPROJECTr   rj   rU   	enumerateru   	AUDIO_DIRr`   rW   r~   )
r   rz   sceneraw_segmentsidxtxtttsrn   seg_idr   s
             rB   build_itemsr      s   :w33>>>PPQQRZ[F
E o o-2YYv->->	-I-IeK())OcdijudvOwOw a00 	o 	oGC!#KCJ'77c777F z!223G#3G3G3G3GGJLLU:%6&jm  CF  GS  CT  CT  bg  bk  bk  lr  bs  bs  {~  RW  Xc  Rd  ps  DK  Y\  ]d  et  ]t  x}  ~H  xI  uO  uO  uO  ]O  YP  YP  ^a  bl  ^m  ^m  n  n  o  o  o  o		o
 LrO   c                     t                               dd           t                              dd           t                              dd           t                      } t          j                            dd           t                              t          j	        t          j        dt           dt           dt          d	t          t           | d
dd          d           t#          dt%          |            dt&                      g }t(          j                            t&                    5 fd| D             }t(          j                            |          D ]x}|                                }|                    |           t#          |d          d|d          d|                    dd           d|                    d                      y	 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
  |t7          d |D                       t9          |d            d!	}t:                              t          j	        |dd          d           t#          d"t          j	        |d         |d#         t=          |d$         d%z  d          d&d'          z              |rt?          d          d S )(NTr.   r   r2   r3   uE   Split voice at . ! ? … and :; auto-merge very short segments below z
 words or z$ chars to reduce TTS edge artifacts.g)\(?)
project_id
split_ruleinstructr   leading_silence_sectrailing_silence_secrz   Fr   )ensure_asciiindentzSTART v2 voice_segments total=z	 workers=)max_workersc                 F    g | ]}                     t          |          S  )submitr   )rL   itexs     rB   rN   zmain.<locals>.<listcomp>   s'    555bii$$555rO   r   rH   r   r   r   z dur=r   c                 *    g | ]}|d          dk    |S )r   r   r  rL   r   s     rB   rN   zmain.<locals>.<listcomp>   s&    888!!H+x"7"7A"7"7"7rO   r   v2_voice_segments	completedpartial_failedc              3   D   K   | ]}|                     d           pdV  dS )r   r   N)rj   r  s     rB   	<genexpr>zmain.<locals>.<genexpr>   s}        u`  u`  ST  wx  w|  w|  }G  wH  wH  wM  LM  u`  u`  u`  u`  u`  u`rO   c                     | d         S )Nr   r  )xs    rB   <lambda>zmain.<locals>.<lambda>   s      GH  I[  G\ rO   )key)	r   stepversionr   total_voice_segmentsdoner   total_duration_secondsresultszDONE r  r  r   )r   r  duration_min)r   ) r   r;   LEGACY_AUDIO_DIRr9   
write_textr   TEXT_MANIFESTr:   r   dumpsr   r   r[   r\   INSTRUCTr   r   rC   rW   WORKERS
concurrentfuturesThreadPoolExecutoras_completedresultr`   rj   sumsortedMANIFESTround
SystemExit)rz   r  futsfutr   r   manifestr  s          @rB   mainr,     s   OOD4O0002B2H2HQU`d2H2e2e2eNN2N(((
--Etd;;;TZgl  Qe  Yf  Qe  Qe  r  Qe  Qe  Qe  qy  BF  ]p  H\  ej  )k  )k  y~  FG  H  H  H  RY  Z  Z  ZGUGGgGGHHHG			.	.7	.	C	C Hr5555u555%22488 	H 	HCjjllAGNN1---sak  4G  4GAFXDY  4G  4G\]\a\abijk\l\l  4G  4Gstsxsx  zD  tE  tE  4G  4G  0H  0H  0H  0H	HH H H H H H H H H H H H H H H 98w888F"<q;Nkq  YHXcXc  xH  `c  di  `j  `j  ru  v{  r|  r|  }@  AG  }H  }H  rH  RX  ru  u`  u`  X_  u`  u`  u`  r`  r`  kq  ry  ~\  ~\  k]  k]  k]  ^  ^H
8aHHHRYZZZ
Xh%7x?O_dem  oG  fH  IK  fK  LM  `N  `N  O  O  ]b  c  c  c  	c  d  d  d1Z 011111s   6B'G**G.1G.__main__),concurrent.futuresr  r   r|   rJ   r7   rw   urllib.requestr   r   pathlibr   r   r   r   r   r  r   r   r[   r\   r   r   r   r  r9   r&  r  r  ri   rC   rU   rY   r]   rR   ru   r   r   r   r   r   r   r,  __name__r  rO   rB   <module>r2     s   V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V      cdd	-
$\
]
]		Z	[	[	  	
(
(	' ))	4	4IIv ks1  kT!  kE!  kD  k3q  ka  ka  kq  ka  kB  ktTV  kW\]_  k`fgi  kjopr  kswxz  k  |A  BD  k  EK  LN  k  WY  `b  hj  k  k  k  ' ' '5 5 5Q Q Q  "  (	 	 	U U U
    F F F0
 
 
2 2 2$ ZrO   