
    Vj6!                        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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%dA Z&dB Z'dC Z(e)dDk    r e(             dS dS )E    N)PathzH/data/video-pipeline/Youtube-Video-Maker/Project/002-Nha-Tan-221-207-TCNz,http://192.168.40.32:7861/voice/truong-giang
doc_truyen   g      ?gffffff?       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      =Project/002-Nha-Tan-221-207-TCN/scripts_run_step_07_tts_v2.pylogrD      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     rC   
<listcomp>z(split_voice_segments.<locals>.<listcomp>"   s?    
F
F
FaAGGII
F26&#q!!''))
F
F
F    )rK   findallrJ   Umerge_short_segments)textpartss     rC   split_voice_segmentsrV       sF    
*Etzz||[][_
`
`
`E
F
F5
F
F
FE&&&rP   c                 ^    t          t          j        d| t          j                            S )Nz\w+rF   )lenrK   rQ   rR   rT   s    rC   
word_countrZ   &   s#    rz&$bd333444rP   c                     t          |           t          k     p)t          |                                           t          k     S )N)rZ   MIN_TTS_WORDSrX   rJ   MIN_TTS_CHARSrY   s    rC   is_short_segmentr^   *   s/    dm+Ps4::<</@/@=/PPrP   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   rI   )rX   appendr^   rstriplstriprJ   )rU   mergedparts      rC   rS   rS   .   s    
5zzQF 	  	  	MM$D!! 	 r
))++C/=DDFFF2JJfRj)) 	 r
))++C/=DDFFF2JJMM$MrP   c                 T   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           |fS )Nc                 n   |                      d                                          }t                              |          }|r]                    |                      d           d|                      d           d|            |                      d           d| S |                      d          S )Nr
   r   z->r   rI   )groupupperROMANgetra   )mnumeralvalchangess      rC   replznormalize.<locals>.replA   s    

  ""		'(:(:C 	)NNaggajj>>AGGAJJ>>>>???ggajj((3(((wwqzzrP   u.   (?i)\b(thế\s*k[ỷỉ])\s+([IVXLCDM]{1,6})\bu   \s*[:;\-–—]\s*z, u   ([.!?…])\s+z\1\nz,\s+z,  z\n{2,}r6   $punctuation_pause_normalized_for_tts)rK   rL   rJ   ra   )rT   rp   text2beforero   s       @rC   	normalizert   ?   s    G     &BD$
O
OEF
&&e
4
4E
&!7E
2
2E
&%
'
'E
&D%
(
(
.
.
0
0Ef}}gnn%KLLL'>rP   c           
      D   dt          j                    j        z   }g }|                                 D ]6\  }}|                    d| d| d| d                                           7|                                D ]b\  }}t          |          }|                    d| d| d|j         d                                |                                z   dz              c|                    d| d	                                           |d
	                    |          fS )Nz----OmniVoiceBoundaryz--z(
Content-Disposition: form-data; name="z"

z
z"; filename="z-"
Content-Type: application/octet-stream

s   
z--
rP   )
uuiduuid4hexitemsra   encoder   name
read_bytesjoin)fieldsfilesbchunkskvpathrN   s           rC   	multipartr   Q   s   djll..AF||~~ f f![1[[[[TU[[[bbddeeee++-- u u$
t**  T1  T  T  T  TXYX^  T  T  T  [  [  ]  ]  ^_  ^j  ^j  ^l  ^l  l  mt  t  	u  	u  	u  	u
MM.q...''))***SXXfrP   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     rC   	probe_fmtr   ]   sO    	d			 	 "	%DOOG,,TD"I1E1E559TrP   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   )rT   timeout)
subprocesscheck_outputstrfloatrJ   	Exception)r   outs     rC   durationr   b   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_callr   replace)r   tmpafs      rC   postprocess_audior   j   s    


+
,
,C	8\ 	8 	8%	8 	8%	8 	8 -	8 	8 )$.//		8 	8 	8  8Dgd3t99U2cRUhhWacddddKKrP   c           
         t          | d                   }|                                rc|                                j        dk    rF| d         | d         dt	          |          |                                j        t          |          dS |j                            dd           | d	         t          d
}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t-          d| d|
d d                   |                    |           t1          |           | d         | d         d|t	          |          |                                j        t          |          | d         dc S # t2          $ rO}t	          |          }t5          d| d          d| d|            t7          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/   tts_text)rT   styler   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=rI   r   failed)r   r   r   r   r   )r   existsstatst_sizer   r   r;   r<   	TTS_STYLEranger   urllibrequestRequestENDPOINTurlopenreadr   rk   r   write_bytesr   RuntimeErrorr   r   r   rD   r8   sleep)itemr   r~   r   lastr   r   bodyreqrblobctr   es                 rC   generater   w   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1
#I66F
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!I20E."I.E2	2I5E2	6CI
J AJJ 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.jsonr3   r4   scenestypeheading	narrationr   r   _seg_03dseg_z.wavzimages/scenesz.png)r   r   segment_index_in_scenesegments_in_scene
scene_typerT   source_narrationr   r   
image_pathr   )jsonloadsPROJECT	read_textrk   rV   	enumeratert   	AUDIO_DIRra   rX   r   )
r   ry   sceneraw_segmentsidxtxtttsro   seg_idr   s
             rC   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
 LrP   c                     t                               dd           t                              dd           t                              dd           t                      } t          j                            dd           t                              t          j	        t          j        t          t          dt           dt           dt           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
  |t;          d |D                       t=          |d           d 	}t>                              t          j	        |d
d          d           t'          d!t          j	        |d         |d"         tA          |d#         d$z  d          d%d
&          z              |rtC          d          d S )'NTr/   r   r3   r4   uE   Split voice at . ! ? … and :; auto-merge very short segments below z
 words or z$ chars to reduce TTS edge artifacts.)
project_idtts_endpoint	tts_style
split_ruleinstructleading_silence_sectrailing_silence_secry   Fr
   )ensure_asciiindentzSTART v2 voice_segments total=z	 workers=)max_workersc                 F    g | ]}                     t          |          S  )submitr   )rM   itexs     rC   rO   zmain.<locals>.<listcomp>   s'    555bii$$555rP   r   rI   r   r   r   z dur=r   c                 *    g | ]}|d          dk    |S )r   r   r   rM   r   s     rC   rO   zmain.<locals>.<listcomp>   s&    888!!H+x"7"7A"7"7"7rP   r   v2_voice_segments	completedpartial_failedc              3   D   K   | ]}|                     d           pdV  dS )r   r   N)rk   r   s     rC   	<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`rP   c                     | d         S )Nr   r   )xs    rC   <lambda>zmain.<locals>.<lambda>   s      GH  I[  G\ rP   )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_DIRr:   
write_textr   TEXT_MANIFESTr;   r   dumpsr   r{   r   r   r\   r]   INSTRUCTr   r   rD   rX   WORKERS
concurrentfuturesThreadPoolExecutoras_completedresultra   rk   sumsortedMANIFESTround
SystemExit)ry   r  futsfutr   r   manifestr   s          @rC   mainr      s   OOD4O0002B2H2HQU`d2H2e2e2eNN2N(((
--Etd;;;TZglRZgp  S  GT  S  S  `m  S  S  S  _g  ~Q  i}  FK  )L  )L  Z_  gh  i  i  i  s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   B'G55G9<G9__main__)*concurrent.futuresr  r   rK   r8   rv   urllib.requestr   r   pathlibr   r   r   r   r  r   r   r\   r]   r   r   r   r  r:   r  r  r  rj   rD   rV   rZ   r^   rS   rt   r   r   r   r   r   r   r   __name__r   rP   rC   <module>r&     s   K K K K K K K K K K K K K K K K K K K K K K K K K K K K      WXX	7
		  	
(
(	' ))	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.
 
 
2 2 2$ ZrP   