
    T)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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.d/d0d1d2d3d4d5d6Zd7 Zd8 Zd9 Z d: Z!d; Z"d< Z#d= Z$d> Z%d? Z&d@ Z'e(dAk    r e'             dS dS )B    N)PathzL/data/video-pipeline/Youtube-Video-Maker/Project/01062026-003-Tran-Quoc-Toanz"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      scripts_run_step_07_tts_v2.pylogrB      s    	+	,	,S	0DJTD111	#w	'	'@1aggd4i.@.@.@@@@@@@@@@@@@@@@	$ds   A::A>A>c                     t          j        d|                                 t           j                  }d |D             S )Nu-   [^.!?…:]+[.!?…:]+(?:[”"])?|[^.!?…:]+$)flagsc                     g | ]>}|                                 t          j        d d|                                           ?S )z\s+ )stripresub).0ps     rA   
<listcomp>z(split_voice_segments.<locals>.<listcomp>#   s?    GGGqQWWYYGBF63""((**GGG    )rH   findallrG   U)textpartss     rA   split_voice_segmentsrR   !   s9    
*Etzz||[][_
`
`
`EGGEGGGGrM   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   rF   )groupupperROMANgetappend)mnumeralvalchangess      rA   replznormalize.<locals>.repl(   s    

  ""		'(:(:C 	)NNaggajj>>AGGAJJ>>>>???ggajj((3(((wwqzzrM   u.   (?i)\b(thế\s*k[ỷỉ])\s+([IVXLCDM]{1,6})\bu   \s*[:;\-–—]\s*z, u   ([.!?…])\s+z\1\nz,\s+z,  z\n{2,}r4   $punctuation_pause_normalized_for_ttslowercase_for_omnivoice)rH   rI   rG   rY   lower)rP   r^   text2beforera   r]   s        @rA   	normalizerd   &   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^^$=>>>'>rM   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--
rM   )uuiduuid4hexitemsrY   encoder   	mimetypes
guess_typestrname
read_bytesjoin)	fieldsfilesbchunkskvpathrK   mimes	            rA   	multipartry   :   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rM   c                     t          |                                           d d         }|                    d          rd|d d         v rdndS )Nr#   s   RIFFs   WAVEr   wavunknown)r   ro   
startswith)rw   datas     rA   	probe_fmtr   F   sO    	d			 	 "	%DOOG,,TD"I1E1E559TrM   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   )rP   timeout)
subprocesscheck_outputrm   floatrG   	Exception)rw   outs     rA   durationr   K   s    #YtGOL]^cdwx{  }A  yB  yB  %C  JN  XZ  [  [  [SYY[[!!!   tts   AA 
AAc                 B   |                      d          }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=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_callrm   replace)rw   tmpafs      rA   postprocess_audior   S   s    


+
,
,C	8\ 	8 	8%	8 	8%	8 	8 -	8 	8 )$.//		8 	8 	8  8Dgd3t99U2cRUhhWacddddKKrM   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-   r1   r2    tts_textviz0.8816z2.0	broadcast)rP   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=rF   r   failed)r   r   r   r   r   )r   existsstatst_sizerm   r   r9   r:   REF_TEXT	read_text	REF_AUDIOrangery   urllibrequestRequestENDPOINTurlopenreadr   rX   r   write_bytesr   RuntimeErrorr   r   r   rB   r6   sleep)itemr   r   rq   rr   lastr   rs   bodyreqrblobctr   es                  rA   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.jsonr1   r2   scenestypeheading	narrationr   r   _seg_03dseg_z.wavzimages/scenesz.png)r   r   segment_index_in_scenesegments_in_scene
scene_typerP   source_narrationr   r   
image_pathr   )jsonloadsPROJECTr   rX   rR   	enumeraterd   	AUDIO_DIRrY   lenrm   )
r   ri   sceneraw_segmentsidxtxtttsr]   seg_idr   s
             rA   build_itemsr   x   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
 LrM   c                     t                               dd           t                              dd           t                              dd           t                      } t          j                            dd           t                              t          j	        t          j        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
  |t3          d |D                       t5          |d           d	}t6                              t          j	        |d	d
          d           t          d t          j	        |d         |d!         t9          |d"         d#z  d
          d$d	%          z              |rt;          d          d S )&NTr-   r   r1   r2   um   Split voice at . ! ? … and :; heading scenes stay standalone; preserve spoken tail (no tail silenceremove).g)\(?)
project_id
split_ruleinstructr   leading_silence_sectrailing_silence_secri   Fr
   )ensure_asciiindentzSTART v2 voice_segments total=z	 workers=)max_workersc                 F    g | ]}                     t          |          S  )submitr   )rJ   itexs     rA   rL   zmain.<locals>.<listcomp>   s'    555bii$$555rM   r   rF   r   r   r   z dur=r   c                 *    g | ]}|d          dk    |S )r   r   r   rJ   r   s     rA   rL   zmain.<locals>.<listcomp>   s&    888!!H+x"7"7A"7"7"7rM   r   v2_voice_segments	completedpartial_failedc              3   D   K   | ]}|                     d           pdV  dS )r   r   N)rX   r   s     rA   	<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`rM   c                     | d         S )Nr   r   )xs    rA   <lambda>zmain.<locals>.<lambda>   s      GH  I[  G\ rM   )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_DIRr8   
write_textr   TEXT_MANIFESTr9   r   dumpsr   rn   INSTRUCTr   r   rB   r   WORKERS
concurrentfuturesThreadPoolExecutoras_completedresultrY   rX   sumsortedMANIFESTround
SystemExit)ri   r  futsfutr   r   manifestr   s          @rA   mainr     sh   OOD4O0002B2H2HQU`d2H2e2e2eNN2N(((
--Etd;;;TZgl  Q@  LT  ]a  xK  cw  @E  )F  )F  TY  ab  c  c  c  mt  u  u  u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   %B'GG G__main__))concurrent.futuresr  r   rk   rH   r6   rf   urllib.requestr   r   pathlibr   r   r   r   r   r  r   r   MIN_TTS_WORDSMIN_TTS_CHARSr   r   r   r	  r8   r  r  r  rW   rB   rR   rd   ry   r   r   r   r   r   r  __name__r   rM   rA   <module>r$     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      [\\	-
$\
]
]		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  H H H
  (	 	 	U U U
  
 
 
F F F0
 
 
2 2 2$ ZrM   