§
     $ËjUÐ  ã                   ó.  — d 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
 ddlmZmZmZmZmZmZ ej        dk    rC	 ej                             d¬¦  «         ej                             d¬¦  «         n# e$ r Y nw xY wg d¢Zd	d
gZdefd„Zdefd„Z G d„ d¦  «        Zedk    �ræ ej        d¬¦  «        Ze                      ddd¬¦  «         e                      ddd¬¦  «         e                      ddd¬¦  «         e                      de!dd¬ ¦  «         e                      d!ed"g d#¢d$¬%¦  «         e                      d&d'd(¬¦  «         e                      d)ed*¬+¦  «         e                      d,ed-¬+¦  «         e                      d.d/d0¬1¦  «         e                      d2ed3¬+¦  «         e                      d4ed5¬+¦  «         e                      d6ed7¬+¦  «         e                      d8ed9¬+¦  «         e                      d:ed;¬+¦  «         e "                    ¦   «         Z# e¦   «         Z$e#j%        re$ &                    e#j%        ¦  «         dS e#j'        r/e$ (                    e#j'        e#j)        e#j*        e#j+        ¬<¦  «         dS e#j,        r4e$ -                    e#j,        d         e#j,        d=         e#j)        ¦  «         dS e#j.        r%e$ /                    e#j.        e#j)        d>d?¬@¦  «         dS e#j0        r7e$ 1                    e#j0        ¦  «        Z2 e3 ej4        e2d'¬A¦  «        ¦  «         dS e#j5        rBe#j6        r;e$ 7                    e#j6        e#j)        e#j8        e#j9        e#j:        e#j;        ¬B¦  «         dS g dC¢Z<e$ &                    e<¦  «         dS dS )DuP  
=============================================================================
KIEU STORY AI CINEMA - AUDIO CONTINUITY & SOUNDSCAPE ENGINE (UPGRADED M3)
=============================================================================
CÃ´ng cá»¥ Ä‘iá»�u phá»‘i vÃ  chuáº©n hÃ³a Ã¢m thanh Ä‘á»“ng nháº¥t giá»¯a cÃ¡c shot video AI (Muse.ai)
- 4-Stem Audio Architecture (Stem 1: BGM, Stem 2: Ambience, Stem 3: Foley, Stem 4: Dialogue).
- Equal-Power Audio Crossfade (qsin/cbrt) triá»‡t tiÃªu tiáº¿ng click/pop ngáº¯t cá»¥t.
- Boundary Micro-Fade Mode A (30ms curve=qsin zero duration loss) & Mode B (acrossfade with tail padding).
- Stream Pre-conditioning: aresample=48000,aformat=channel_layouts=stereo vÃ  fallback aevalsrc=0 cho video cÃ¢m.
- Active RMS Gain Staging: bÃ¹ trá»« Ã¢m lÆ°á»£ng khi chÃªnh lá»‡ch vÆ°á»£t 3.0 dB vá»� má»‘c -24.0 dBFS kÃ¨m headroom guard.
- Xá»­ lÃ½ gá»‘i Ä‘áº§u Ã¢m thanh qua Ä‘oáº¡n ná»‘i hÃ¬nh áº£nh (Transition Audio Bridge).
- Ká»¹ thuáº­t J-Cut / L-Cut khÃ´ng gian (Acoustic Distance Filter 3500Hz) cho tiáº¿ng Ä‘Ã n Kiá»�u.
- Dynamic Sidechain Ducking (háº¡ BGM & Ambience -14dB khi cÃ³ thoáº¡i / ngÃ¢m thÆ¡).
- Chuáº©n hÃ³a Ã¢m lÆ°á»£ng EBU R128 Two-Pass Linear (-14 LUFS, TP -1.0 dBTP, LRA 9-11 LU) Ä‘áº¡t chuáº©n phÃ¡t sÃ³ng YouTube Green Dollar.
=============================================================================
é    N)ÚPath)ÚListÚDictÚOptionalÚTupleÚAnyÚUnionÚwin32zutf-8)Úencoding)z�C:\Users\Admin\AppData\Local\Microsoft\WinGet\Packages\Gyan.FFmpeg_Microsoft.Winget.Source_8wekyb3d8bbwe\ffmpeg-9.0.2-full_build\bin\ffmpeg.exez=C:\Users\Admin\AppData\Local\Microsoft\WindowsApps\ffmpeg.exeÚffmpegz�C:\Users\Admin\AppData\Local\Microsoft\WinGet\Packages\Gyan.FFmpeg_Microsoft.Winget.Source_8wekyb3d8bbwe\ffmpeg-9.0.2-full_build\bin\ffprobe.exeÚffprobeÚreturnc                  óò   — t           D ]a} t          j                             | ¦  «        s| dk    r:	 t	          j        | dgdd¬¦  «        }|j        dk    r| c S ŒQ# t          $ r Y Œ]w xY wŒbt          d¦  «        ‚)Nr   ú-versionT©Úcapture_outputÚtextr   u1   KhÃ´ng tÃ¬m tháº¥y ffmpeg.exe trong há»‡ thá»‘ng.)	ÚDEFAULT_FFMPEG_PATHSÚosÚpathÚexistsÚ
subprocessÚrunÚ
returncodeÚ	ExceptionÚFileNotFoundError©ÚpÚress     úGC:\Projects\KieuStory\05_Production_Pipeline\audio_continuity_engine.pyÚ
get_ffmpegr!   0   s    € Ý!ð ð ˆÝŒ7�>Š>˜!ÑÔð 	  X¢ ðÝ ”n a¨ _ÀTÐPTÐUÑUÔU�Ø”> QÒ&Ð&Ø�H�H�Hð 'øåð ð ð Ø�ðøøøð !.õ ÐOÑ
PÔ
PÐPó   °%AÁ
A&Á%A&c                  óò   — t           D ]a} t          j                             | ¦  «        s| dk    r:	 t	          j        | dgdd¬¦  «        }|j        dk    r| c S ŒQ# t          $ r Y Œ]w xY wŒbt          d¦  «        ‚)Nr   r   Tr   r   u2   KhÃ´ng tÃ¬m tháº¥y ffprobe.exe trong há»‡ thá»‘ng.)	ÚDEFAULT_FFPROBE_PATHSr   r   r   r   r   r   r   r   r   s     r    Úget_ffprober%   ;   s    € Ý"ð ð ˆÝŒ7�>Š>˜!ÑÔð 	  Y¢ ðÝ ”n a¨ _ÀTÐPTÐUÑUÔU�Ø”> QÒ&Ð&Ø�H�H�Hð 'øåð ð ð Ø�ðøøøð !/õ ÐPÑ
QÔ
QÐQr"   c            !       óŠ  — e Zd ZdZdZdZdZd„ Zdede	fd„Z
dedeeef         fd	„Zd
ee         fd„Z	 	 	 	 dDdee         dedededededefd„Z	 	 dEdedededededefd„Z	 	 	 dFd ed!ed"ed#edee	         f
d$„Z	 	 	 	 dGd%ed&ed!ed"ed#ed'edefd(„Z	 	 	 	 dHd%ed+ed&ed,ed-ed.ee         d/edefd0„Z	 	 	 	 	 	 	 	 	 	 	 	 	 dIdeded2ee         d3ee         d4ee         d5ee         d-ed/ed6ed7ed,ed!ed"ed#ed'edef d8„Z	 	 	 dJdedee         d9ed:edef
d;„Z	 dKded=eded>edef
d?„Z	 	 dLdAee	eef                  dedBededef
dC„Zd*S )MÚAudioContinuityEnginezStem 1: BGM & ScorezStem 2: Ambience & SoundscapezStem 3: Foley & Spot SFXzStem 4: Dialogue & Voice-Overc                 óR   — t          ¦   «         | _        t          ¦   «         | _        d S )N)r!   r   r%   r   )Úselfs    r    Ú__init__zAudioContinuityEngine.__init__N   s   € Ý ‘l”lˆŒÝ"‘}”}ˆŒˆˆó    Ú
video_pathr   c           
      ó‚  — t           j                             |¦  «        s|dddddœS | j        ddddd	d
|g}t	          j        |dd¬¦  «        }|j        dk    rt          j        |j	        ¦  «        ni }| 
                    dg ¦  «        }| 
                    di ¦  «        }t          | 
                    dd¦  «        ¦  «        }d„ |D ¦   «         }|s%t           j                             |¦  «        d|dddœS |d         }	| j        d|dddddg}
t	          j        |
dd¬¦  «        }|j        }d\  }}|                     ¦   «         D ]Ô}d|v re	 t          |                     d¦  «        d                              d¦  «        d                              ¦   «         ¦  «        }Œ[# t$          $ r Y Œgw xY wd|v re	 t          |                     d¦  «        d                              d¦  «        d                              ¦   «         ¦  «        }ŒÄ# t$          $ r Y ŒÐw xY wŒÕt          |	 
                    d|¦  «        ¦  «        }t           j                             |¦  «        d|	 
                    d¦  «        t'          |	 
                    d d!¦  «        ¦  «        t'          |	 
                    d"d#¦  «        ¦  «        |dk    r|n|||d$œS )%uW   PhÃ¢n tÃ­ch chi tiáº¿t luá»“ng Ã¢m thanh vÃ  má»©c Ã¢m lÆ°á»£ng cá»§a má»™t shot video.Fç     ÀXÀzFile not found)ÚfileÚ	has_audioÚmax_volume_dbÚmean_volume_dbÚerrorú-vr3   ú-show_entrieszSstream=codec_type,codec_name,sample_rate,channels,duration,bit_rate:format=durationú-ofÚjsonTr   r   ÚstreamsÚformatÚdurationç        c                 óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS )Ú
codec_typeÚaudio)Úget)Ú.0Úss     r    ú
<listcomp>z<AudioContinuityEngine.inspect_shot_audio.<locals>.<listcomp>i   s.   € ÐNÐNÐN˜q¨q¯uªu°\Ñ/BÔ/BÀgÒ/MÐ/M˜Ð/MÐ/MÐ/Mr+   )r/   r0   r:   r1   r2   ú-iú-afÚvolumedetectú-fÚnullú-)r.   r.   zmax_volume:é   ÚdBzmean_volume:Ú
codec_nameÚsample_ratei€»  Úchannelsé   )r/   r0   ÚcodecrL   rM   r:   r1   r2   )r   r   r   r   r   r   r   r7   ÚloadsÚstdoutr?   ÚfloatÚbasenamer   ÚstderrÚ
splitlinesÚsplitÚstripr   Úint)r)   r,   Ú	probe_cmdr   Ú
probe_datar8   ÚfmtÚ	video_durÚaudio_streamsÚastreamÚvol_cmdÚvol_resrT   Úmax_volÚmean_volÚlineÚadurs                    r    Úinspect_shot_audioz(AudioContinuityEngine.inspect_shot_audioR   sû  € åŒw�~Š~˜jÑ)Ô)ð 	à"Ø"Ø!&Ø"'Ø)ðð ð ð ŒL˜$ ØÐrØ�6˜:ð
ˆ	õ
 Œn˜Y°tÀ$ÐGÑGÔGˆØ/2¬~ÀÒ/BÐ/B•T”Z ¤
Ñ+Ô+Ð+Èˆ
Ø—.’. ¨BÑ/Ô/ˆØ�nŠn˜X rÑ*Ô*ˆå˜#Ÿ'š' *¨cÑ2Ô2Ñ3Ô3ˆ	ØNÐN GÐNÑNÔNˆàð 	åœ×(Ò(¨Ñ4Ô4Ø"Ø%Ø!&Ø"'ðð ð ð   Ô"ˆà”;  j°%¸ÈÈvÐWZÐ[ˆÝ”. ¸ÀDÐIÑIÔIˆØ”ˆà(Ñˆ�Ø×%Ò%Ñ'Ô'ð 
	ð 
	ˆDØ Ð$Ð$ðÝ# D§J¢J¨}Ñ$=Ô$=¸aÔ$@×$FÒ$FÀtÑ$LÔ$LÈQÔ$O×$UÒ$UÑ$WÔ$WÑXÔX�G�GøÝ ð ð ð Ø�Dðøøøà 4Ð'Ð'ðÝ$ T§Z¢Z°Ñ%?Ô%?ÀÔ%B×%HÒ%HÈÑ%NÔ%NÈqÔ%Q×%WÒ%WÑ%YÔ%YÑZÔZ�H�HøÝ ð ð ð Ø�Dðøøøð (õ �W—[’[ ¨YÑ7Ô7Ñ8Ô8ˆå”G×$Ò$ ZÑ0Ô0ØØ—[’[ Ñ.Ô.Ý˜wŸ{š{¨=¸%Ñ@Ô@ÑAÔAÝ˜GŸKšK¨
