
    ^j                         d dl mZ 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
 ed          Zej        ZdZdZd Zd Zd	 Zd
 Zd Zedk    r e             dS dS )    )Path)arrayNzF/data/video-pipeline/HaTramAudio/project/017-Tam-Ve-Khong-Ghi-Diem-Denzrun-20260721T030911Z-51bf7fe4Levyc                      t           j                             t           j        j                                                                      dd          S )Nz+00:00Z)datetimenowtimezoneutc	isoformatreplace     work/verify_tts.pyr	   r	      s<    "&&x'8'<==GGIIQQRZ[^__
_r   c                    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)fs   r   <lambda>zsha.<locals>.<lambda>
   s    qvvk** r   r   )hashlibsha256openiterupdate	hexdigest)phbr   s      @r   shar       s    
>ffTll <a****3//;;a;< < < < < < < < < < < < < < <	s   ,A##A'*A'c                     t          j        t          dz                                            } t          t
          t          d                                D ]0\  }}|                     |          |k    rt          d|z             1d S )Nz.ownership-lock.json)
project_idrun_idownerzownership mismatch )
jsonloadsROOT	read_textPIDRUNOWNERitemsgetRuntimeError)dkvs      r   guardr2      s~    :t**557788s599??AA = =SQqUU1XXq[[|$9!$;<<<[= =r   c                     t                       |                     d| j        z   dz             }|                    t	          j        |dd          dz              t          j        ||            d S )N.z.tmpF   )ensure_asciiindent
)r2   	with_namename
write_textr%   dumpsosr   )r   r/   ts      r   atomicr?      sk    1;;s16z&())!,,tz!QV^_7`7`7`ae7e*f*f*fgigqrstugvgvgvgvgvr   c                     t                       t          j        t          dz                                            } t          j        t          dz                                            }t          dz  }t          dz  }|                     d          dk    s|                     d          durt          d	          |d
         }g }d}| d         D ]}t          |d                   }t          |d                   }	t          |          |d         k    st          |	          |d         k    rt          d          |	                    |
                                           |t          |d                   z  }d                    |          |
                                k    }
t          j        t          j        dddddddt          |          g                    }|d         d         }t          |d         d                   }t          j        dddd t          |          d!d"d#gt          j        t          j        $          }t          j        dd%d&d t          |          d'd(d!d"d#g
t          j        t          j        d)          }t%          t'          j        d*|j                            }d}d}t-          j        t          |          d+          5 }|                                d,k    s0|                                d-k    s|                                d.k    rt          d/          |                    d0          x}rt9          d1          }|                    |           t<          j        d2k    r|                                  |t%          |          z  }|tC          d3 |D                       z  }|                    d0          x}d d d            n# 1 swxY w Y   d|                     d4          |k    o%|                     d5          t          |          k    |                     d6          t          |          k    |
|                    d7          d8k    |                    d9          d:k    |                    d;          d.k    d<|cxk    od=k    nc tE          ||z
            d>k    |j#        dk    |dk    |dk    d?}tI          |%                                          sAt          d@dA                    dB |&                                D                       z             i dCd.dDtN          dEtP          ddddd4|d5t          |          dFt          |          dGt          |          dHt          |          dI|)                                j*        d|dJt%          | d                   dK|dd8d-d.dLdMdNd||||dOdPdQtW                      }tY          t          dRz  |           t[          t          j.        dd||dH         t%          |          dS                     d S )TNzscript/tts-manifest.jsonzscript/promotion-report.jsonzaudio/story-full.wavzstory/spoken-narration.txtstatus	completedverifiedTzTTS manifest not completedcanon_sha256g        segments	text_path
audio_pathtext_sha256audio_sha256zsegment hash driftduration_secondsr   ffprobez-verrorz-show_entrieszKformat=duration,size:stream=codec_name,sample_rate,channels,bits_per_samplez-ofr%   streamsr   formatdurationffmpegz-iz-fnull-)stdoutstderrz-hide_bannerz-nostatsz-afzsilencedetect=noise=-50dB:d=2)rS   rT   textzsilence_start:r   r5   i     z*unexpected WAV format during clipping scani S r   littlec              3   "   K   | ]
}|d v dV  dS ))i i  rV   Nr   ).0values     r   	<genexpr>zmain.<locals>.<genexpr>#   s-      2e2eUVdMdMd1MdMdMdMd2e2er   source_canon_sha256spoken_narration_sha256output_sha256
codec_name	pcm_s16lesample_rate48000channelsi`	  i  g?)manifest_completed_verifiedcanon_bindingoutput_hash#chunk_reconstruction_byte_identicalcodec_pcm_s16lesample_rate_48000monoduration_40_to_60_minutessegment_duration_sum_matchesfull_decodeno_silence_2s_or_longerno_clippingztechnical audio QA failed: ,c              3   $   K   | ]\  }}||V  d S )Nr   )rY   r0   r1   s      r   r[   zmain.<locals>.<genexpr>%   s0      V|V|]`]^_`z{V|WXV|V|V|V|V|V|r   schema_versionr"   r#   outputartifact_pathartifact_sha256artifact_bytessegment_countsegment_duration_total)codecra   rc   technical_audio_qapassedztext reconstruction + ffprobe + full decode + silence scan + direct PCM16 clipping count; no listening, ASR, evaluator, Voice Test or Listening Test)rA   rC   checkssilence_hits_ge_2ssample_countclipped_samplesmethodcompleted_atzlog/tts.json)rA   rC   rJ   r   r|   )/r2   r%   r&   r'   r(   r-   r.   r   r    append
read_bytesfloatjoin
subprocesscheck_outputstrrunPIPElenrefindallrT   waver   getsampwidthgetframerategetnchannels
readframesr   	frombytessys	byteorderbyteswapsumabs
returncodeallvaluesr,   r)   r*   statst_sizer	   r?   printr<   )manpromooutnarrcanonparts	dur_totalsegtpapreconstructionprobesrO   decodesilencesilence_hitsr   r~   wavraw_samplessamplesr|   r/   s                           r   mainr      s4
   TZ88CCEEFFTZY]^|Y|  YH  YH  YJ  YJ  NK  NKu  PT  Uk  Pk  LO  qu  vR  qR  lpGGH{""cggj&9&9&E&ELYuLvLvFv^2Ui
O J JS	#k
"tC$566BWWc-   CGGS-@$@$@|ThGiGiAi,,r}}	55G1H+I+I I		!2!22JD[]fgkls  uD  ER  SX  Y_  `c  dg  `h  `h  ]i  Ej  Ej  :k  :k5  ns  t}  n~  @  nA  lm  KP  QV  W_  Q`  ak  Ql  Km  Km  BJgd3s88DLT^Tckukz{{{	.DS%Poptu{|  A  IS  IX  `j  `o  uy  
z  
z  
z"*.w~>>??PQ_`R^
iC f#c..00%773;K;K;M;Mq;P;PWc  eQ  XR  XR  RR^^H--- f::7g''444	mXg..000W<os2e2e'2e2e2e/e/eeo ^^H--- ff f f f f f f f f f f f f f f (,CGGDY<Z<Z\a<a  =Tfifmfm  oH  gI  gI  KN  OS  KT  KT  gT  cf  cj  cj  kz  c{  c{  }@  AD  }E  }E  cE  lz  MN  MR  MR  S_  M`  M`  bm  Mm  BC  BG  BG  HU  BV  BV  X_  B_  gh  gl  gl  mw  gx  gx  z{  g{  X\  ^f  Xl  Xl  Xl  Xl  hl  Xl  Xl  Xl  Xl  LO  PX  Yb  Pb  Lc  Lc  eh  Lh  w}  wH  JK  wK  fr  tu  fu  D	S	  U	V	  D	V	  	W	  	W	FMMOO}<0MchhV|V|djdpdpdrdrV|V|V|N|N|0|#}#}} GQ  G|C  G  GXk  G*UY  GZopu  G  wP  QT  UY  QZ  QZ  G  [c  dg  hk  dl  dl  G  m|  }@  AD  }E  }E  G  FW  X[  \_  X`  X`  G  aq  ru  rz  rz  r|  r|  rD  G  EW  X`  G  ap  qt  ux  yC  uD  qE  qE  G  F^  _h  G  iq  {F  UZ  fg  rh  rh  G  i}  HP  \`  jp  FR  bn  A	P	  Z	p  ~q  ~q  G  r@  AD  AF  AF  G  HN  OS  Tb  Ob  cd  He  He  He  fk  lp  lv  AL  X\  px  BC  DU  BV  `c  dj  `k  `k  wl  wl  lm  lm  fn  fn  fn  fn  fns   C<O&&O*-O*__main__)pathlibr   r   r   r   r%   r=   r   r   r   r   r'   r:   r)   r*   r+   r	   r    r2   r?   r   __name__r   r   r   <module>r      s&               6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6	T
RSSX\XaTW  gFbe  MS  GL _ _ _  
= = =w w wn n n* Zr   