
    {\js4                       d dl m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	Z	d dl
Z
d dlZd dlZd dlZd dlmZ  ee                                          j        d         Zedz  ZdZdZd,dZd-dZd.dZd/dZd0dZd1dZd2dZd3dZd4d!Z e!d"k    r	  e	j"         e                        dS # e#$ rZ$d#d$ e%e$          j!         d%e$ ej        &                    ej'        j(                  )                                d&Z*	  ej+        e,                    d'(                    Z- e ee-d)          e*           n# e#$ r Y nw xY w e. ej/        e*d$*          e	j0        +            e	j"        d           Y dZ$[$dS dZ$[$ww xY wdS )5    )annotationsN)Path   zscript/project-manifest.jsonz0http://192.168.40.32:7861/voice/ngoc-huyen-clonei  pathr   returnstrc                   t          j                    }|                     d          5 t          fdd          D ]}|                    |           	 d d d            n# 1 swxY w Y   |                                S )Nrbc                 .                          d          S )Ni   )read)handles   script/run-tts.py<lambda>zsha256.<locals>.<lambda>   s    &++o">">     r   )hashlibsha256openiterupdate	hexdigest)r   digestchunkr   s      @r   r   r      s    ^F	4 !F>>>>DD 	! 	!EMM%    	!! ! ! ! ! ! ! ! ! ! ! ! ! ! ! s   ,A##A'*A'manifestdictkeyc                   |                      d          pi                      |          }t          |t                    r|st          d| d          t	          |          }|                                s
t          |z  }	 |                                                    t                                                     n%# t          $ r}t          d|           |d }~ww xY w|S )Nactive_pathszactive_paths.z is missingzactive path escapes project: )
get
isinstancer   RuntimeErrorr   is_absoluteROOTresolverelative_to
ValueError)r   r   valuer   excs        r   resolve_activer(       s    \\.))/R44S99EeS!! = =;3;;;<<<;;D d{K""4<<>>2222 K K K@3@@AAsJKKs   >C 
C$CC$r&   Nonec                   t          j        |dd          dz                       d          }| j                            dd           t          j        d| j         d| j        	          \  }}	 t          j	        |d
          5 }|
                    |           |                                 t          j        |                                           d d d            n# 1 swxY w Y   t          j        ||            t          j                            |          rt          j        |           d S d S # t          j                            |          rt          j        |           w w xY w)NF   )ensure_asciiindent
utf-8Tparentsexist_ok.)prefixdirwb)jsondumpsencodeparentmkdirtempfilemkstempnameosfdopenwriteflushfsyncfilenoreplacer   existsunlink)r   r&   datafdr>   r   s         r   atomic_jsonrJ   .   s   Ju5;;;dBJJ7SSDKdT222'749'7'7'7T[IIIHBYr4   	&FLLLLNNNHV]]__%%%	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	
47>>$ 	IdOOOOO	 	27>>$ 	IdOOOO	s1   2D: AC#D: #C''D: *C'+D: :6E0text	list[str]c                (   d |                      d          D             }g }|D ]}d t          j         d|          D             }g }|D ]}|}t          |          t          k    r|d t          dz            }d t          j        d|          D             }	|	r|	d         n|                    d	          dz   }
|
d
k    rt          d          |                    |d |
                                                    ||
d                                          }t          |          t          k    |r|                    |           d}|D ]`}|rCt          |          dz   t          |          z   t          k    r|                    |           |}G| d	|                                 }a|r|                    |           g }d}|D ]`}|rCt          |          dz   t          |          z   t          k    r|                    |           |}G| d	|                                 }a|r|                    |           d		                    |          d		                    |                                            k    rt          d          |S )Nc                ^    g | ]*}|                                 |                                 +S  strip.0r&   s     r   
<listcomp>zsplit_units.<locals>.<listcomp>>   s-    QQQE5;;==Q%++--QQQr   z