°AÑ6Ô6Ñ7Ô7Ø $ q¢ ˜˜¨iØ$Ø&ð	
ð 	
ð 		
s&   ÅAFÆ
F,Æ+F,Æ4AHÈ
HÈHc           
      óè  — t           j                             |¦  «        sdS 	 | j        dddddddd	|g
}t	          j        |d
d
d¬¦  «        }|j        dk    rŠ|j        rƒt          j	        |j        ¦  «        }| 
                    dg ¦  «        }|rRt          |d          
                    dd¦  «        ¦  «        t          |d          
                    dd¦  «        ¦  «        fS n# t          $ r Y nw xY wdS )uI   TrÃ­ch xuáº¥t Ä‘á»™ phÃ¢n giáº£i (width, height) cá»§a video qua ffprobe.)r   r   r4   r3   z-select_streamszv:0r5   zstream=width,heightr6   r7   Té   )r   r   Útimeoutr   r8   ÚwidthÚheight)r   r   r   r   r   r   r   rQ   r7   rP   r?   rX   r   )r)   r,   Úcmdr   Údatar8   s         r    Úinspect_video_dimensionsz.AudioContinuityEngine.inspect_video_dimensions“   s  € åŒw�~Š~˜jÑ)Ô)ð 	Ø�4ð	à”˜d GØ! 5ØÐ!6Ø�v˜zð	ˆCõ ”. °TÀÈaÐPÑPÔPˆCØŒ~ Ò"Ð" s¤zÐ"Ý”z #¤*Ñ-Ô-�ØŸ(š( 9¨bÑ1Ô1�Øð ]Ý˜w qœzŸ~š~¨g°qÑ9Ô9Ñ:Ô:½CÀÈÄ
ÇÂÈxÐYZÑ@[Ô@[Ñ<\Ô<\Ð\Ð\øøÝð 	ð 	ð 	ØˆDð	øøøàˆts   £B=C" Ã"
C/Ã.C/Ú
shot_pathsc                 óÎ  — t          d¦  «         t          d¦  «         t          d¦  «         g }|D ],}|                      |¦  «        }|                     |¦  «         Œ-t          |¦  «        D ]ç\  }}|d         rdnd}t          d|dz   › d	|d
         d›d|d›d|d         d›d|d         d›d�¦  «         |dk    r˜||dz
           }|d         r_|d         rWt	          |d         |d         z
  ¦  «        }	|	dk    rt          d|	d›d|› d|dz   › d�¦  «         Œ¬t          d|	d›d�¦  «         ŒÁ|d         s|d         rt          d|dz   › d�¦  «         Œèt          d¦  «         |S )uC   Kiá»ƒm tra tÃ­nh liÃªn tá»¥c Ã¢m thanh cho toÃ n bá»™ chuá»—i shot.zL
===========================================================================uT   ðŸ“Š KIá»‚M TRA Ä�á»˜ Ä�á»’NG NHáº¤T Ã‚M THANH CHUá»–I SHOT (AUDIO CONTINUITY AUDIT)zK===========================================================================r0   u   ðŸ”Š CÃ³ Ã¢m thanhu   ðŸ”‡ CÃ‚M (No Audio Track)ú[rI   z] r/   z<35z | z<15z | Max: r1   z>5.1fz dB | Mean: r2   z dBr   g      @u3       âš ï¸� Cáº¢NH BÃ�O Lá»†CH Ã‚M LÆ¯á»¢NG: ChÃªnh ú.1fu    dB giá»¯a Shot u
    vÃ  Shot u    (Cáº§n Audio Normalize)u,       âœ“ Ä�á»™ chÃªnh Ã¢m lÆ°á»£ng an toÃ n: u+       âš ï¸� Cáº¢NH BÃ�O Máº¤T TIáº¾NG: Shot u4    khÃ´ng cÃ³ Ã¢m thanh (Cáº§n Bridge Audio Crossfade)zL===========================================================================
)Úprintre   ÚappendÚ	enumerateÚabs)
r)   rn   Úreportsr   ÚrepÚiÚrÚstatusÚprevÚ
delta_means
             r    Úinspect_sequencez&AudioContinuityEngine.inspect_sequence¨   sq  € åˆoÑÔÐÝÐdÑeÔeÐeÝˆh‰ŒˆàˆØð 	 ð 	 ˆAØ×)Ò)¨!Ñ,Ô,ˆCØ�NŠN˜3ÑÔÐÐå˜gÑ&Ô&ð 	Cð 	C‰DˆAˆqØ-.¨{¬^Ð]Ð)Ð)ÐA]ˆFÝð  H�a˜‘cð  Hð  H˜Q˜vœYð  Hð  Hð  H¨vð  Hð  Hð  HÀ1À_ÔCUð  Hð  Hð  HÐijÐk{Ôi|ð  Hð  Hð  Hð  Hñ  Iô  Ið  IØ�1ŠuˆuØ˜q ™s”|�Ø�[”>ð C d¨;Ô&7ð CÝ!$ QÐ'7Ô%8¸4Ð@PÔ;QÑ%QÑ!RÔ!R�JØ! CÒ'Ð'Ýð  _ÐT^ð  _ð  _ð  _Ðtuð  _ð  _ð  BCð  DEñ  BEð  _ð  _ð  _ñ  `ô  `ð  `ð  `åÐ`ÈZÐ`Ð`Ð`Ð`ÑaÔaÐaÐaØ˜;œð C¨D°Ô,=ð CÝð  BÈÈ!Éð  Bð  Bð  Bñ  Cô  Cð  CøåˆoÑÔÐØˆr+   ç      ð?TÚ
acrossfadeÚvideo_pathsÚoutput_pathÚcrossfade_durÚnormalize_lufsÚmodeÚactive_gain_stagingc                 ó°
  ‡ — |st          d¦  «         dS |D ]l}‰                      |¦  «        \  }}	|dk    rL|	dk    rF||	z  dk     r=t          dt          j                             |¦  «        › d|› d|	› d||	z  d	›d
�	¦  «        ‚Œmt          dt          |¦  «        › d|› d|› d�¦  «         t          j        t          j                             t          j         	                    |¦  «        ¦  «        d¬¦  «         g }
|D ]}|
 
                    d|g¦  «         Œg }t          t          |¦  «        ¦  «        D ]}|                     d|› d|› d�¦  «         Œd                     d„ t          t          |¦  «        ¦  «        D ¦   «         ¦  «        }|                     |› dt          |¦  «        › d�¦  «         ˆ fd„|D ¦   «         }t          |¦  «        D ]Ô\  }}|d         r�d}|ri|d         dk    r]d|d         z
  }t          dt!          d|¦  «        ¦  «        }|d          |z   d!k    rd!|d          z
  }t#          |¦  «        d"k    rd#|d$›d%�}|                     d|› d&|› d'|› d�¦  «         Œš|                     d(d)¦  «        }|dk    rd)}|                     d*|› d+|› d�¦  «         ŒÕt          |¦  «        d,k    r|                     d-¦  «         �n®|d.v rÐd/}t          |¦  «        D ]\\  }}|                     d(d)¦  «        }|dk    rd)}t          d0||z
  ¦  «        }|                     d1|› d2|› d3|d	›d4|› d5|› d6�¦  «         Œ]d                     d7„ t          t          |¦  «        ¦  «        D ¦   «         ¦  «        }|                     |› dt          |¦  «        › d8�¦  «         nÚt          |¦  «        d9k    r|                     d:|› d;�¦  «         n˜t          |¦  «        d9k    r…|                     d:|› d<�¦  «         t          d9t          |¦  «        ¦  «        D ]N}d=|d,z
  › d>�}d1|› d�}|t          |¦  «        d,z
  k    rd?nd=|› d>�}|                     |› |› d@|› dA|› �¦  «         ŒO|                     dB¦  «         |r|                     dC¦  «         n|                     dD¦  «         dE                     |¦  «        }‰ j        dFg|
¢dG‘|‘dH‘dI‘dH‘dJ‘dK‘dL‘dM‘dN‘dO‘dP‘dQ‘dR‘dS‘dT‘dU‘dV‘dW‘|‘}t)          j        |dd¬X¦  «        }|j        dk    rt          dY|› �¦  «         dS t          dZ¦  «         t          |j        d[d\…         ¦  «         dS )]u£  
        GhÃ©p ná»‘i chuá»—i video vá»›i chuyá»ƒn tiáº¿p Ã¢m thanh mÆ°á»£t mÃ  (Equal-Power Crossfade)
        vÃ  chuáº©n hÃ³a Ã¢m lÆ°á»£ng EBU R128 (-14 LUFS) Ä‘á»ƒ trÃ¡nh giáº­t cá»¥t.
        - Mode A ("boundary_smoothing" / "micro_crossfade"): Micro-fade 30ms (qsin) báº£o toÃ n thá»�i lÆ°á»£ng 100%.
        - Mode B ("acrossfade" - Máº·c Ä‘á»‹nh): Chuá»—i acrossfade (c1=qsin, c2=qsin) kÃ¨m tail padding apad.
        - Stream Pre-conditioning: aresample=48000,aformat=channel_layouts=stereo vÃ  fallback aevalsrc=0 cho video cÃ¢m.
        - Active RMS Gain Staging: Ä�iá»�u chá»‰nh cÃ¡c shot chÃªnh lá»‡ch Ã¢m lÆ°á»£ng vÆ°á»£t 3.0 dB vá»� chuáº©n -24.0 dBFS.
        u   [!] Danh sÃ¡ch file rá»—ng.Fr   çHáz®Gõ?ú([CRITICAL ASPECT RATIO REJECTION] Video õ    cÃ³ tá»· lá»‡ dá»�c Úxú (ratio=ú.3fõr   ). Báº£n Master Ä‘iá»‡n áº£nh 16:9 NGHIÃŠM Cáº¤M video 9:16. GhÃ©p ná»‘i bá»‹ há»§y! Cáº§n render láº¡i shot 16:9.u   
[*] Ä�ang ghÃ©p u    shot vá»›i Audio Crossfade (zs, mode=z)...T©Úexist_okrC   rp   úi:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fps=24[vú_norm]Ú c                 ó   — g | ]}d |› d�‘Œ	S )ú[vr‘   © ©r@   rx   s     r    rB   zEAudioContinuityEngine.stitch_with_audio_crossfade.<locals>.<listcomp>ð   s    € Ð"SÐ"SÐ"S°a >¨ > > >Ð"SÐ"SÐ"Sr+   ú	concat=n=z:v=1:a=0[v_raw]c                 ó:   •— g | ]}‰                      |¦  «        ‘ŒS r•   ©re   )r@   r   r)   s     €r    rB   zEAudioContinuityEngine.stitch_with_audio_crossfade.<locals>.<listcomp>ô   s'   ø€ ÐCÐCÐC°!�4×*Ò*¨1Ñ-Ô-ÐCÐCÐCr+   r0   r2   ç     €VÀg      8Àg      (Àg      @r1   ç      ð¿gš™™™™™É?zvolume=ú.2fzdB,z:a]zCaresample=48000,aformat=sample_rates=48000:channel_layouts=stereo[ar:   ç      $@úaevalsrc=0:d=ú:s=48000:c=stereo[arI   z[a0_norm]anull[a_faded])Úboundary_smoothingÚmicro_crossfadeÚmode_aç¸…ëQ¸ž?r;   ú[az_norm]afade=t=in:st=0:d=ú:curve=qsin,afade=t=out:st=ú:d=z:curve=qsin[aú_faded]c                 ó   — g | ]}d |› d�‘Œ	S )r¤   r§   r•   r–   s     r    rB   zEAudioContinuityEngine.stitch_with_audio_crossfade.<locals>.<listcomp>  s    € ÐQÐQÐQ°A  Q   ÐQÐQÐQr+   z:v=0:a=1[a_faded]rN   z[a0_norm][a1_norm]acrossfade=d=z:c1=qsin:c2=qsin[a_raw_faded]z:c1=qsin:c2=qsin[a_tmp1]z[a_tmpú]z[a_raw_faded]zacrossfade=d=ú:c1=qsin:c2=qsinz[a_raw_faded]apad[a_faded]z,[a_faded]loudnorm=I=-14:TP=-1.0:LRA=9[a_out]z[a_faded]anull[a_out]ú;ú-yú-filter_complexú-mapz[v_raw]ú[a_out]ú-c:vÚlibx264ú-crfÚ18ú-presetÚslowú-c:aÚaacú-b:aÚ192kú-arÚ48000ú	-shortestr   u=   [âœ“] GhÃ©p video vÃ  Ä‘á»“ng nháº¥t Ã¢m thanh THÃ€NH CÃ”NG: u   [!] Lá»—i FFmpeg khi ghÃ©p:iþÿÿN)rr   rm   Ú
ValueErrorr   r   rS   ÚlenÚmakedirsÚdirnameÚabspathÚextendÚrangers   Újoinrt   ÚmaxÚminru   r?   r   r   r   r   rT   )r)   r€   r�   r‚   rƒ   r„   r…   r   ÚwÚhÚinputsÚfilter_partsrx   Úv_concat_inputsrv   rw   Úgain_filterÚdelta_targetÚgain_adjÚclip_durÚ	micro_durÚcdurÚ	out_startÚa_inputsÚin_aÚnext_aÚout_aÚfilter_complex_strrk   r   s   `                             r    Ústitch_with_audio_crossfadez1AudioContinuityEngine.stitch_with_audio_crossfadeÄ   s½  ø€ ð" ð 	ÝÐ/Ñ0Ô0Ð0Ø�5ð ð 	ð 	ˆAØ×0Ò0°Ñ3Ô3‰DˆAˆqØ�1Šuˆu˜˜Qš˜ A¨¡E¨D¢L LÝ ðG½r¼w×?OÒ?OÐPQÑ?RÔ?Rð Gð GÐijð Gð GÐmnð Gð GÐxyÐz{Ñx{ð  Eð Gð Gð Gñô ð øõ
 	Ðs¥3 {Ñ#3Ô#3ÐsÐsÐR_ÐsÐsÐimÐsÐsÐsÑtÔtÐtÝ
Œ•B”G—O’O¥B¤G§O¢O°KÑ$@Ô$@ÑAÔAÈDÐQÑQÔQÐQàˆØð 	%ð 	%ˆAØ�MŠM˜4 ˜)Ñ$Ô$Ð$Ð$àˆå•s˜;Ñ'Ô'Ñ(Ô(ð 	ð 	ˆAØ×Òð J�Að  Jð  Jð  ABð  Jð  Jð  Jñô ð ð ð Ÿ'š'Ð"SÐ"S½5ÅÀ[ÑAQÔAQÑ;RÔ;RÐ"SÑ"SÔ"SÑTÔTˆØ×Ò˜ÐZÐZ½¸[Ñ9IÔ9IÐZÐZÐZÑ[Ô[Ð[ð DÐCÐCÐC°{ÐCÑCÔCˆå Ñ(Ô(ð 	\ð 	\‰FˆAˆsØ�;Ôð \Ø �Ø&ð B¨3Ð/?Ô+@À5Ò+HÐ+HØ#(¨3Ð/?Ô+@Ñ#@�LÝ" 5­#¨c°<Ñ*@Ô*@ÑAÔA�Hà˜?Ô+¨hÑ6¸Ò=Ð=Ø#'¨#¨oÔ*>Ñ#>˜Ý˜8‘}”}¨Ò+Ð+Ø&A°Ð&AÐ&AÐ&AÐ&A˜ð ×#Ò#Øw˜ÐwÐw˜kÐwÐwÐnoÐwÐwÐwñô ð ð ð
 Ÿ7š7 :¨tÑ4Ô4�Ø˜q’=�=Ø#�HØ×#Ò#Ð$Z°HÐ$ZÐ$ZÐQRÐ$ZÐ$ZÐ$ZÑ[Ô[Ð[Ð[õ ˆ{ÑÔ˜qÒ Ð Ø×ÒÐ 9Ñ:Ô:Ð:Ñ:ØÐHÐHÐHàˆIÝ# GÑ,Ô,ð ð ‘��3Ø—w’w˜z¨4Ñ0Ô0�Ø˜1’9�9Ø�DÝ  T¨IÑ%5Ñ6Ô6�	Ø×#Ò#ð[˜ð [ð [°Ið [ð [Ø&/ÐZð[ð [Ø8Að[ð [ØPQð[ð [ð [ñô ð ð ð —w’wÐQÐQ½½sÀ;Ñ?OÔ?OÑ9PÔ9PÐQÑQÔQÑRÔRˆHØ×Ò 8Ð YÐ Yµc¸+Ñ6FÔ6FÐ YÐ YÐ YÑZÔZÐZÐZõ �;ÑÔ 1Ò$Ð$Ø×#Ò#Ð$rÀmÐ$rÐ$rÐ$rÑsÔsÐsÐsÝ�[Ñ!Ô! AÒ%Ð%Ø×#Ò#Ð$mÀmÐ$mÐ$mÐ$mÑnÔnÐnÝ˜q¥# kÑ"2Ô"2Ñ3Ô3ð nð n�AØ* A a¡C˜?˜?˜?�DØ+ !˜^˜^˜^�FØ/0µC¸Ñ4DÔ4DÀqÑ4HÒ/HÐ/H˜O˜OÈmÐWXÈmÈmÈm�EØ ×'Ò'¨4Ð(l°Ð(lÐ(lÀmÐ(lÐ(lÐejÐ(lÐ(lÑmÔmÐmÐmð ×ÒÐ <Ñ=Ô=Ð=ð ð 	9Ø×ÒÐ NÑOÔOÐOÐOà×ÒÐ 7Ñ8Ô8Ð8à ŸXšX lÑ3Ô3Ðð ŒK˜ð
àð
ð ð
ð  2ð
ð ð	
ð ð	
ð
 ð
ð
 ð
ð ð
ð ð
ð ð
ð ð
ð ð
ð ð
ð ð
ð ð
ð ð
ð ð
ð ð
ð ð
ð ð
ð ð
ˆõ  Œn˜S°¸DÐAÑAÔAˆØŒ>˜QÒÐÝÐ_ÐR]Ð_Ð_Ñ`Ô`Ð`Ø�4åÐ0Ñ1Ô1Ð1Ý�#”*˜T˜U˜UÔ#Ñ$Ô$Ð$Ø�5r+   ç      @é¬  Úshot_kieu_pathÚshot_van_pathÚl_cut_overlap_secÚlowpass_freqc                 ó2  — t          d|› d�¦  «         | j        dd|d|dd|› d�dd	dd
dddddddddd|g}t          j        |dd¬¦  «        }|j        dk    rt          d|› �¦  «         dS t          d¦  «         t          |j        dd…         ¦  «         dS )uH  
        Ká»¹ thuáº­t L-Cut kinh Ä‘iá»ƒn: Tiáº¿ng Ä‘Ã n tam tháº­p lá»¥c cá»§a ThÃºy Kiá»�u tiáº¿p tá»¥c
        vá»�ng sang phÃ¢n cáº£nh cá»§a ThÃºy VÃ¢n bÃªn thá»�m hiÃªn (lá»�c táº§n sá»‘ lowpass giáº£ láº­p khoáº£ng cÃ¡ch),
        táº¡o sá»± gáº¯n káº¿t khÃ´ng gian vÃ  xÃºc cáº£m tuyá»‡t Ä‘á»‘i giá»¯a 2 chá»‹ em.
        u,   
[*] Ä�ang khá»Ÿi táº¡o L-Cut Audio Bridge (u$   s overlap) giá»¯a Kiá»�u vÃ  VÃ¢n...r¬   rC   r­   z=[0:a]atrim=start=6.5:end=10.0,asetpts=PTS-STARTPTS,lowpass=f=a  ,volume=0.7[kieu_echo];[1:a]volume=0.9[van_ambient];[kieu_echo]adelay=0|0[kieu_delayed];[van_ambient][kieu_delayed]amix=inputs=2:duration=first:dropout_transition=2[van_a_mix];[0:a][van_a_mix]acrossfade=d=0.75:c1=qsin:c2=qsin[a_lcut];[0:v][1:v]concat=n=2:v=1:a=0[v_out]r®   z[v_out]z[a_lcut]r°   r±   r²   r³   r¶   r·   r¸   r¹   rº   r»   Tr   r   uA   [âœ“] Ä�Ã£ táº¡o thÃ nh cÃ´ng phÃ¢n Ä‘oáº¡n L-Cut liá»�n máº¡ch: u   [!] Lá»—i táº¡o L-Cut:épþÿÿNF)rr   r   r   r   r   rT   )r)   rÛ   rÜ   r�   rÝ   rÞ   rk   r   s           r    Úcreate_l_cut_bridgez)AudioContinuityEngine.create_l_cut_bridgeN  sç   € õ 	ÐuÐ>OÐuÐuÐuÑvÔvÐvàŒK˜Ø�.Ø�-Øð3ÈLð 3ð 3ð 3ð �IØ�JØ�IØ�DØ�EØ�FØ�7Øð-
ˆõ0 Œn˜S°¸DÐAÑAÔAˆØŒ>˜QÒÐÝÐcÐVaÐcÐcÑdÔdÐdØ�4åÐ*Ñ+Ô+Ð+Ý�#”*˜T˜U˜UÔ#Ñ$Ô$Ð$Ø�5r+   ç      ,Àr›   ç      "@Ú
media_pathÚtarget_lufsÚ	target_tpÚ
target_lrac                 óž  — t           j                             |¦  «        sdS | j        ddd|ddddd	|› d
|› d|› d�dddg}t	          j        |dd¬¦  «        }|j        dk    rdS t          j        d|j	        ¦  «        }|sdS 	 t          j        |d         ¦  «        }t          |                     dd¦  «        ¦  «        }	t          |                     dd¦  «        ¦  «        }
t          |                     dd¦  «        ¦  «        }|	dk    s|
dk    s|dk    rd|d<   nt          |	¦  «        dk     rd|d<   nd|d<   |S # t          $ r Y dS w xY w)u-  
        Thá»±c hiá»‡n Pass 1 Ä‘o kiá»ƒm Ã¢m lÆ°á»£ng EBU R128 cá»§a file media qua FFmpeg loudnorm JSON.
        Tráº£ vá»� dictionary chá»©a: input_i, input_tp, input_lra, input_thresh, target_offset, is_silent.
        Báº£o vá»‡ chá»‘ng lá»—i -inf silence guard ngÄƒn ngá»«a crash FFmpeg.
        Nz-hide_bannerr¬   rC   z-vnz-snz-dnrD   úloudnorm=I=ú:TP=ú:LRA=z:print_format=jsonrF   rG   rH   Tr   r   z\{[\s\S]*?\}éÿÿÿÿÚinput_iz-99.0Úinput_tpÚinput_threshz-infÚ	is_silentrš   F)r   r   r   r   r   r   r   ÚreÚfindallrT   r7   rP   Ústrr?   rR   r   )r)   rä   rå   ræ   rç   rk   r   Úmatchesrl   rí   rî   rï   s               r    Úmeasure_loudnessz&AudioContinuityEngine.measure_loudness}  s•  € õ Œw�~Š~˜jÑ)Ô)ð 	Ø�4ð ŒK˜¨Ø�*Ø�5˜%ØÐ` Ð`Ð`°)Ð`Ð`À*Ð`Ð`Ð`Ø�&˜#ð