c                ^    g | ]*}|                                 |                                 +S rO   rP   rR   s     r   rT   zsplit_units.<locals>.<listcomp>A   s2    jjju\a\g\g\i\ijU[[]]jjjr   u   (?<=[.!?…])\s+r   c                6    g | ]}|                                 S rO   )end)rS   matchs     r   rT   zsplit_units.<locals>.<listcomp>G   s     XXXeeiikkXXXr   z[,;:]\s+ r   z.unsplittable narration token exceeds max chars z%segmentation changed narration tokens)
splitrelen	MAX_CHARSfinditerrfindr    appendrQ   join)rK   
paragraphsunits	paragraph	sentencespiecessentence	remainingwindow
candidatescutbufferpiecepackedunits                  r   split_unitsrr   =   s   QQTZZ-?-?QQQJE ! !	jj9Li0X0Xjjj	! 	) 	)H Ii..9,,">IM>2XXr{;PV7W7WXXX
(2MjnnS8I8IA8M!88&'WXXXio3355666%cddO1133	 i..9,,  )i((( 	5 	5E 5#f++/CJJ6BBV$$$",,U,,2244 	!LL   FF 0 0 	0c&kkAoD		1I==MM&!!!FF''''--//FF f
xx388DJJLL1111BCCCMr   objectbytes | Nonec                   t          | t                    r%dD ]}|                     |          }t          |t                    r|                    d          r|                    dd          d         n|}	 t          j        |d          }n# t          $ r d}Y nw xY w|                    d	          r|d
d         dk    r|c S dD ]}|                     |          }t          |t                    r^t          |          }|
                                r;|                                }|                    d	          r|d
d         dk    r|c S dD ]}|                     |          }t          |t                    r|                    d          rtt          j                            |d          5 }|                                }d d d            n# 1 swxY w Y   |                    d	          r|d
d         dk    r|c S |                                 D ]}t#          |          }|r|c S n/t          | t$                    r| D ]}t#          |          }|r|c S d S )N)audio_base64base64audiorH   zdata:,r   rY   T)validater      RIFF         WAVE)
audio_pathr   output_pathfile)	audio_urlurl)zhttp://zhttps://i,  timeout)r   r   r   r   
startswithr\   rw   	b64decode	Exceptionr   rF   
read_bytesurllibrequesturlopenr   values
find_audiolist)	r&   r   itemrawdecodedr   rH   responsefounds	            r   r   r   g   s   % "> 		# 		#C99S>>D$$$ #040H0HRdjja((,,d"$.sTBBBGG  " " "!GGG"%%g.. #71R4=G3K3K"NNN@ 	$ 	$C99S>>D$$$ $Dzz;;== $??,,Dw// $D2J'4I4I#' 	  	 C99S>>D$$$  9P)Q)Q  ^++D#+>> +(#==??D+ + + + + + + + + + + + + + +??7++  QrT
g0E0EKKKLLNN 	 	Dt$$E 	 
E4	 	   	 	Dt$$E 4s$   9BBB;GG 	#G 	c                |    t          j        t          j        dddddddt	          |           gd	                    S )
Nffprobe-verrorz-show_entrieszMformat=duration,format_name:stream=codec_name,codec_type,sample_rate,channelsz-ofr7   T)rK   )r7   loads
subprocesscheck_outputr   )r   s    r   prober      sM    :j-4/Wvs4yy/ 	     r   boolc                "   	 t          |           }d |                    dg           D             }|                                 j        dk    o1t	          |          dk    ot          |d         d                   dk    S # t          $ r Y dS w xY w)	Nc                D    g | ]}|                     d           dk    |S )
codec_typerx   )r   rS   r   s     r   rT   zvalid_wav.<locals>.<listcomp>   s/    aaaDtxx?U?UY`?`?`4?`?`?`r   streams,   r   formatdurationr   F)r   r   statst_sizer^   floatr   )r   infor   s      r   	valid_wavr      s    T{{aaDHHY$;$;aaayy{{"R'gCLLA,=g%XWaHbBcBcfgBgg   uus   A=B   
BBoutputtuple[int, str]c                   t           j                            | dddd                              d          }t           j                            t          |ddid	          }t           j                            |d
          5 }|                                }|j	        }|j
                            dd          }d d d            n# 1 swxY w Y   |                    d          r|dd         dk    r|nd }|4t          t          j        |                    d                              }|t#          d          |                    |           t'          |          s%|                    d           t#          d          ||fS )N
doc_truyenz1.0true)rK   stylespeeddenoiser/   zContent-Typez!application/x-www-form-urlencodedPOST)rH   headersmethodiX  r   r[   r{   r|   r}   r~   z'provider response contains no WAV audioT
missing_okz%provider WAV failed independent probe)r   parse	urlencoder9   r   RequestENDPOINTr   r   statusr   r   r   r   r7   r   decoder    write_bytesr   rG   )	rK   r   payloadreqr   bodyr   content_typerx   s	            r   renderr      s   l$$	& &  
 vg  .
 
 !DE	 !  C 
		S		1	1 @X}}'++NB??@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ OOG,,Padw1F1FDDDE}4:dkk'&:&:;;<<}DEEE
uV D&&&BCCC<s   7CC
C
intc                    t          j        t                              d                    } t	          | d          }t	          | d          }t	          | d          }t	          | d          }t	          | d          }t	          | d          }t	          | d	          }|j        }t          j        |                    d                    }	t          |          }
|	                    d
          dk    s0|	                    d          dus|	                    d          |
k    rt          d          |	                                s(|	                                s|	                                rt          d          |
                    dd           |                    d          }t          |          }i }|	                                rat          j        |                    d                    }|                    d          |
k    r d |                    dg           D             }g }t          |d          D ]e\  }}|d|ddz  }t          j        |                    d                                                    }|                    |          }|d uoc|                    d          |k    oJ|                    d          |	                                rt          |          nd k    ot!          |          }|r|                    d          nd }|r|                    d          nd }|si|                    d           	 t%          ||          \  }}n># t&          $ r1}|                    d           t          d| d|           |d }~ww xY wt)          |          }t+          |d          d!                   }||t-          |          t-          |                                          t1          |          t          |          |||dd"
}|                    |           t5          |d#d$|
t-          |          t-          |          |t6          j                            t6          j        j                                                  d%           gd& |D             tA          tC          dt-          |          dz                       k    rt          d'          |"                    d(#                    d) |D                       d           |d*z  }|                    d           tI          j%        d+d,d-d.d/d0d1d2d3t1          |          d4d5t1          |          gd6           t!          |          st          d7          tM          j'        ||           t)          |          }t+          |d          d!                   }tQ          d8 |D                       }tS          ||z
            } | tU          d9t-          |          d:z            k    }!i d
|!rdnd;d|!d<|                     d<          d=|	d>         d|
d?d@dAtV          dBdCdDdEdFddGt-          |          dHt-          |          d|dIt1          |          dJt          |          dK|dL|| |t6          j                            t6          j        j                                                  dMdN}"t5          ||"           |"d
         |!|	d>         |
t1          |          t1          |          |"dJ         t-          |          |tV          ddO|t1          |          |"dP         |"dQ         dR}#t5          ||#           tY          t          j-        |#d
         |!t-          |          ||#d         t1          |          dSd$T                     |!rdUndS )VNr/   encodingspoken_narrationpromotion_receipttts_manifesttts_partial_manifesttts_receipt	tts_audio
tts_concatr   	completedverifiedTspoken_narration_sha256z"promotion absent, failed, or stalezDTTS production output already exists and requires audit/invalidationr0   c                :    i | ]}t          |d                    |S index)r   r   s     r   
<dictcomp>zmain.<locals>.<dictcomp>   s&    YYYTDM**DYYYr   segmentsr   )startzsegment-04dz.wavtext_sha256artifact_sha256http_statusresponse_content_typer   zsegment z	 failed: r   r   )
r   r   charswordsr   r   duration_secondsr   r   r   runningF)r   r   r   planned_countcompleted_countr   
updated_atc                    g | ]
}|d          S r   rO   r   s     r   rT   zmain.<locals>.<listcomp>  s    +++$W+++r   zsegment index gap or duplicater[   c              3  R   K   | ]"}d t          |d                   j         dV  #dS )zfile 'r   z'
N)r   r>   r   s     r   	<genexpr>zmain.<locals>.<genexpr>  s=      "^"^T#HDf,>,>,C#H#H#H"^"^"^"^"^"^r   z.story-full.tmp.wavffmpegr   r   z-yz-fconcatz-safe0z-iz-c:a	pcm_s16le)checkz(concatenated story-full WAV failed probec              3  &   K   | ]}|d          V  dS )r   NrO   r   s     r   r   zmain.<locals>.<genexpr>  s(      II4 23IIIIIIr   g?gMb`?failed
project_idsource_canon_sha256canon_sha256voicezNgoc-Huyen-Cloneendpointr   r   r   g      ?r   r   r   story_full_pathstory_full_sha256r   segment_duration_sumzsha256 streaming 8 MiB)duration_delta_secondsr   completed_athash_method)r   direct_httpr   r   )r   r   r   r   
input_pathr   r   segment_countr   endpoint_verificationindependent_probemanifest_pathr   r   )r   r   r   r   r   receiptr,   r   ).r7   r   PROJECT_MANIFEST	read_textr(   r:   r   r   r    rF   r;   rr   	enumerater   r9   r   r   rG   r   r   r   r   r^   r\   r   rb   rJ   datetimenowtimezoneutc	isoformatr   range
write_textrc   r   runr?   rE   sumabsmaxr   printr8   )$project	narrationpromotion_pathr   partial_pathreceipt_path	full_pathconcat_path	audio_dir	promotionnarration_hashrK   re   existingpartialr   r   rq   r   	text_hashpriorreusabler   r   r'   r   r   r   	temp_full
full_probefull_durationsegment_durationduration_deltar   r   r   s$                                       r   mainr$     s   j)33W3EEFFGw(:;;I#G-@AAN!'>::L!'+ABBL!'=99Lw44I ,77K I
>33W3EEFFII&&N}}X+--z1J1JRV1V1VZcZgZg  iB  [C  [C  GU  [U  [U?@@@ c 3 3 5 5 c9I9I9K9K cabbbOOD4O00000DE "H Z*\33W3EEFF;;011^CCYYW[[UW=X=XYYYHH a000 * *t777777N4;;w#7#788BBDD	U## "		-((I5"		+,,6==??1\X\]" &!!	 	 3;Deii...=EOuyy!89994 	NMMTM***N,24,@,@)\\ N N N..."#Ce#C#Cc#C#CDD#MN V}}h
344$YY&&KK%f~~ (&%1
 
 	L'5 ZZ"8}} "+//0A0EFFPPRR#
 #
 	 	 	 	 ,+(+++tE!SZZ!^4L4L/M/MMM;<<<277"^"^U]"^"^"^^^ipqqq11I%%%N$tXwc+S^^     Y GEFFFJy)$$$y!!J*X.z:;;MIIIIIII)99::NS#h--%*?!@!@@H7++xH 	gkk,// 	y8	
 	"> 	# 	H 	 	 	4 	U 	3x== 	H 	3y>> 	VI..  	M!" 	 0#$ #1 )--h.?.CDDNNPP/+  H. h'''8$(8#1)nn9~~#$78X))1$!G!G'\** 0. G  g&&&	$*(#MM}"#45#lBSBS  	     
 11as   M**
N%4,N  N%__main__r   Fz: )r   r   r   	failed_atr/   r   r   r   )r   )r   r   r   r   )r   r   r   r   r   r   )r   r   r&   r   r   r)   )rK   r   r   rL   )r&   rs   r   rt   )r   r   r   r   )r   r   r   r   )rK   r   r   r   r   r   )r   r   )1
__future__r   rw   r  r   r7   r?   r]   r   sysr<   timeurllib.parser   urllib.requestpathlibr   __file__r#   r1   r"   r  r   r_   r   r(   rJ   rr   r   r   r   r   r$  __name__exitr   r'   typer  r  r  r  failurer   r  r  r  r8   stderrrO   r   r   <module>r3     s   " " " " " "     				 				     



                tH~~'*88 =	         ' ' ' 'T$ $ $ $N             :F  F  F  F R z   ES		*33c33!*..x/@/DEEOOQQ
 

	 dj!1!;!;W!;!M!MNNGKw>>HHHH 	 	 	D	jdju555CJGGGG s=   B3 3F
8AF:EFE
F	E

5FF