ˆõ Œn˜S°¸DÐAÑAÔAˆØŒ>˜QÒÐØ�4å”*˜_¨c¬jÑ9Ô9ˆØð 	Ø�4ð	Ý”:˜g bœkÑ*Ô*ˆDÝ˜$Ÿ(š( 9¨gÑ6Ô6Ñ7Ô7ˆGÝ˜4Ÿ8š8 J°Ñ8Ô8Ñ9Ô9ˆHÝ˜tŸxšx¨¸Ñ@Ô@ÑAÔAˆLð ˜&Ò Ð  H°Ò$6Ð$6¸,È&Ò:PÐ:PØ$(��[Ñ!Ð!Ý�w‘” %Ò'Ð'Ø$(��[Ñ!Ð!à$)��[Ñ!ØˆKøÝð 	ð 	ð 	Ø�4�4ð	øøøs   ÂB:D> Ä>
EÅEÚinput_videoÚoutput_videoÚtwo_passc                 ó¾  — t           j                             |¦  «        st          d|› �¦  «         dS t          d|› d|› dt           j                             |¦  «        › d�¦  «         t          j        t           j                             t           j                             |¦  «        ¦  «        d¬¦  «         d	|› d
|› d|› �}|�rŠ|                      ||||¬¦  «        }|�r5| 	                    d¦  «        �s	 t          | 	                    dd¦  «        ¦  «        }	t          | 	                    dd¦  «        ¦  «        }
t          | 	                    dd¦  «        ¦  «        }t          | 	                    dd¦  «        ¦  «        }t          | 	                    dd¦  «        ¦  «        }|	dk    rB|
dk    r<d	|› d
|› d|› d|	d›d|
d›d|d›d|d›d|d›d�}t          d |	d!›d"|
d!›d#|d!›d$�¦  «         n # t          t          f$ r t          d%¦  «         Y n~w xY w|r'| 	                    d¦  «        rt          d&¦  «         d'}nQt          d(¦  «         nA|                      ||||¬¦  «        }|r&| 	                    d¦  «        rt          d)¦  «         d'}| j        d*d+|d,|d-d.d/d0d1d2d3d4|g}t          j        |dd¬5¦  «        }|j        d6k    rt          d7|› �¦  «         dS t          d8¦  «         | j        d*d+|d,|d-d9d:d;d<d=d/d0d1d2d3d4|g}t          j        |dd¬5¦  «        }|j        d6k    rt          d>|› �¦  «         dS t          d?|j        d@dA…         › �¦  «         dS )Bu‹  
        Chuáº©n hÃ³a Ã¢m lÆ°á»£ng EBU R128 cho video thÃ nh pháº©m theo chuáº©n YouTube Green Dollar.
        Há»— trá»£ Two-Pass Linear Normalization (trÃ¡nh pumping, báº£o toÃ n dynamic range).
        - Target Integrated Loudness: -14.0 LUFS (Â±0.5 LUFS)
        - True Peak: -1.0 dBTP
        - Loudness Range: 9.0 LU (9.0 - 11.0 LU)
        - Sample Rate: 48000 Hz, Codec AAC 192k
        u)   [!] KhÃ´ng tÃ¬m tháº¥y file Ä‘áº§u vÃ o: Fu.   [*] Ä�ang chuáº©n hÃ³a Ã¢m lÆ°á»£ng EBU R128 (z LUFS, Two-Pass=z) cho: z...TrŽ   ré   rê   rë   )rå   ræ   rç   rð   rí   z-24.0rî   z-2.0Ú	input_lraz7.0rï   z-34.0Útarget_offsetz0.0r.   z:measured_I=rœ   z:measured_TP=z:measured_LRA=z:measured_thresh=ú:offset=z:linear=trueu      [Pass 1 Ä�áº¡t] Measured I=rq   z
 LUFS, TP=z dBTP, Offset=u&    dB -> Khá»Ÿi Ä‘á»™ng Pass 2 Linear...ua      [Pass 1 Parse Warning] GiÃ¡ trá»‹ Ä‘o kiá»ƒm khÃ´ng há»£p lá»‡, fallback single-pass loudnorm.uq      [Pass 1 Silence Guard] File cÃ¢m (-inf), Ã¡p dá»¥ng bá»™ lá»�c anull an toÃ n Ä‘á»ƒ chá»‘ng crash AAC encoder.Úanullu`      [Pass 1 Fallback] KhÃ´ng Ä‘o Ä‘Æ°á»£c thÃ´ng sá»‘, sá»­ dá»¥ng single-pass loudnorm an toÃ n.uk      [Single Pass Silence Guard] File cÃ¢m (-inf), Ã¡p dá»¥ng anull an toÃ n Ä‘á»ƒ chá»‘ng crash AAC encoder.r¬   rC   rD   r°   Úcopyr¶   r·   r¸   r¹   rº   r»   r   r   u.   [âœ“] Chuáº©n hÃ³a Ã¢m lÆ°á»£ng thÃ nh cÃ´ng: uL       [!] Stream copy video khÃ´ng tÆ°Æ¡ng thÃ­ch, fallback re-encode video...r±   r²   r³   r´   rµ   u:   [âœ“] Chuáº©n hÃ³a Ã¢m lÆ°á»£ng thÃ nh cÃ´ng (re-encode): u,   [!] Lá»—i chuáº©n hÃ³a Ã¢m lÆ°á»£ng FFmpeg: rà   N)r   r   r   rr   rS   r¿   rÀ   rÁ   rõ   r?   rR   r½   Ú	TypeErrorr   r   r   r   rT   )r)   rö   r÷   rå   ræ   rç   rø   Úloudnorm_filterÚmeasÚmiÚmtÚmlÚmthÚoffrk   r   Úcmd_fallbackÚres2s                     r    Únormalize_loudnessz(AudioContinuityEngine.normalize_loudness¬  sÎ  € õ" Œw�~Š~˜kÑ*Ô*ð 	ÝÐK¸kÐKÐKÑLÔLÐLØ�5åð  P¸{ð  Pð  PÐ\dð  Pð  PÕmoÔmt×m}Òm}ð  Jñ  nKô  nKð  Pð  Pð  Pñ  	Qô  	Qð  	QÝ
Œ•B”G—O’O¥B¤G§O¢O°LÑ$AÔ$AÑBÔBÈTÐRÑRÔRÐRàU¨ÐUÐU¸ÐUÐUÈÐUÐUˆð ñ 	*Ø×(Ò(¨À+ÐYbÐoyÐ(ÑzÔzˆDØñ z˜DŸHšH [Ñ1Ô1ñ zðÝ˜tŸxšx¨	°7Ñ;Ô;Ñ<Ô<�BÝ˜tŸxšx¨
°FÑ;Ô;Ñ<Ô<�BÝ˜tŸxšx¨°UÑ;Ô;Ñ<Ô<�BÝ §¢¨¸Ñ AÔ AÑBÔB�CÝ §¢¨¸%Ñ @Ô @ÑAÔA�CØ˜U’{�{ r¨U¢{ {ðV¨+ð Vð V¸9ð Vð VÈ:ð Vð VØ*,Ð^ðVð VØ?AÐ^ðVð VØUWÐ^ðVð Và/2ÐUðVð Và@CÐUðVð Vð Vð (õ
 ð  W¸rð  Wð  Wð  WÐQSð  Wð  Wð  WÐgjð  Wð  Wð  Wð  Wñ  Xô  Xð  XøøÝ"¥IÐ.ð ð ð ÝÐ}Ñ~Ô~Ð~Ð~Ð~ðøøøàð z˜$Ÿ(š( ;Ñ/Ô/ð zÝð  Jñ  Kô  Kð  KØ")��åÐxÑyÔyÐyÐyà×(Ò(¨À+ÐYbÐoyÐ(ÑzÔzˆDØð *˜Ÿš Ñ-Ô-ð *Ýð  Dñ  Eô  Eð  EØ")�ð ŒK˜Ø�+Ø�?Ø�FØ�EØ�FØ�7Øð	
ˆõ Œn˜S°¸DÐAÑAÔAˆØŒ>˜QÒÐÝÐQÀ<ÐQÐQÑRÔRÐRØ�4åÐ`ÑaÔaÐaà”˜TØ�kØ�Ø˜	 6¨4°¸FØ˜˜v v¨u°gØðˆLõ ”> ,¸tÈ$ÐOÑOÔOˆDØŒ !Ò#Ð#ÝÐaÐS_ÐaÐaÑbÔbÐbØ�tåÐYÀTÄ[ÐQUÐQVÐQVÔEWÐYÐYÑZÔZÐZØ�us   Ã;C7G3 Ç3 HÈHçffffffÖ?NÚbgm_pathÚduck_dbÚbgm_volÚambience_pathÚambience_volc                 óD  — t           j                             |¦  «        rt           j                             |¦  «        st          d|› d|› �¦  «         dS t          dt           j                             |¦  «        › d�¦  «         t          j        t           j                             t           j                             |¦  «        ¦  «        d¬¦  «         d|d	d
d|g}|rBt           j                             |¦  «        r#|                     d	d
d|g¦  «         d|› d|› d�}	nd|› d�}	| j	        dg|¢d‘|	‘d‘d‘d‘d‘d‘d‘d‘d‘d‘d‘d‘d‘d‘|‘}
t          j        |
dd¬¦  «        }|j        dk    rt          d |› �¦  «         dS t          d!¦  «         | j	        dg|¢d‘|	‘d‘d‘d‘d‘d‘d"‘d#‘d$‘d%‘d&‘d‘d‘d‘d‘d‘d‘d‘|‘}t          j        |dd¬¦  «        }|j        dk    rt          d'|› �¦  «         dS t          d(|j        d)d*…         › �¦  «         dS )+u·  
        Tráº£i tháº£m nháº¡c ná»�n (BGM) cho video vá»›i ká»¹ thuáº­t Dynamic Ducking vÃ  EBU R128:
        - BGM tá»± Ä‘á»™ng láº·p náº¿u ngáº¯n hÆ¡n video (-stream_loop -1), duration=first.
        - Khi cÃ³ thoáº¡i/foley á»Ÿ track gá»‘c (0:a), BGM tá»± háº¡ Ã¢m lÆ°á»£ng (ducking).
        - TÃ¹y chá»�n phá»‘i trá»™n thÃªm Stem 2 Ambience náº¿u Ä‘Æ°á»£c cung cáº¥p.
        - Chuáº©n hÃ³a Ä‘áº§u ra vá»� -14 LUFS / -1.0 dBTP.
        u#   [!] File khÃ´ng tá»“n táº¡i: input=z, bgm=Fu   [*] Ä�ang tráº£i tháº£m BGM (u'   ) vá»›i Sidechain Ducking vÃ o video...TrŽ   rC   ú-stream_loopú-1z<[0:a]asplit=3[onset_main][onset_bgm][onset_amb];[1:a]volume=zG,equalizer=f=2150:width_type=h:width=2700:g=-3.5[bgm_base];[2:a]volume=aV  [amb_base];[bgm_base][onset_bgm]sidechaincompress=threshold=0.08:ratio=4:attack=50:release=300[bgm_ducked];[amb_base][onset_amb]sidechaincompress=threshold=0.08:ratio=4:attack=50:release=300[amb_ducked];[onset_main][bgm_ducked][amb_ducked]amix=inputs=3:duration=first:dropout_transition=2[a_mixed];[a_mixed]loudnorm=I=-14:TP=-1.0:LRA=9[a_out]z1[0:a]asplit=2[onset_main][onset_bgm];[1:a]volume=zê[bgm_base];[bgm_base][onset_bgm]sidechaincompress=threshold=0.08:ratio=4:attack=20:release=350[bgm_ducked];[onset_main][bgm_ducked]amix=inputs=2:duration=first:dropout_transition=2[a_mixed];[a_mixed]loudnorm=I=-14:TP=-1.0:LRA=9[a_out]r¬   r­   r®   ú0:v:0r¯   r°   rþ   r¶   r·   r¸   r¹   rº   r»   r¼   r   r   u;   [âœ“] Tráº£i tháº£m BGM vÃ  Master Ã¢m thanh thÃ nh cÃ´ng: õ,       [!] Thá»­ láº¡i vá»›i re-encode video...r±   r²   r³   r´   rµ   u2   [âœ“] Tráº£i tháº£m BGM thÃ nh cÃ´ng (re-encode): u   [!] Lá»—i tráº£i BGM FFmpeg: rà   N)r   r   r   rr   rS   r¿   rÀ   rÁ   rÂ   r   r   r   r   rT   )r)   rö   r  r÷   r  r  r  r  rÉ   Ú
filter_strrk   r   r  r  s                 r    Úlayer_bgm_with_duckingz,AudioContinuityEngine.layer_bgm_with_ducking  s™  € õ" Œw�~Š~˜kÑ*Ô*ð 	µ"´'·.².ÀÑ2JÔ2Jð 	ÝÐU¸ÐUÐUÈ8ÐUÐUÑVÔVÐVØ�5åÐq­b¬g×.>Ò.>¸xÑ.HÔ.HÐqÐqÐqÑrÔrÐrÝ
Œ•B”G—O’O¥B¤G§O¢O°LÑ$AÔ$AÑBÔBÈTÐRÑRÔRÐRà˜ ^°T¸4ÀÐJˆàð 	�RœWŸ^š^¨MÑ:Ô:ð 	Ø�MŠM˜>¨4°°}ÐEÑFÔFÐFð@Ø&ð@ð @à+ð@ð @ð @ð ˆJð@Ø&ð@ð @ð @ð ð ŒK˜ð
àð
ð ð
ð  *ð
ð ð	
ð ð	
ð
 ð
ð
 ð
ð ð
ð ð
ð ð
ð ð
ð ð
ð ð
ð ð
ð ð
ð ð
ð ð
ˆõ Œn˜S°¸DÐAÑAÔAˆØŒ>˜QÒÐÝÐ^ÐP\Ð^Ð^Ñ_Ô_Ð_Ø�4åÐ@ÑAÔAÐAà”˜Tð
àð
ð "ð
ð $.ð
ð ð	
ð  ð	
ð
 ð
ð
 "ð
ð ð
ð "ð
ð $*ð
ð ,0ð
ð 2;ð
ð =Cð
ð ð
ð ð
ð  &ð
ð (.ð
ð 05ð
ð 7>ð
ð ð
ð ð
ˆLõ ”> ,¸tÈ$ÐOÑOÔOˆDØŒ !Ò#Ð#ÝÐYÈ<ÐYÐYÑZÔZÐZØ�tåÐJ°d´kÀ$À%À%Ô6HÐJÐJÑKÔKÐKØ�ur+   çš™™™™™é?Ú	stem1_bgmÚstem2_ambienceÚstem3_foleyÚstem4_dialogueÚ	foley_volÚdialogue_volc                 ó  — t           j                             |¦  «        st          d|› �¦  «         dS t          j        t           j                             t           j                             |¦  «        ¦  «        d¬¦  «         t          dt           j                             |¦  «        › �¦  «         d|g}g }g }d}t          |ot           j                             |¦  «        ¦  «        }t          |ot           j                             |¦  «        ¦  «        }|rdnd|rdndz   }t          |ot           j                             |¦  «        ¦  «        }|  	                    |¦  «         
                    d	d¦  «        }d
}d
}|r¥|                     d|g¦  «         |}|dz  }|                     d|› d|
› d�¦  «         |dk    r|                     d¦  «         d}d}n5|dk    r|                     d¦  «         d}d}n|                     d¦  «         |                     d¦  «         n…|rƒ|                     d|
› d�¦  «         |dk    r|                     d¦  «         d}d}n5|dk    r|                     d¦  «         d}d}n|                     d¦  «         |                     d¦  «         |r‚|                     ddd|g¦  «         |}|dz  }|                     d|› d|› d�¦  «         |r/|                     d|› d�¦  «         |                     d¦  «         n|                     d¦  «         |r‚|                     ddd|g¦  «         |}|dz  }|                     d|› d|› d �¦  «         |r/|                     d |› d!�¦  «         |                     d"¦  «         n|                     d ¦  «         |rnt           j                             |¦  «        rO|                     d|g¦  «         |}|dz  }|                     d|› d|	› d#�¦  «         |                     d#¦  «         |s|                      ||||||¬$¦  «        S d%                     |¦  «        › d&t          |¦  «        › d'�}|                     |¦  «         |                     d(¦  «         d)                     |¦  «        } | j        d*g|¢d+‘| ‘d,‘d-‘d,‘d.‘d/‘d0‘d1‘d2‘d3‘d4‘d5‘d6‘d7‘|‘}!t#          j        |!dd¬8¦  «        }"|"j        dk    rŸt          d9|› �¦  «         |r‰|d:z   }#t           j                             |¦  «        ret)          j        ||#¦  «         |                      |#||||d¬$¦  «        }$t           j                             |#¦  «        rt          j        |#¦  «         |$S dS t          d;¦  «         | j        d*g|¢d+‘| ‘d,‘d-‘d,‘d.‘d/‘d<‘d=‘d>‘d?‘d@‘d1‘d2‘d3‘d4‘d5‘d6‘d7‘|‘}%t#          j        |%dd¬8¦  «        }&|&j        dk    r‹|r‰|d:z   }#t           j                             |¦  «        ret)          j        ||#¦  «         |                      |#||||d¬$¦  «        }$t           j                             |#¦  «        rt          j        |#¦  «         |$S |&j        dk    S )AuŠ  
        Phá»‘i Ã¢m toÃ n diá»‡n theo Kiáº¿n TrÃºc 4 Stems Ä�á»™c Láº­p chuáº©n Hollywood/EBU R128:
        - Stem 1 (BGM): Láº·p liÃªn tá»¥c (-stream_loop -1), EQ notch 800Hz - 3500Hz, ducking khi cÃ³ thoáº¡i.
        - Stem 2 (Ambience): Ã‚m cáº£nh mÃ´i trÆ°á»�ng 3D liÃªn tá»¥c, ducking khi cÃ³ thoáº¡i.
        - Stem 3 (Foley): Ã‚m thanh tÃ¡c Ä‘á»™ng cÆ¡ há»�c sáº¯c nÃ©t (Ã¡o lá»¥a, trÃ¢m cÃ i, tÃ¡ch trÃ , vÃ³ ngá»±a).
        - Stem 4 (Dialogue): Thoáº¡i & ngÃ¢m thÆ¡, kÃ­ch hoáº¡t sidechain ducking (-14dB) cho Stem 1 & Stem 2.
        - Master Output: Chuáº©n hÃ³a Two-Pass Linear EBU R128 (-14 LUFS, TP -1.0, LRA 9-11, 48kHz AAC).
        u*   [!] KhÃ´ng tÃ¬m tháº¥y video Ä‘áº§u vÃ o: FTrŽ   u.   
ðŸŽ›ï¸� Báº®T Ä�áº¦U PHá»�I Ã‚M 4 STEMS CHO: rC   rI   r   r0   Nrp   z9:a]aresample=48000,aformat=channel_layouts=stereo,volume=z[stem4_voc]rN   z3[stem4_voc]asplit=3[voc_main][voc_side1][voc_side2]z[voc_side1]z[voc_side2]z([stem4_voc]asplit=2[voc_main][voc_side1]z[stem4_voc]anull[voc_main]z
[voc_main]z;[0:a]aresample=48000,aformat=channel_layouts=stereo,volume=z[onset_voc]z3[onset_voc]asplit=3[voc_main][voc_side1][voc_side2]z([onset_voc]asplit=2[voc_main][voc_side1]z[onset_voc]anull[voc_main]r  r  z:,equalizer=f=2150:width_type=h:width=2700:g=-3.5[bgm_base]z
[bgm_base]zJsidechaincompress=threshold=0.08:ratio=4:attack=50:release=300[bgm_ducked]z[bgm_ducked]z
[amb_base]zJsidechaincompress=threshold=0.08:ratio=4:attack=50:release=300[amb_ducked]z[amb_ducked]z
[fol_base])rå   ræ   rç   rø   r’   zamix=inputs=z+:duration=first:dropout_transition=2[a_mix]z*[a_mix]loudnorm=I=-14:TP=-1.0:LRA=9[a_out]r«   r¬   r­   r®   r  r¯   r°   rþ   r¶   r·   r¸   r¹   rº   r»   r¼   r   u#   [âœ“] Phá»‘i 4 stems thÃ nh cÃ´ng: z.temp_norm.mp4r  r±   r²   r³   r´   rµ   )r   r   r   rr   r¿   rÀ   rÁ   rS   Úboolre   r?   rÂ   rs   r	  rÄ   r¾   r   r   r   r   ÚshutilÚmoveÚunlink)'r)   r,   r�   r  r  r  r  r  r  r  r  r  rå   ræ   rç   rø   rÉ   rÊ   Ú
mix_inputsÚ	input_idxÚhas_bgmÚhas_ambÚduck_targetsÚhas_dialogue_stemÚhas_video_audioÚside_bgm_tagÚside_amb_tagÚdiag_idxÚbgm_idxÚamb_idxÚfol_idxÚ	amix_liner×   rk   r   Útemp_masterÚokr  r  s'                                          r    Úmix_four_stemsz$AudioContinuityEngine.mix_four_stemsZ  s	  € õ4 Œw�~Š~˜jÑ)Ô)ð 	ÝÐK¸zÐKÐKÑLÔLÐLØ�5å
Œ•B”G—O’O¥B¤G§O¢O°KÑ$@Ô$@ÑAÔAÈDÐQÑQÔQÐQÝÐ^ÅÄ×@PÒ@PÐQ[Ñ@\Ô@\Ð^Ð^Ñ_Ô_Ð_à˜
Ð#ˆØˆØˆ
Øˆ	õ �yÐ>¥R¤W§^¢^°IÑ%>Ô%>Ñ?Ô?ˆÝ�~ÐH­"¬'¯.ª.¸Ñ*HÔ*HÑIÔIˆØ$Ð+˜˜¨!°WÐ0C°°À!ÑDˆõ ! Ð!RµB´G·N²NÀ>Ñ4RÔ4RÑSÔSÐØ×1Ò1°*Ñ=Ô=×AÒAÀ+ÈuÑUÔUˆàˆØˆàð 	,Ø�MŠM˜4 Ð0Ñ1Ô1Ð1Ø ˆHØ˜‰NˆIØ×Òð  !A Hð  !Að  !AÐgsð  !Að  !Að  !Añ  Bô  Bð  BØ˜qÒ Ð Ø×#Ò#Ð$YÑZÔZÐZØ,�Ø,��Ø Ò"Ð"Ø×#Ò#Ð$NÑOÔOÐOØ,�Ø,��à×#Ò#Ð$@ÑAÔAÐAØ×Ò˜lÑ+Ô+Ð+Ð+Øð 	,Ø×ÒÐ wÐ^jÐ wÐ wÐ wÑxÔxÐxØ˜qÒ Ð Ø×#Ò#Ð$YÑZÔZÐZØ,�Ø,��Ø Ò"Ð"Ø×#Ò#Ð$NÑOÔOÐOØ,�Ø,��à×#Ò#Ð$@ÑAÔAÐAØ×Ò˜lÑ+Ô+Ð+ð ð 	0Ø�MŠM˜>¨4°°yÐAÑBÔBÐBØˆGØ˜‰NˆIØ×ÒðM�Gð Mð MÐV]ð Mð Mð Mñô ð ð ð 0Ø×#Ò#ð  %J°ð  %Jð  %Jð  %Jñ  Kô  Kð  KØ×!Ò! .Ñ1Ô1Ð1Ð1à×!Ò! ,Ñ/Ô/Ð/ð ð 		0Ø�MŠM˜>¨4°°~ÐFÑGÔGÐGØˆGØ˜‰NˆIØ×ÒÐ ~ GÐ ~Ð ~ÐfrÐ ~Ð ~Ð ~ÑÔÐØð 0Ø×#Ò#ð  %J°ð  %Jð  %Jð  %Jñ  Kô  Kð  KØ×!Ò! .Ñ1Ô1Ð1Ð1à×!Ò! ,Ñ/Ô/Ð/ð ð 	,�2œ7Ÿ>š>¨+Ñ6Ô6ð 	,Ø�MŠM˜4 Ð-Ñ.Ô.Ð.ØˆGØ˜‰NˆIØ×ÒÐ { GÐ {Ð {ÐfoÐ {Ð {Ð {Ñ|Ô|Ð|Ø×Ò˜lÑ+Ô+Ð+ð ð 	\Ø×*Ò*¨:°{ÐP[Ðgpð  ~Hð  S[Ð*ñ  \ô  \ð  \ð —w’w˜zÑ*Ô*ÐtÐt½¸J¹¼ÐtÐtÐtˆ	Ø×Ò˜IÑ&Ô&Ð&Ø×ÒÐHÑIÔIÐIØ ŸXšX lÑ3Ô3Ðð ŒK˜ð
àð
ð ð
ð  2ð
ð ð	
ð ð	
ð
 ð
ð
 ð
ð ð
ð ð
ð ð
ð ð
ð ð
ð ð
ð ð
ð ð
ð ð
ð ð
ˆõ Œn˜S°¸DÐAÑAÔAˆØŒ>˜QÒÐÝÐE¸ÐEÐEÑFÔFÐFØð à)Ð,<Ñ<�Ý”7—>’> +Ñ.Ô.ð Ý”K ¨[Ñ9Ô9Ð9Ø×0Ò0°¸kÐWbÐnwð  EOð  Z^Ð0ñ  _ô  _�BÝ”w—~’~ kÑ2Ô2ð /Ýœ	 +Ñ.Ô.Ð.Ø�IØ�4åÐ@ÑAÔAÐAà”˜Tð
àð
ð "ð
ð $6ð
ð ð	
ð  ð	
ð
 ð
ð
 "ð
ð ð
ð "ð
ð $*ð
ð ,0ð
ð 2;ð
ð =Cð
ð ð
ð ð
ð  &ð
ð (.ð
ð 05ð
ð 7>ð
ð ð
ð ð
ˆLõ ”> ,¸tÈ$ÐOÑOÔOˆDØŒ !Ò#Ð#¨Ð#Ø)Ð,<Ñ<�Ý”7—>’> +Ñ.Ô.ð Ý”K ¨[Ñ9Ô9Ð9Ø×0Ò0°¸kÐWbÐnwð  EOð  Z^Ð0ñ  _ô  _�BÝ”w—~’~ kÑ2Ô2ð /Ýœ	 +Ñ.Ô.Ð.Ø�IØ”? aÒ'Ð'r+   Útrim_durÚdetect_staticc                 ó:  — t           j                             |¦  «        s|S |                      |¦  «        }t	          |                     dd¦  «        ¦  «        }|dk    r||dz   k    r|S | }|�rƒ	 ddl}ddl}	|                     |¦  «        }
|
 	                    ¦   «         �r=|
                     |j
        ¦  «        pd}t          dt          |t          |dz  d¦  «        z  ¦  «        ¦  «        }|
                     ¦   «         \  }}|
                     |j        |¦  «         |
                     ¦   «         \  }}|
                     ¦   «          |r‘|r�|��|�‹t	          |	                     |	                     |                     t          ¦  «        |                     t          ¦  «        z
  ¦  «        ¦  «        ¦  «        }|d	k     rd
}t+          d|d›d|› d|d›d�¦  «         n# t,          $ r d}Y nw xY w|s|S |pCt/          t1          |¦  «                             t1          |¦  «        j        › d�¦  «        ¦  «        }t          j        t           j                             t           j                             |¦  «        ¦  «        d
¬¦  «         | j        ddt/          |¦  «        d|dddddddddd d!d"|g}t?          j         |d
d
¬#¦  «        }|j!        dk    rDt           j                             |¦  «        r%t           j         "                    |¦  «        d$k    r|S |S )%uö  
        Cáº¯t tá»‰a thÃ´ng minh pháº§n Ä‘áº§u cÃº mÃ¡y (Dynamic Head Trim):
        - Kiá»ƒm tra thá»�i lÆ°á»£ng: chá»‰ thá»±c hiá»‡n khi video Ä‘á»§ dÃ i (duration > trim_dur + 0.5s).
        - Tá»± Ä‘á»™ng phÃ¡t hiá»‡n hiá»‡n tÆ°á»£ng Ä‘Æ¡ hÃ¬nh/hitch tÄ©nh trong 1 giÃ¢y Ä‘áº§u (24 frames) cá»§a AI video.
        - Náº¿u cÃ³ Ä‘Æ¡ hÃ¬nh hoáº·c detect_static=False: Ã¡p dá»¥ng -ss {trim_dur} Ä‘á»ƒ loáº¡i bá»� frame tÄ©nh Ä‘áº§u.
        - Báº£o toÃ n 100% Ã¢m thanh AAC táº¡i 48kHz stereo.
        r:   r;   ç      à?r   Ng      8@rI   r  g      ø?Tu@         âœ‚ï¸� [SMART TRIM] PhÃ¡t hiá»‡n Ä‘áº§u video tÄ©nh (diff=rœ   u    < 1.5 táº¡i frame u   ). KÃ­ch hoáº¡t -ss rq   zs.Fz_trimmed.mp4rŽ   r¬   z-ssrC   r°   r±   r²   r³   r´   Úfastr¶   r·   r¸   r¹   rº   r»   r   iè  )#r   r   r   re   rR   r?   Úcv2ÚnumpyÚVideoCaptureÚisOpenedÚCAP_PROP_FPSrÅ   rX   rÆ   ÚreadÚsetÚCAP_PROP_POS_FRAMESÚreleaseÚmeanru   Úastyperr   r   ró   r   Ú	with_nameÚstemr¿   rÀ   rÁ   r   r   r   r   Úgetsize)r)   r,   r�   r4  r5  ÚinfoÚ	total_durÚshould_trimr9  ÚnpÚcapÚfpsÚ	check_idxÚret1Úf1Úret2Úf2ÚdiffÚoutrk   r   s                        r    Úsmart_trim_shot_headz*AudioContinuityEngine.smart_trim_shot_head
  sK  € õ Œw�~Š~˜jÑ)Ô)ð 	ØÐð ×&Ò& zÑ2Ô2ˆÝ˜$Ÿ(š( :¨sÑ3Ô3Ñ4Ô4ˆ	Ø�sŠ?ˆ?˜y¨X¸©^Ò<Ð<àÐà'Ð'ˆØñ 	$ð$Ø�
�
�
Ø"Ð"Ð"Ð"Ø×&Ò& zÑ2Ô2�Ø—<’<‘>”>ñ sØŸ'š' #Ô"2Ñ3Ô3Ð;°t�CÝ # A¥s¨3µ°XÀ±^ÀSÑ1IÔ1IÑ+IÑ'JÔ'JÑ KÔ K�IØ"Ÿxšx™zœz‘H�D˜"Ø—G’G˜CÔ3°YÑ?Ô?Ð?Ø"Ÿxšx™zœz‘H�D˜"Ø—K’K‘M”M�MØð s ð s¨¨¸B¸NÝ$ R§W¢W¨R¯VªV°B·I²I½eÑ4DÔ4DÀrÇyÂyÕQVÑGWÔGWÑ4WÑ-XÔ-XÑ%YÔ%YÑZÔZ˜Ø #š:˜:Ø*.˜KÝ!ð  #rÐeið  #rð  #rð  #rð  CLð  #rð  #rð  bjð  #rð  #rð  #rð  #rñ  sô  sð  søøÝð $ð $ð $Ø#���ð$øøøð ð 	ØÐàÐd�S¥ jÑ!1Ô!1×!;Ò!;½tÀJÑ?OÔ?OÔ?TÐ<bÐ<bÐ<bÑ!cÔ!cÑdÔdˆÝ
Œ•B”G—O’O¥B¤G§O¢O°CÑ$8Ô$8Ñ9Ô9ÀDÐIÑIÔIÐIð ŒK˜Ø•3�x‘=”=Ø�*Ø�I˜v t¨Y¸Ø�E˜6 6¨5°'Øð
ˆõ Œn˜S°¸DÐAÑAÔAˆØŒ>˜QÒÐ¥2¤7§>¢>°#Ñ#6Ô#6Ð½2¼7¿?º?È3Ñ;OÔ;OÐRVÒ;VÐ;VØˆJØÐs   Á2E/G" Ç"G1Ç0G1ç333333Ó?Únarration_audio_pathÚ
buffer_secc                 ó  — t           j                             |¦  «        rt           j                             |¦  «        st          d|› d|› �¦  «         dS | j        dddddd	|g}t          j        |d
d
¬¦  «        }d}|j        dk    r`	 t          t          j
        |j        ¦  «                             di ¦  «                             dd¦  «        ¦  «        }n# t          $ r Y nw xY w|dk    rt          d¦  «         dS ||z   }t          j        t           j                             t           j                             |¦  «        ¦  «        d
¬¦  «         |dz   }	d}
|
› d�}| j        dd|d|d|d›d|dddddddd d!d"d#d$d%d&d'd(|	g}t          j        |d
d
¬¦  «        }|j        dk    st           j                             |	¦  «        sid)}| j        dd|d|d|d›d|dddd*dddd d!d"d#d$d%d&d'd(|	g}t          j        |d
d
¬¦  «        }|j        dk    st           j                             |	¦  «        sdS |                      |	|d+d
¬,¦  «        }t           j                             |	¦  «        r&	 t          j        |	¦  «         n# t          $ r Y nw xY w|S )-u%  
        Khá»›p thá»�i lÆ°á»£ng video vá»›i Ã¢m thanh thuyáº¿t minh (Narrator Fitting):
        - Ä�o Ä‘áº¡c chÃ­nh xÃ¡c thá»�i lÆ°á»£ng giá»�ng Ä‘á»�c qua ffprobe.
        - Khá»›p video theo Ä‘á»™ dÃ i thuyáº¿t minh + buffer an toÃ n (buffer_sec).
        - Náº¿u video ngáº¯n hÆ¡n thá»�i lÆ°á»£ng thuyáº¿t minh, tá»± Ä‘á»™ng giá»¯ frame cuá»‘i (tpad clone) Ä‘á»ƒ trÃ¡nh Ä‘á»©t video sá»›m.
        - Trá»™n Ã¢m thanh thuyáº¿t minh vá»›i Ã¢m thanh foley/ambience gá»‘c.
        - Chuáº©n hÃ³a Ä‘áº§u ra Ä‘áº¡t chuáº©n EBU R128 (-14 LUFS).
        u4   [!] File video hoáº·c narration khÃ´ng tá»“n táº¡i: z, Fr4   r3   r5   zformat=durationr6   r7   Tr   r;   r   r9   r:   uA   [!] KhÃ´ng thá»ƒ xÃ¡c Ä‘á»‹nh thá»�i lÆ°á»£ng file thuyáº¿t minh.rŽ   z.temp_fit.mp4z([0:v]tpad=stop_mode=clone:stop=-1[v_pad]zÿ;[1:a]aresample=48000,aformat=sample_rates=48000:channel_layouts=stereo,volume=1.0[narr];[0:a]aresample=48000,aformat=sample_rates=48000:channel_layouts=stereo,volume=0.3[bg_audio];[narr][bg_audio]amix=inputs=2:duration=longest:dropout_transition=2[a_mix]r¬   rC   z-trŒ   r­   r®   z[v_pad]z[a_mix]r°   r±   r²   r³   r´   r8  r¶   r·   r¸   r¹   rº   r»   zv[0:v]tpad=stop_mode=clone:stop=-1[v_pad];[1:a]aresample=48000,aformat=sample_rates=48000:channel_layouts=stereo[a_pad]z[a_pad]râ   ©rå   rø   )r   r   r   rr   r   r   r   r   rR   r7   rP   rQ   r?   r   r¿   rÀ   rÁ   r   r	  r"  )r)   r,   rV  r�   rW  rY   Úres_aÚnarr_durÚ
target_durÚtemp_outÚv_filterr  rk   r   Ú	filter_fbr  Úres_fbÚnorm_oks                     r    Úfit_footage_to_narrationz.AudioContinuityEngine.fit_footage_to_narrationJ  s  € õ Œw�~Š~˜jÑ)Ô)ð 	µ´·²Ð@TÑ1UÔ1Uð 	ÝÐmÈÐmÐmÐWkÐmÐmÑnÔnÐnØ�5ð ŒL˜$ ØÐ.Ø�6Ð/ð
ˆ	õ
 ”˜y¸ÀDÐIÑIÔIˆØˆØÔ˜qÒ Ð ðÝ ¥¤¨E¬LÑ!9Ô!9×!=Ò!=¸hÈÑ!KÔ!K×!OÒ!OÐPZÐ\_Ñ!`Ô!`ÑaÔa��øÝð ð ð Ø�ðøøøð �sŠ?ˆ?ÝÐUÑVÔVÐVØ�5à 
Ñ*ˆ
Ý
Œ•B”G—O’O¥B¤G§O¢O°KÑ$@Ô$@ÑAÔAÈDÐQÑQÔQÐQØ Ñ0ˆð >ˆàð Zð Zð Zð 	ð ŒK˜Ø�*ØÐ&Ø�ZÐ%Ð%Ø˜zØ�IØ�IØ�I˜v t¨Y¸Ø�E˜6 6¨5°'Øð
ˆõ Œn˜S°¸DÐAÑAÔAˆØŒ>˜QÒÐ¥b¤g§n¢n°XÑ&>Ô&>Ðð RˆIà”˜TØ�jØÐ*Ø˜Ð)Ð)Ø! 9Ø˜	Ø˜	Ø˜	 6¨4°¸FØ˜˜v v¨u°gØðˆLõ  ”^ LÀÈDÐQÑQÔQˆFØÔ  AÒ%Ð%­R¬W¯^ª^¸HÑ-EÔ-EÐ%Ø�uð ×)Ò)¨(°KÈUÐ]aÐ)ÑbÔbˆÝŒ7�>Š>˜(Ñ#Ô#ð 	ðÝ”	˜(Ñ#Ô#Ð#Ð#øÝð ð ð Ø�ðøøøàˆs%   Â
AC Ã
C&Ã%C&É(I= É=
J
Ê	J
r7  Úshot_entriesÚ	xfade_durc                 ó,  ‡ — |sdS d„ |D ¦   «         }|st          d¦  «         dS |D ]‚}|                     dd¦  «        }‰                      |¦  «        \  }}	|dk    rL|	dk    rF||	z  dk     r=t          dt          j                             |¦  «        › d	|› d
|	› d||	z  d›d�	¦  «        ‚Œƒt          |¦  «        dk    r'|d         d         }
‰                      |
|dd¬¦  «        S t	          j	        t          j         
                    t          j                             |¦  «        ¦  «        d¬¦  «         |dz   }t          |¦  «        }g }|D ]}|                     d|d         g¦  «         Œ ˆ fd„|D ¦   «         }g }t          |¦  «        D ]€\  }}|                     d|› d|› d�¦  «         |d         r|                     d|› d|› d�¦  «         ŒF|                     dd¦  «        }|dk    rd}|                     d|› d|› d�¦  «         Œ�g }dg}t          d|¦  «        D ]R}||                              dd ¦  «        }|d!k    r|                     |¦  «         Œ:|                     |¦  «         |g}ŒS|r|                     |¦  «         g }g }g }t          |¦  «        D �]Ð\  }}t          |¦  «        dk    rw|d         }|                     d"|› d�¦  «         |                     d#|› d�¦  «         |                     t!          ||                              dd¦  «        ¦  «        ¦  «         Œ�d"|d         › d�}d#|d         › d�}t!          ||d                                       dd¦  «        ¦  «        }t          |dd$…         d¦  «        D ]¡\  }} t!          ||                               dd¦  «        ¦  «        }!t#          d%||z
  ¦  «        }"d&|› d'|› d(�}#d)|› d'|› d(�}$|                     |› d"| › d*|d+›d,|"d+›|#› �¦  «         |                     |› d#| › d-|d+›d.|$› �¦  «         |#}|$}|"|!z   }Œ¢|                     |¦  «         |                     |¦  «         |                     |¦  «         �ŒÒt          |¦  «        }%|%dk    r|d         }&|d         }'nÚd                     |¦  «        }(|                     |(› d/|%› d0�¦  «         d1}&d2})g }*t          |%¦  «        D ]b}+||+         },t#          d%|,|)z
  ¦  «        }-d3|+› d4�}.|                     ||+         › d5|)› d6|-d›d7|)› d8|.› �	¦  «         |*                     |.¦  «         Œcd                     |*¦  «        }/|                     |/› d/|%› d9�¦  «         d:}'d;                     |¦  «        }0‰ j        d<g|¢d=‘|0‘d>‘|&‘d>‘|'‘d?‘d@‘dA‘dB‘dC‘dD‘dE‘dF‘dG‘dH‘dI‘dJ‘|‘}1t)          j        |1dd¬K¦  «        }2|2j        dk    st          j                             |¦  «        s$dL„ |D ¦   «         }3‰                      |3|dM¬N¦  «        S |r`‰                      ||dd¬¦  «        }4t          j                             |¦  «        r&	 t	          j        |¦  «         n# t4          $ r Y nw xY w|4S t7          j        ||¦  «         dS )Ou«  
        GhÃ©p ná»‘i phÃ¢n cáº£nh thÃ´ng minh theo chuáº©n FlowKit:
        - Giá»¯a cÃ¡c shot cÃ¹ng nhÃ¢n váº­t/ná»‘i tiáº¿p (CONTINUOUS_TAKE): Ã�p dá»¥ng xfade 0.5s cho video
          VÃ€ acrossfade 0.5s cho audio Ä‘á»“ng bá»™ chÃ­nh xÃ¡c Ä‘áº¿n tá»«ng millisecond (0ms drift).
        - Giá»¯a cÃ¡c shot chuyá»ƒn vai/Ä‘á»•i cáº£nh (CINEMATIC_CUT): Giá»¯ nguyÃªn hard cut dá»©t khoÃ¡t
          káº¿t há»£p micro-fade 30ms triá»‡t tiÃªu tiáº¿ng click/pop.
        - Há»— trá»£ báº¥t ká»³ sá»‘ lÆ°á»£ng shot nÃ o (N >= 1) vá»›i tá»• há»£p ngáº«u nhiÃªn cÃ¡c loáº¡i take.
        - Chuáº©n hÃ³a toÃ n bá»™ video xuáº¥t xÆ°á»Ÿng vá»� má»‘c -14.0 LUFS EBU R128, 48kHz stereo.
        Fc                 óx   — g | ]7}t           j                             |                     d d¦  «        ¦  «        ¯5|‘Œ8S )r,   r’   )r   r   r   r?   ©r@   Úes     r    rB   z>AudioContinuityEngine.stitch_flowkit_smart.<locals>.<listcomp>¸  s:   € Ð\Ð\Ð\˜qµB´G·N²NÀ1Ç5Â5ÈÐWYÑCZÔCZÑ4[Ô4[Ð\˜Ð\Ð\Ð\r+   u8   [!] KhÃ´ng cÃ³ video há»£p lá»‡ nÃ o Ä‘á»ƒ ghÃ©p cáº£nh.r,   r’   r   r‡   rˆ   r‰   rŠ   r‹   rŒ   r�   rI   râ   TrY  rŽ   z.temp_flowkit.mp4rC   c                 óF   •— g | ]}‰                      |d          ¦  «        ‘ŒS ©r,   r™   )r@   rh  r)   s     €r    rB   z>AudioContinuityEngine.stitch_flowkit_smart.<locals>.<listcomp>Ó  s+   ø€ ÐSÐSÐSÀ�4×*Ò*¨1¨\¬?Ñ;Ô;ÐSÐSÐSr+   rp   r�   r‘   r0   zF:a]aresample=48000,aformat=sample_rates=48000:channel_layouts=stereo[ar:   r�   rž   rŸ   Ú	take_typeÚCINEMATIC_CUTÚCONTINUOUS_TAKEr”   r¤   Nr;   z[v_gÚ_r©   z[a_gz%_norm]xfade=transition=fade:duration=rœ   rü   z_norm]acrossfade=d=rª   r—   z:v=1:a=0[v_master]z
[v_master]r£   z[a_grp_r§   zafade=t=in:st=0:d=r¥   r¦   z:curve=qsinz:v=0:a=1[a_master]z
[a_master]r«   r¬   r­   r®   r°   r±   r²   r³   r´   r8  r¶   r·   r¸   r¹   rº   r»   r   c                 ó   — g | ]
}|d          ‘ŒS rj  r•   rg  s     r    rB   z>AudioContinuityEngine.stitch_flowkit_smart.<locals>.<listcomp>H  s   € ÐBÐBÐB¨q˜1˜\œ?ÐBÐBÐBr+   r    )r„   )rr   r?   rm   r½   r   r   rS   r¾   r	  r¿   rÀ   rÁ   rÂ   rt   rs   rÃ   rR   rÅ   rÄ   r   r   r   r   r   rØ   r"  r   r   r!  )5r)   rc  r�   rd  rƒ   Úvalid_entriesrh  ÚvprÇ   rÈ   Úv_inÚtemp_stitchedÚnrÉ   rv   rÊ   rx   rw   rÑ   ÚgroupsÚcurrent_groupÚttÚgroup_video_tagsÚgroup_audio_tagsÚgroup_durationsÚg_idxÚgrpÚidxÚcurr_vÚcurr_aÚcum_durÚstep_iÚnext_idxÚnext_durÚoffsetÚout_vrÖ   ÚmÚv_masterÚa_masterÚv_grp_inputsrÐ   Úfaded_a_tagsÚjÚg_durrÒ   Útag_outÚa_grp_inputsr×   rk   r   r€   ra  s5   `                                                    r    Ústitch_flowkit_smartz*AudioContinuityEngine.stitch_flowkit_smart¥  sA	  ø€ ð  ð 	Ø�5à\Ð\ LÐ\Ñ\Ô\ˆØð 	ÝÐLÑMÔMÐMØ�5ð ð 	ð 	ˆAØ—’�| RÑ(Ô(ˆBØ×0Ò0°Ñ4Ô4‰DˆAˆqØ�1Šuˆu˜˜Qš˜ A¨¡E¨D¢L LÝ ðG½r¼w×?OÒ?OÐPRÑ?SÔ?Sð Gð GÐjkð Gð GÐnoð Gð GÐyzÐ{|Ñy|ð  Fð Gð Gð Gñô ð øõ
 ˆ}ÑÔ Ò"Ð"Ø  Ô# LÔ1ˆDØ×*Ò*¨4°È%ÐZ^Ð*Ñ_Ô_Ð_å
Œ•B”G—O’O¥B¤G§O¢O°KÑ$@Ô$@ÑAÔAÈDÐQÑQÔQÐQØ#Ð&9Ñ9ˆå�ÑÔˆØˆØð 	3ð 	3ˆAØ�MŠM˜4  <¤Ð1Ñ2Ô2Ð2Ð2àSÐSÐSÐSÀ]ÐSÑSÔSˆð ˆÝ Ñ(Ô(ð 	Xð 	X‰FˆAˆsà×Òð J�Að  Jð  Jð  ABð  Jð  Jð  Jñô ð ð �;Ôð XØ×#Ò#Øj˜ÐjÐjÐabÐjÐjÐjñô ð ð ð —w’w˜z¨4Ñ0Ô0�Ø˜1’9�9Ø�DØ×#Ò#Ð$V°DÐ$VÐ$VÈQÐ$VÐ$VÐ$VÑWÔWÐWÐWð #%ˆØ$% 3ˆÝ�q˜!‘”ð 	$ð 	$ˆAØ˜qÔ!×%Ò% k°?ÑCÔCˆBØÐ&Ò&Ð&Ø×$Ò$ QÑ'Ô'Ð'Ð'à—’˜mÑ,Ô,Ð,Ø!" ��Øð 	)Ø�MŠM˜-Ñ(Ô(Ð(ð ÐØÐØˆå# FÑ+Ô+ð !	0ñ !	0‰JˆE�3Ý�3‰xŒx˜1Š}ˆ}Ø˜!”f�Ø ×'Ò'Ð(8¨SÐ(8Ð(8Ð(8Ñ9Ô9Ð9Ø ×'Ò'Ð(8¨SÐ(8Ð(8Ð(8Ñ9Ô9Ð9Ø×&Ò&¥u¨W°S¬\×-=Ò-=¸jÈ$Ñ-OÔ-OÑ'PÔ'PÑQÔQÐQÐQð -˜c !œfÐ,Ð,Ð,�Ø,˜c !œfÐ,Ð,Ð,�Ý ¨¨A¬¤× 3Ò 3°JÀÑ EÔ EÑFÔF�å(1°#°a°b°b´'¸1Ñ(=Ô(=ð 0ð 0Ñ$�F˜HÝ$ W¨XÔ%6×%:Ò%:¸:ÀtÑ%LÔ%LÑMÔM�HÝ   g°	Ñ&9Ñ:Ô:�FØ4 5Ð4Ð4¨6Ð4Ð4Ð4�EØ4 5Ð4Ð4¨6Ð4Ð4Ð4�Eð !×'Ò'Ø!Ð~Ð~ XÐ~Ð~ÐT]Ð~Ð~Ð~ÐkqÐ~Ð~Ðw|Ð~Ð~ñô ð ð !×'Ò'Ø!ÐhÐh XÐhÐhÀ)ÐhÐhÐhÐafÐhÐhñô ð ð #�FØ"�FØ$ xÑ/�G�Gà ×'Ò'¨Ñ/Ô/Ð/Ø ×'Ò'¨Ñ/Ô/Ð/Ø×&Ò& wÑ/Ô/Ð/Ñ/õ �‰KŒKˆØ�Š6ˆ6Ø'¨Ô*ˆHØ'¨Ô*ˆHˆHð Ÿ7š7Ð#3Ñ4Ô4ˆLØ×Ò <Ð OÐ O¸!Ð OÐ OÐ OÑPÔPÐPØ#ˆHð ˆIØˆLÝ˜1‘X”Xð -ð -�Ø'¨Ô*�Ý  U¨YÑ%6Ñ7Ô7�	Ø. AÐ.Ð.Ð.�Ø×#Ò#Ø'¨Ô*ð Xð X¸ið Xð XØ&/ÐWðXð XØ8AðXð XØNUðXð Xñô ð ð ×#Ò# GÑ,Ô,Ð,Ð,àŸ7š7 <Ñ0Ô0ˆLØ×Ò <Ð OÐ O¸!Ð OÐ OÐ OÑPÔPÐPØ#ˆHà ŸXšX lÑ3Ô3Ðð ŒK˜ð	
àð	
ð ð	
ð  2ð	
ð ð		
ð ð		
ð
 ð	
ð
 ð	
ð ð	
ð ð	
ð  &ð	
ð (,ð	
ð .7ð	
ð 9?ð	
ð ð	
ð ð	
ð "ð	
ð $*ð	
ð ,1ð	
ð 3:ð	
ð ð	
ˆõ Œn˜S°¸DÐAÑAÔAˆØŒ>˜QÒÐ¥b¤g§n¢n°]Ñ&CÔ&CÐàBÐB°MÐBÑBÔBˆKØ×3Ò3°KÀÐSgÐ3ÑhÔhÐhàð 	Ø×-Ò-¨m¸[ÐV[ÐfjÐ-ÑkÔkˆGÝŒw�~Š~˜mÑ,Ô,ð ðÝ”I˜mÑ,Ô,Ð,Ð,øÝ ð ð ð Ø�DðøøøàˆNåŒ�M ;Ñ/Ô/Ð/Øˆts   ÙY- Ù-
Y:Ù9Y:)r~   Tr   T)rÙ   rÚ   )râ   r›   rã   )râ   r›   rã   T)râ   r
  Nr
  )NNNNr
  r
  r  r~   râ   râ   r›   rã   T)Nr~   T)rU  )r7  T)Ú__name__Ú
__module__Ú__qualname__Ú
STEM_1_BGMÚSTEM_2_AMBIENCEÚSTEM_3_FOLEYÚSTEM_4_DIALOGUEr*   ró   r   re   r   rX   rm   r   r}   rR   r  rØ   rá   r   rõ   r	  r  r3  rT  rb  r   r�  r•   r+   r    r'   r'   G   sö  € € € € € à&€JØ5€OØ-€LØ5€Oð%ð %ð %ð?
¨Sð ?
°Tð ?
ð ?
ð ?
ð ?
ðB°3ð ¸5ÀÀcÀ¼?ð ð ð ð ð*¨4°¬9ð ð ð ð ð@  #Ø#Ø Ø$(ðHð Hà˜#”YðHð ðHð ð	Hð
 ðHð ðHð "ðHð 
ðHð Hð Hð Hð^ $'Ø ð-ð -àð-ð ð-ð ð	-ð
 !ð-ð ð-ð 
ð-ð -ð -ð -ðd #ØØð-ð -àð-ð ð-ð ð	-ð
 ð-ð 
�$Œð-ð -ð -ð -ðf #ØØØðWð WàðWð ðWð ð	Wð
 ðWð ðWð ðWð 
ðWð Wð Wð Wð| ØØ'+Ø"ðSð SàðSð ðSð ð	Sð
 ðSð ðSð   ”}ðSð ðSð 
ðSð Sð Sð Sðr $(Ø(,Ø%)Ø(,ØØ"ØØ!ØØ"ØØØð!n(ð n(àðn(ð ðn(ð ˜C”=ð	n(ð
 ! œðn(ð ˜c”]ðn(ð ! œðn(ð ðn(ð ðn(ð ðn(ð ðn(ð ðn(ð ðn(ð ðn(ð ðn(ð  ð!n(ð" 
ð#n(ð n(ð n(ð n(ðf &*ØØ"ð>ð >àð>ð ˜c”]ð>ð ð	>ð
 ð>ð 
ð>ð >ð >ð >ðJ  ðYð YàðYð "ðYð ð	Yð
 ðYð 
ðYð Yð Yð Yð~ Ø#ðpð pà˜4  S œ>Ô*ðpð ðpð ð	pð
 ðpð 
ðpð pð pð pð pð pr+   r'   Ú__main__zBKieuStory Audio Continuity & Soundscape Engine (4-Stem & EBU R128))Údescriptionz	--inspectú+u0   Danh sÃ¡ch video shot cáº§n kiá»ƒm tra Ã¢m thanh)ÚnargsÚhelpz--stitchu6   GhÃ©p ná»‘i danh sÃ¡ch video vá»›i crossfade Ã¢m thanhz--outputz*04_Assets/videos/master_audio_seamless.mp4u   Ä�Æ°á»�ng dáº«n xuáº¥t)Údefaultr›  z--crossfader~   u'   Thá»�i gian crossfade Ã¢m thanh (giÃ¢y))Útyperœ  r›  z--moder   )r   r    r¡   u%   Cháº¿ Ä‘á»™ chuyá»ƒn tiáº¿p Ã¢m thanh)r�  rœ  Úchoicesr›  z--l-cutrN   u6   Táº¡o L-Cut giá»¯a 2 video (Shot Kiá»�u vÃ  Shot VÃ¢n)z--normalizeuB   Chuáº©n hÃ³a Ã¢m lÆ°á»£ng EBU R128 (-14 LUFS) Two-Pass cho 1 video)r�  r›  z	--measureu7   Ä�o kiá»ƒm Ã¢m lÆ°á»£ng Pass 1 JSON qua FFmpeg loudnormz--mix-stemsÚ
store_trueu    KÃ­ch hoáº¡t bá»™ trá»™n 4 Stems)Úactionr›  z--videou   Video nguá»“n cho mix-stemsz--bgmzStem 1: BGM audio pathz
--ambiencezStem 2: Ambience audio pathz--foleyzStem 3: Foley audio pathz
--dialoguezStem 4: Dialogue audio path)r‚   r„   rI   râ   TrY  )Úindent)r  r  r  r  )z,04_Assets\videos\ep01_scene01_shot01_10s.mp4z,04_Assets\videos\ep01_scene01_shot02_10s.mp4z,04_Assets\videos\ep01_scene01_shot03_10s.mp4z,04_Assets\videos\ep01_scene01_shot04_10s.mp4z,04_Assets\videos\ep01_scene01_shot05_10s.mp4)=Ú__doc__r   Úsysrñ   r7   Úargparser   Útempfiler   Úpathlibr   Útypingr   r   r   r   r   r	   ÚplatformrQ   ÚreconfigurerT   r   r   r$   ró   r!   r%   r'   r�  ÚArgumentParserÚparserÚadd_argumentrR   Ú
parse_argsÚargsÚengineÚinspectr}   ÚstitchrØ   ÚoutputÚ	crossfader„   Úl_cutrá   Ú	normalizer	  Úmeasurerõ   r†  rr   ÚdumpsÚ	mix_stemsÚvideor3  ÚbgmÚambienceÚfoleyÚdialogueÚscene1_shotsr•   r+   r    ú<module>r¿     s&  ððð ð" 
€	€	€	Ø 
€
€
€
Ø 	€	€	€	Ø €€€Ø €€€Ø Ð Ð Ð Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :ð „<�7ÒÐðØŒ
×Ò¨ÐÑ0Ô0Ð0ØŒ
×Ò¨ÐÑ0Ô0Ð0Ð0øØð ð ð Øˆðøøøðð ð Ð ð XØðÐ ð
	Q�Cð 	Qð 	Qð 	Qð 	Qð	R�Sð 	Rð 	Rð 	Rð 	RðNð Nð Nð Nð Nñ Nô Nð Nðb  ˆzÒÑØ$ˆXÔ$Ð1uÐvÑvÔv€FØ
×Ò˜¨3Ð5gÐÑhÔhÐhØ
×Ò˜
¨#Ð4lÐÑmÔmÐmØ
×Ò˜
Ð,XÐ_wÐÑxÔxÐxØ
×Ò˜¨E¸3ÐEnÐÑoÔoÐoØ
×Ò˜ s°Lð  KBð  KBð  KBð  IpÐñ  qô  qð  qØ
×Ò˜	¨Ð1iÐÑjÔjÐjØ
×Ò˜¨CÐ6zÐÑ{Ô{Ð{Ø
×Ò˜¨#Ð4mÐÑnÔnÐnØ
×Ò˜¨lÐAcÐÑdÔdÐdØ
×Ò˜	¨Ð2OÐÑPÔPÐPØ
×Ò˜ cÐ0HÐÑIÔIÐIØ
×Ò˜¨3Ð5RÐÑSÔSÐSØ
×Ò˜	¨Ð2LÐÑMÔMÐMØ
×Ò˜¨3Ð5RÐÑSÔSÐSà×ÒÑÔ€DØ"Ð"Ñ$Ô$€Fà„|ð .Ø×Ò ¤Ñ-Ô-Ð-Ð-Ð-Ø	Œð .Ø×*Ò*¨4¬;¸¼ÐSWÔSaÐhlÔhqÐ*ÑrÔrÐrÐrÐrØ	Œð .Ø×"Ò" 4¤:¨a¤=°$´*¸Q´-ÀÄÑMÔMÐMÐMÐMØ	Œð .Ø×!Ò! $¤.°$´+È5Ð[_Ð!Ñ`Ô`Ð`Ð`Ð`Ø	Œð .Ø×#Ò# D¤LÑ1Ô1ˆØˆˆjˆdŒj˜ 1Ð%Ñ%Ô%Ñ&Ô&Ð&Ð&Ð&Ø	Œð .˜DœJð .Ø×ÒØŒJ˜œØ”hØœ=Øœ
Øœ=ð 	ñ 	
ô 	
ð 	
ð 	
ð 	
ð
ð 
ð 
ˆð 	×Ò Ñ-Ô-Ð-Ð-Ð-ða Ðs   Á6A< Á<BÂB