"""
Studio Historical-2d - Episode 01: Cannae 216 BC
Full 30-Minute Documentary Voiceover & Localization Engine (2026 Edition)
Author: Arthur Pendelton (Head of Audio & Multilingual Localization)

Features:
- Complete 20-scene script synthesis in Vietnamese (Host Seven Nguyen / vi-VN-NamMinhNeural)
  and English (BBC/History Channel Documentary Baritone / en-US-ChristopherNeural).
- Micro-breath and tactical pause padding (0.2 - 0.4s).
- Acoustic Broadcast EQ & EBU R128 loudness normalization (-14.0 LUFS ± 0.5, True Peak <= -1.0 dBFS).
- Kinetic ASS & SRT subtitles with Chiaroscuro drop shadows & Royal Gold highlight (#D4AF37).
- Master Multi-Track packaging according to YouTube 2026 multi-language audio standards.
"""

import os
import sys
import json
import asyncio
import subprocess
import edge_tts
import numpy as np

BASE_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))
AUDIO_VOICE_DIR = os.path.join(BASE_DIR, "episodes", "EP01_Cannae_216BC", "04_Audio_Voice")
VOICE_VI_DIR = os.path.join(AUDIO_VOICE_DIR, "voice_vi")
VOICE_EN_DIR = os.path.join(AUDIO_VOICE_DIR, "voice_en")
SUBS_DIR = os.path.join(AUDIO_VOICE_DIR, "subtitles")
MASTER_DIR = os.path.join(AUDIO_VOICE_DIR, "master_mix")
SFX_DIR = os.path.join(AUDIO_VOICE_DIR, "binaural_sfx")
BRIDGE_DIR = os.path.join(AUDIO_VOICE_DIR, "bridge")

for d in [VOICE_VI_DIR, VOICE_EN_DIR, SUBS_DIR, MASTER_DIR]:
    os.makedirs(d, exist_ok=True)

SAMPLE_RATE = 44100

# 20 SCENES FROM VICTOR VANCE'S MASTER SCRIPT
SCENES = [
    {
        "id": "scene_00_intro_hook",
        "title": "Intro: The Historical Vault",
        "start_sec": 0.0,
        "end_sec": 30.9,
        "speaker": "Seven Nguyen",
        "vi": "Chào mừng quý vị đã quay trở lại với Căn Hầm Lịch Sử của Studio Historical-2d. Tôi là Seven Nguyen. Hãy đăng ký kênh và cùng chúng tôi mở khóa lịch sử.",
        "en": "Welcome back to The Historical Vault of Studio Historical-2d. I am Seven Nguyen. Subscribe, and let us unlock history together."
    },
    {
        "id": "scene_01_bridge",
        "title": "Atmospheric Bridge: Apulia 216 BC",
        "start_sec": 31.0,
        "end_sec": 36.0,
        "speaker": "Seven Nguyen",
        "vi": "Và hành trình của chúng ta bắt đầu tại chảo lửa Apulia, miền Nam nước Ý... Mùa hè năm 216 Trước Công Nguyên.",
        "en": "And our journey begins in the crucible of Apulia, southern Italy... The summer of 216 BC."
    },
    {
        "id": "scene_02_cue1_cold_open",
        "title": "Cue 1: War Room Opening Hook & Paradox",
        "start_sec": 36.0,
        "end_sec": 85.0,
        "speaker": "Seven Nguyen",
        "vi": "Hãy nhìn vào những khối cờ lệnh này trên sa bàn. Ngày hôm nay, chúng ta cùng giải mã một trong những nghịch lý quân sự vĩ đại và đẫm máu nhất trong lịch sử nhân loại: Làm thế nào mà một đạo quân La Mã đông kỷ lục — hơn tám vạn sáu ngàn binh sĩ dày dạn, được trang bị vũ khí tối tân nhất của thời cổ đại — lại có thể tự bước chân vào một cái bẫy không lối thoát, để rồi bị xóa sổ hoàn toàn chỉ trong một buổi chiều bởi một lực lượng đối phương có quân số chưa bằng một nửa? Thảm họa này không bắt nguồn từ sự hèn nhát của những người lính cầm khiên. Nó bắt nguồn từ chính sự kiêu ngạo của một cỗ máy cơ học khổng lồ, và sự tính toán lạnh lùng đến từng milimet đất của một thiên tài quân sự: Hannibal Barca. Hãy cùng tôi lật lại từng trang bản đồ tác chiến của ngày định mệnh ấy.",
        "en": "Look upon these command markers on the sandtable. Today, we decode one of the greatest and bloodiest military paradoxes in human history: How could a record Roman army — over eighty-six thousand seasoned legionaries, equipped with the finest weapons of the ancient world — march straight into an inescapable trap, only to be completely annihilated in a single afternoon by an enemy force less than half their size? This catastrophe did not stem from cowardice among the men holding the scutum shields. It arose from the mechanical hubris of a colossal war machine, and the glacial, millimeter precision of a military prodigy: Hannibal Barca. Join me as we unfold the battle maps of that fateful day."
    },
    {
        "id": "scene_03_trebia_trasimene_fabius",
        "title": "Blood Debt: Trebia, Trasimene & Fabius",
        "start_sec": 85.0,
        "end_sec": 165.0,
        "speaker": "Victor Vance (Narrator)",
        "vi": "Hai năm trước ngày định mệnh tại Cannae, ngọn giáo của Hannibal Barca đã đâm thẳng vào cuống họng của La Mã. Bằng cuộc vượt dãy Alps vô tiền khoáng hậu, Hannibal không chỉ đem chiến tranh vào tận sân nhà của kẻ thù, mà còn liên tiếp giáng hai đòn trừng phạt tàn khốc: tại dòng nước băng giá của sông Trebia, và trong màn sương mù chết chóc bên bờ hồ Trasimene. Hơn năm vạn lính La Mã đã bỏ mạng. Nền Cộng hòa rơi vào tình trạng hoảng loạn tột độ. Trong cơn tuyệt vọng, Viện Nguyên Lão trao quyền độc tài tối cao cho một nhà quý tộc bảo thủ: Quintus Fabius Maximus. Chiến lược của Fabius — sau này đi vào lịch sử với tên gọi Chiến lược Fabian — là một bài học mẫu mực về sự kiên nhẫn khắc kỷ: từ chối mọi trận quyết chiến trên địa hình bằng phẳng, rút quân lên các triền đồi cao nơi kỵ binh Numidia của Hannibal vô dụng, và kiên trì bóp nghẹt đường tiếp tế lương thảo của đối phương. Nhưng đối với tâm thức kiêu hãnh của giới quý tộc và quần chúng La Mã, chiến lược này không khác gì một sự hèn nhát nhục nhã. Nước Ý không thể đứng nhìn mùa màng của mình bị thiêu rụi bởi một đạo quân viễn chinh Bắc Phi.",
        "en": "Two years before the fateful day at Cannae, Hannibal Barca's spear had struck straight at the jugular of Rome. With his unprecedented crossing of the Alps, Hannibal brought war directly to his enemy's doorstep, delivering two devastating blows: along the frozen banks of the Trebia, and through the lethal mists of Lake Trasimene. Over fifty thousand Roman soldiers perished. The Republic descended into absolute panic. In desperation, the Senate granted dictatorial powers to an austere aristocrat: Quintus Fabius Maximus. The Fabian Strategy was a masterclass in stoic patience: avoiding pitched battles on open plains where Hannibal's Numidian cavalry dominated, taking to the highlands, and slowly severing Carthaginian supply lines. Yet to Rome's proud patricians and citizens, this caution felt like shameful cowardice. Italy could not sit idle while its fields were burned to ash by a North African expeditionary force."
    },
    {
        "id": "scene_04_divided_command",
        "title": "Divided Command: Varro vs Paullus",
        "start_sec": 165.0,
        "end_sec": 270.0,
        "speaker": "Victor Vance (Narrator)",
        "vi": "Mùa bầu cử năm 216 Trước Công Nguyên đã đưa hai nhân vật với hai tư duy chiến tranh hoàn toàn đối lập lên đỉnh cao quyền lực: Gaius Terentius Varro — một chính khách mị dân đầy tham vọng, người hùng hồn tuyên bố có thể kết liễu Hannibal chỉ trong một ngày; và Lucius Aemilius Paullus — một quý tộc thận trọng, người nhìn thấu sự nguy hiểm chết người của đạo quân lính đánh thuê thiện chiến xứ Carthage. Nhưng nền Cộng hòa mắc phải một sai lầm chết người trong cấu trúc quân sự: cơ chế chỉ huy luân phiên theo ngày. Cứ mỗi hai mươi bốn giờ trôi qua, quyền tối thượng điều động toàn quân lại đổi chủ. Một ngày được dẫn dắt bởi sự thận trọng kiềm chế, ngày tiếp theo lại bị chi phối bởi cơn bốc đồng khát máu. Hannibal Barca, thông qua mạng lưới do thám tình báo hoàn hảo, nắm rõ từng hơi thở tâm lý của hai đối thủ. Ông biết chính xác ngày nào Varro nắm cờ lệnh. Và khi Hannibal bất ngờ hành quân đánh chiếm kho lương Cannae — nguồn sống của toàn bộ vùng Apulia — ông đã đặt quân đội La Mã vào thế buộc phải giao tranh trên một mảnh đất do chính ông lựa chọn.",
        "en": "The consular election of 216 BC thrust two men of radically opposing doctrines into joint supreme command: Gaius Terentius Varro, an ambitious populist who boasted he would crush Hannibal in a single day; and Lucius Aemilius Paullus, a seasoned patrician veteran who understood the deadly peril of Carthage's battle-hardened mercenaries. But the Republic harbored a fatal flaw in its military architecture: alternating daily command. Every twenty-four hours, the supreme imperium shifted hands. One day governed by restraint, the next driven by rash aggression. Through an immaculate intelligence network, Hannibal anticipated every psychological tremor of his adversaries. He knew precisely which day Varro held the command baton. And when Hannibal seized the massive granary depot of Cannae — the lifeline of Apulia — he forced the Roman legions into battle on ground of his own choosing."
    },
    {
        "id": "scene_05_massed_ram",
        "title": "The War Machine: Super-Massed Ram",
        "start_sec": 270.0,
        "end_sec": 360.0,
        "speaker": "Victor Vance (Narrator)",
        "vi": "Để đè bẹp Hannibal một lần và mãi mãi, La Mã không chỉ tăng viện — họ đã tạo ra một con quái vật quân sự chưa từng có. Tám quân đoàn La Mã cùng tám quân đoàn đồng minh được sáp nhập thành một khối thống nhất. Nhưng hãy quan sát cách Varro bố trí đội hình. Hệ thống maniple truyền thống — vốn nổi tiếng nhờ tính linh hoạt cơ động như những khớp ngón tay — đã bị tước đoạt hoàn toàn bản chất. Varro ra lệnh thu hẹp khoảng cách giữa các khối đơn vị, xếp các hàng quân sâu bất thường, biến đội hình La Mã thành một cây búa tạ cơ học đặc quánh. Học thuyết của Varro rất đơn giản, thô bạo và thuần túy cơ học: sử dụng áp lực động năng của bảy vạn khối cơ bắp và khiên thép để tông thẳng vào trung tâm quân thù, xé toạc phòng tuyến Carthage làm đôi như một cỗ xe ủi đất không gì cản nổi. Đối với người La Mã, chiến thuật lúc này không còn cần thiết. Trọng lượng đơn thuần sẽ giải quyết mọi thứ.",
        "en": "To annihilate Hannibal once and for all, Rome did not merely mobilize reinforcements; they assembled an unprecedented military leviathan. Eight Roman legions and eight allied legions were forged into a single massive host. Yet observe Varro's tactical deployment. The classic maniple system — legendary for its fluid, articulated flexibility — was stripped of its essence. Varro closed the intervals between maniples and doubled their formation depth, compressing the legions into a monolithic battering ram. His doctrine was brutal, simple, and purely mechanical: unleash the kinetic momentum of seventy thousand heavily armored legionaries to smash through the Carthaginian center, splitting their battle line like a relentless battering ram. To Rome, refined maneuvers were no longer needed. Raw mass and sheer weight would decide the day."
    },
    {
        "id": "scene_06_aufidus_bottleneck",
        "title": "Micro-Terrain: Aufidus River Bottleneck",
        "start_sec": 360.0,
        "end_sec": 510.0,
        "speaker": "Victor Vance (Narrator)",
        "vi": "Sáng sớm ngày 2 tháng 8 năm 216 Trước Công Nguyên, lá cờ đỏ xuất trận phất phới trên lều của Varro. Đến lượt Varro nắm quyền chỉ huy, và ông không ngần ngại xua toàn quân vượt sông Aufidus sang bờ nam, dàn trận trên dải đồng bằng hẹp. Hãy nhìn vào địa hình sa bàn. Ở cánh phải của quân La Mã là dòng sông Aufidus với bờ dốc dựng đứng, đóng vai trò như một bức tường tự nhiên ngăn chặn mọi nỗ lực tạt sườn. Ở phía xa bên trái là các triền đồi của pháo đài Cannae. Đối với Varro, đây là một vị trí hoàn hảo: dòng sông bảo vệ sườn của ông, loại bỏ mối đe dọa từ kỵ binh sườn của Hannibal, biến chiến trường thành một hành lang thẳng đứng nơi sức mạnh bộ binh La Mã sẽ phát huy tối đa uy lực. Nhưng người La Mã đã không nhận ra rằng: khi bạn khóa chặt một bên sườn của mình vào chướng ngại vật tự nhiên trong một không gian hẹp, bạn cũng đồng thời tự tước đi con đường rút lui duy nhất nếu thế trận sụp đổ.",
        "en": "At dawn on August 2nd, 216 BC, the red battle flag flew above Varro's command tent. It was his turn to lead, and he wasted no time crossing the Aufidus River to form ranks upon the southern plain. Observe the terrain on the tactical sandtable. On the Roman right flank ran the Aufidus, its steep erosion banks acting as an impassable natural barrier against flanking maneuvers. To the far left rose the high ground of Cannae citadel. To Varro, this narrow corridor seemed ideal: the river protected his flank, neutralizing Hannibal's cavalry and channeling the combat into a direct forward shove. What the Romans failed to realize was that anchoring a flank against an impassable barrier in confined terrain also severed their only line of retreat should the formation fracture."
    },
    {
        "id": "scene_07_volturnus_dust",
        "title": "Weaponized Nature: The Volturnus Storm",
        "start_sec": 510.0,
        "end_sec": 630.0,
        "speaker": "Victor Vance (Narrator)",
        "vi": "Hannibal Barca không chỉ điều khiển con người; ông điều khiển cả các yếu tố tự nhiên. Vào mùa hè vùng Apulia, một hiện tượng thời tiết đặc thù luôn xuất hiện: ngọn gió Volturnus. Đây là luồng gió xoáy khô nóng, cuốn theo hàng tấn bụi mịn từ vùng đồng bằng sỏi đá cằn cỗi. Hannibal cố tình dàn trận cho quân đội của mình quay lưng về hướng Tây Bắc. Kết quả là: quân La Mã, khi dàn quân đối diện, buộc phải ngẩng mặt nhìn thẳng vào ánh mặt trời rực lửa buổi sớm và hứng trọn cơn bão cát Volturnus tạt thẳng vào mắt. Tầm nhìn của các chỉ huy La Mã bị giới hạn nghiêm trọng; mắt họ cay xè, cổ họng nghẹn đặc bụi cát. Trước khi nhát kiếm đầu tiên được vung lên, người La Mã đã bước vào trận đánh trong tình trạng giác quan bị mù lòa cục bộ. Màn sương chiến tranh đã được Hannibal hiện thực hóa bằng chính cát bụi của đất Ý.",
        "en": "Hannibal Barca did not merely command armies; he weaponized the natural elements. During the dry Apulian summer, a unique meteorological phenomenon prevails: the Volturnus wind. This scorching gale lifts tons of fine, abrasive dust from the parched plains. Hannibal meticulously aligned his battle line with its back to the northwest. Consequently, the advancing Romans were forced to stare directly into the blinding Mediterranean morning sun while absorbing the howling grit of the Volturnus storm straight into their eyes and lungs. Roman visual clarity was crippled; throats burned, eyes wept. Before a single blade was drawn, Roman sensory awareness was blinded. Hannibal transformed the fog of war into a physical reality using the very dust of Italian soil."
    },
    {
        "id": "scene_08_convex_crescent",
        "title": "Anomalous Formation: The Convex Crescent",
        "start_sec": 630.0,
        "end_sec": 765.0,
        "speaker": "Victor Vance (Narrator)",
        "vi": "Đối mặt với bức tường thép khổng lồ của La Mã, cách bố trí quân của Hannibal đi ngược lại mọi nguyên lý quân sự kinh điển. Thay vì xếp một phòng tuyến phẳng và dày đặc để chống đỡ, Hannibal kéo giãn trung tâm thành một cánh cung lồi nhô về phía trước. Tại đây, ông đặt những binh sĩ kém tin cậy nhất trong đội quân đa sắc tộc của mình: lính Tây Ban Nha và người Celt xứ Gaul, đứng xen kẽ nhau. Người Iberia mặc áo lanh trắng viền tím với thanh đoản kiếm cong falcata; người Celt để trần nửa thân trên, vung những thanh trường kiếm nặng nề. Nhưng hãy quan sát hai bên cánh. Ẩn mình lùi sâu phía sau, hoàn toàn không dính líu vào cánh cung nhô ra, là mười ngàn cựu binh Libya thiện chiến nhất của Hannibal — những chiến binh kỳ cựu đang khoác trên mình chính những bộ giáp sắt thu giữ từ xác lính La Mã ở Trasimene. Họ đứng im lìm như hai bức tường thép dự bị. Và ở vị trí nguy hiểm nhất — chóp nhọn của cánh cung lồi, nơi sẽ hứng trọn cú va chạm kinh hoàng đầu tiên — chính Hannibal và em trai Mago đứng đó. Ông không chỉ huy từ phía sau. Ông đặt sinh mạng của mình vào đúng vị trí then chốt nhất của toàn bộ cái bẫy.",
        "en": "Confronting Rome's towering wall of iron, Hannibal's disposition violated every traditional military doctrine. Instead of a thick, flat defensive line, Hannibal bowed his center outward into a forward convex crescent. Here he stationed his most volatile troops: Iberian and Celtic warriors deployed in alternating maniples. The Spanish wore white tunics bordered in purple with curved falcata blades; the Celts fought stripped to the waist, wielding massive slashing claymores. But observe the flanks. Held back in deep reserve, completely detached from the protruding arc, stood ten thousand elite Libyan veterans — grim professionals clad in captured Roman chainmail from Trasimene. They stood motionless like twin iron pillars. And at the apex of the crescent, destined to absorb the first violent shockwave, stood Hannibal and his brother Mago. He did not command from safety. He placed his own life at the exact focal point of the trap."
    },
    {
        "id": "scene_09_cue2_crescent_flex",
        "title": "Cue 2: The Flexing Crescent",
        "start_sec": 765.0,
        "end_sec": 825.0,
        "speaker": "Seven Nguyen",
        "vi": "Dừng lại tại giây phút này. Đây chính là điểm bẻ gãy của toàn bộ trận đánh. Hãy quan sát cánh cung lồi của Hannibal trên sa bàn. Bảy vạn lính La Mã đang lao vào như một cơn lũ thép, và phòng tuyến Carthage đang lùi lại. Bất kỳ vị tướng thông thường nào cũng sẽ coi đây là dấu hiệu của sự vỡ trận. Nhưng với Hannibal, mỗi bước lùi là một mắt xích đã được lập trình chính xác đến từng tấc đất. Cánh cung lồi đang chuẩn bị uốn cong thành cánh cung lõm. Người La Mã tưởng rằng sức nặng của họ đang đè bẹp đối phương; nhưng trên thực tế, họ đang tự hút mình vào miệng của một chiếc phễu khổng lồ. Và hãy để ý hai bên cánh: hai khối cựu binh Libya vẫn chưa hề nhúc nhích. Cái bẫy đã bắt đầu mở miệng.",
        "en": "Freeze the action at this precise moment. Here lies the geometric tipping point of the entire engagement. Observe Hannibal's convex crescent on the sandtable. Seventy thousand Romans surge forward like an avalanche of iron, and the Carthaginian line yields ground. Any conventional commander would mistake this for a rout. But to Hannibal, every foot of withdrawal was an engineered component of a master calculation. The convex arc is flexing into a concave funnel. The Romans believe their sheer momentum is overwhelming the foe; in truth, they are suctioning themselves into the jaws of a colossal vise. And note the flanks: the Libyan veterans have not moved an inch. The trap has begun to close."
    },
    {
        "id": "scene_10_phase1_cavalry_clash",
        "title": "Phase 1: Cavalry Decapitation along the River",
        "start_sec": 825.0,
        "end_sec": 945.0,
        "speaker": "Victor Vance (Narrator)",
        "vi": "Trận đánh mở màn không phải bằng bước chân của bộ binh, mà bằng một vụ thảm sát cơ học bên bờ sông Aufidus. Tại cánh phải hẹp của La Mã, hai ngàn bốn trăm kỵ sĩ quý tộc do chính Chấp chính quan Paullus dẫn đầu phải đối mặt với sáu ngàn năm trăm kỵ binh nặng dạn dày của Hasdrubal. Không có không gian cho việc xoay trở chiến thuật hay cơ động vòng tránh. Cuộc giao tranh biến thành một cuộc cận chiến tàn nhẫn và man rợ: lính kỵ binh hai bên nhảy khỏi lưng ngựa, túm lấy áo giáp của nhau, vật ngã đối phương xuống lớp sỏi bùn ven sông và đâm xé bằng đoản kiếm. Trong vòng chưa đầy nửa giờ, cánh kỵ binh bảo vệ sườn phải của La Mã đã tan rã hoàn toàn. Những ai không bị chém chết đều bị dồn xuống lòng sông Aufidus dốc đứng và chết đuối dưới sức nặng của áo giáp. Paullus trúng một viên đá ném rách trán, ngã ngựa, nhưng vẫn cố gượng dậy tìm đường quay về với khối bộ binh trung tâm. Sườn phải của người La Mã lúc này đã hoàn toàn bị lột trần.",
        "en": "The battle erupted not with the marching footsteps of infantry, but with mechanical slaughter along the riverbank. On the cramped Roman right, two thousand four hundred noble equites led by Consul Paullus confronted Hasdrubal's six thousand five hundred heavy Spanish and Celtic cavalry. There was no space for tactical wheeling or feigned retreats. The engagement deteriorated into savage dismounted combat: horsemen pulled one another to the earth, wrestling in the mud, driving short blades through mail. Within thirty minutes, Rome's right flank cavalry was systematically annihilated. Those not cut down were hurled into the steep ravine of the Aufidus, drowning under the dead weight of their armor. Paullus, struck in the head by a slinger's bullet, unhorsed and bleeding, crawled back toward the central legions. The Roman right flank was completely exposed."
    },
    {
        "id": "scene_11_phase2_steel_impact",
        "title": "Phase 2: Steel Collision & Elastic Retreat",
        "start_sec": 945.0,
        "end_sec": 1080.0,
        "speaker": "Victor Vance (Narrator)",
        "vi": "Tại trung tâm, cú va chạm vĩ đại của bộ binh đã nổ ra. Bảy vạn lính La Mã lao thẳng vào chóp nhọn của cánh cung lồi Carthage. Sức ép cơ học là không thể tưởng tượng nổi: hàng rào khiên scutum nặng nề tông thẳng vào khiên caetra và khiên gỗ của người Gaul. Cánh cung của Hannibal bắt đầu lún xuống. Dưới sức nặng khủng khiếp của cỗ búa tạ La Mã, lính Gallic và Iberian bị đẩy giật lùi từng tấc đất. Nhưng đây không phải là một sự vỡ trận. Đây là nghệ thuật rút lui đàn hồi được tính toán chính xác tuyệt đối. Hannibal và Mago có mặt ở từng mét chiến tuyến, chém chết bất kỳ kẻ nào có dấu hiệu hoảng loạn, giữ cho hàng ngũ vừa đánh vừa lùi theo nhịp điệu. Và người La Mã đã mắc bẫy. Thấy trung tâm đối phương nhượng bộ, ảo tưởng về một thắng lợi chớp nhoáng bao trùm lấy toàn quân La Mã. Các phân đội hai bên sườn tự ý bỏ vị trí, chen chúc xô đẩy nhau lao về phía tâm điểm để gia tăng áp lực đè bẹp đối thủ. Họ không biết rằng: chính hành động tự ý thu hẹp diện tích mặt trận này đang biến họ từ một đạo quân tác chiến thành một bầy gia súc tự dồn mình vào lò mổ.",
        "en": "In the center, the monumental clash of heavy infantry erupted. Seventy thousand Romans slammed headlong into the convex crescent. The kinetic pressure was staggering: massive scutum shield walls thundered against Celtic wood and Iberian bucklers. Hannibal's crescent began to buckle. Under the crushing momentum of Rome's battering ram, the Gallic and Spanish ranks were pushed backward yard by yard. Yet this was not a collapse. It was an elastic, calculated retreat. Hannibal and Mago ranged across the front, cutting down panic, keeping the withdrawal disciplined and rhythmic. And Rome took the bait. Sensing victory, Roman maniples on the wings broke formation, crowding toward the center to join the breakthrough. In compressing their own frontage, they transformed an army into a dense, disorganized mass driving itself into a slaughterhouse."
    },
    {
        "id": "scene_12_phase3_geometric_inversion",
        "title": "Phase 3: Geometric Inversion — Convex to Concave",
        "start_sec": 1080.0,
        "end_sec": 1200.0,
        "speaker": "Victor Vance (Narrator)",
        "vi": "Hãy quan sát sự chuyển dịch hình học kỳ diệu trên sa bàn. Bằng cách lùi dần từng bước, trung tâm của Hannibal đã biến một cánh cung lồi nhô ra thành một cánh cung lõm sâu hình bán nguyệt. Đạo quân La Mã khổng lồ, say máu truy kích, đã tự kéo dài đội hình và lọt thỏm hoàn toàn vào giữa lòng chảo tử thần. Giờ đây, thế trận đã hoàn toàn đảo ngược. Trung tâm quân Carthage đã ngừng lùi lại — họ dựa lưng vào nhau, trụ vững trên tuyến phòng ngự mới kiên cố. Trong khi đó, người La Mã nhận ra mình bị vây bọc trong một chiếc túi lõm: phía trước mặt họ là bức tường khiên gai góc của người Iberia và Gallic; còn ở hai bên sườn, hai cột trụ cựu binh Libya vẫn đứng sừng sững, nguyên vẹn, tươi tỉnh và hoàn toàn chưa sứt mẻ một sợi tóc.",
        "en": "Observe the geometric inversion upon the map. By yielding ground step by deliberate step, Hannibal's center transformed from a protruding convex crescent into a deep, concave pocket. The Roman legionary mass, intoxicated by perceived triumph, surged forward, funneling itself directly into the hollow of the crescent. The geometry had inverted. The Carthaginian center abruptly halted its retreat, locking shields along a dense new perimeter. The Romans now found themselves trapped within a three-sided pocket: ahead stood the unyielding Gallic and Spanish line; to their left and right stood the Libyan veteran phalanxes, fresh, unbloodied, and poised to strike."
    },
    {
        "id": "scene_13_phase4_libyan_wheel",
        "title": "Phase 4: Libyan Flank Wheel & Hasdrubal's Circuit",
        "start_sec": 1200.0,
        "end_sec": 1290.0,
        "speaker": "Victor Vance (Narrator)",
        "vi": "Thời khắc định mệnh đã điểm. Hannibal phất cờ lệnh. Hai cánh quân cựu binh Libya — những cỗ máy chiến tranh thiện chiến nhất Bắc Phi — đồng loạt quay người 90 độ. Với những ngọn giáo dài và thanh kiếm sắc bén, họ nghiến thẳng vào hai bên sườn hở của khối bộ binh La Mã. Đột nhiên, người La Mã thấy mình bị tấn công dữ dội từ cả hai bên tả hữu. Nhưng tai họa tồi tệ nhất vẫn đang lao tới từ phía sau. Trên sa bàn tác chiến, hãy nhìn vào quỹ đạo di chuyển thiên tài của Hasdrubal. Sau khi quét sạch bờ sông, viên tướng kỵ binh kiệt xuất này không hề ham hố xông vào cướp phá doanh trại. Ông dẫn toàn bộ khối kỵ binh nặng phi nước đại quét vòng qua sau lưng toàn bộ đạo quân La Mã, đánh tan nát cánh kỵ binh của Varro, rồi lập tức chỉnh đốn hàng ngũ cho đòn kết liễu cuối cùng.",
        "en": "The decisive moment arrived. Hannibal signaled his line. The two flanking corps of Libyan veterans executed a synchronized ninety-degree inward wheel. Lowering long spears and drawing short swords, they drove into the unshielded Roman flanks. Simultaneously, horror struck from behind. Trace Hasdrubal's sweeping trajectory on the map. Having cleared the river, this cavalry master resisted plundering the Roman camp. He drove his heavy squadrons at full gallop across the entire rear of the Roman battle line, shattered Varro's allied cavalry, and reformed his ranks for the final hammer blow."
    },
    {
        "id": "scene_14_cue3_sealing_cauldron",
        "title": "Cue 3: Sealing the Cauldron & Compression",
        "start_sec": 1290.0,
        "end_sec": 1350.0,
        "speaker": "Seven Nguyen",
        "vi": "Nắp hòm đã đóng sập hoàn toàn. Hãy nhìn vào mật độ quân sự trên sa bàn nhiệt lượng này. Hasdrubal vừa giáng một cú búa tạ kinh hoàng vào sau lưng quân La Mã, bịt kín con đường thoái lui duy nhất. Bảy vạn con người giờ đây bị giam cầm trong một không gian chưa đầy một cây số vuông — tức là hơn bốn người chen chúc trên một mét vuông đất. Ở mật độ nén cơ học này, quy luật của lòng quả cảm biến mất. Định luật vật lý tàn nhẫn lên ngôi: Binh sĩ La Mã bị ép chặt vai chạm vai, đến mức họ không thể nhấc nổi cánh tay để rút thanh đoản kiếm gladius ra khỏi vỏ. Họ đứng đó, nghẹn thở trong cát bụi ngột ngạt của gió Volturnus, và chờ đợi lưỡi gươm đối phương chạm vào da thịt. Kể từ giây phút này, Cannae không còn là một trận đánh. Nó đã trở thành một cỗ máy nghiền thịt công nghiệp.",
        "en": "The lid of the cauldron has slammed shut. Look upon the tactical heatmap. Hasdrubal has delivered a crushing blow into the Roman rear, sealing their last escape route. Seventy thousand souls are now confined within less than a single square kilometer — over four men compressed into every square meter. In this density, courage ceases to matter. Raw physical compression dictates survival: legionaries are pressed shoulder to shoulder so violently they cannot draw their gladius blades from their scabbards. They stand suffocating in the Volturnus dust, awaiting the edge of Carthaginian steel. From this second onward, Cannae ceases to be a battle. It becomes an industrial slaughterhouse."
    },
    {
        "id": "scene_15_slaughterhouse_physics",
        "title": "Slaughterhouse Physics & Suffocation",
        "start_sec": 1350.0,
        "end_sec": 1425.0,
        "speaker": "Victor Vance (Narrator)",
        "vi": "Trận đánh lúc này không còn là một cuộc chiến tranh giữa hai lực lượng quân sự. Nó đã thoái hóa thành một lò sát sinh công nghiệp. Bảy vạn con người bị dồn ép trong một không gian chật hẹp chưa đầy một cây số vuông. Hãy hình dung định luật vật lý tàn nhẫn diễn ra tại trung tâm vòng vây: áp lực ép từ bốn phía khủng khiếp đến mức binh sĩ La Mã bị nén chặt vào nhau như những thanh củi bó sát. Họ không thể rút thanh đoản kiếm gladius ra khỏi vỏ; họ không thể giơ cánh tay mang khiên lên để che chắn đầu. Những người lính ở các lớp trong cùng thậm chí không nhìn thấy kẻ thù; họ chỉ cảm nhận được sức ép nghẹt thở của đám đông, bụi cát Volturnus lấp kín phổi, và tiếng gào thét kinh hoàng từ bốn phía mép ngoài đang dần dần tiến lại gần. Rất nhiều người đã chết vì ngạt thở và bị dẫm đạp dưới chân đồng đội trước khi một ngọn giáo Carthage chạm vào da thịt họ.",
        "en": "The engagement had degraded into systematic butchery. Imagine the grim mechanics at the center of the pocket: the inward pressure from four sides was so intense that Roman legionaries were bound like bundled timber. Men could neither draw weapons nor raise shields to parry downward blows. Those trapped deep in the interior could not even see their killers; they felt only the asphyxiating crush of flesh, lungs choking on Volturnus grit, and the screams of peripheral ranks drawing inexorably closer. Thousands suffocated or were trampled into the mire before an enemy blade ever touched their flesh."
    },
    {
        "id": "scene_16_death_of_paullus",
        "title": "Stoic Virtus: The Death of Paullus",
        "start_sec": 1425.0,
        "end_sec": 1515.0,
        "speaker": "Victor Vance (Narrator)",
        "vi": "Giữa biển máu tuyệt vọng, nhân vật bi kịch nhất của nền Cộng hòa — Chấp chính quan Lucius Aemilius Paullus — đã chọn cách kết thúc cuộc đời mình. Dù đã bị thương nặng ngay từ đầu trận, Paullus vẫn cố gượng dậy, tập hợp những tàn quân trung kiên nhất để tử chiến. Khi viên tướng trẻ Lentulus phi ngựa đến và van nài: 'Thưa Chấp chính quan, xin hãy nhận lấy con ngựa này và chạy trốn. Nước Ý vẫn cần ngài!', Paullus đã lắc đầu từ chối. Ông nói: 'Đừng lãng phí những giây phút quý giá bằng những giọt nước mắt vô ích. Hãy phi ngựa về thành Rome, bảo Viện Nguyên Lão gia cố tường thành trước khi Hannibal kéo tới. Còn ta, hãy để ta nằm lại đây, chết cùng những người lính đã ngã xuống dưới sự chỉ huy của ta.' Paullus quay lại chiến trường, cầm kiếm đứng giữa đám tàn quân, và bị chém gục dưới hàng chục mũi giáo của quân thù. Ngược lại, người đồng cấp của ông — Gaius Terentius Varro, kẻ châm ngòi cho thảm họa — đã phi ngựa tháo chạy về thành phố Venusia cùng vài chục kỵ binh tùy tùng.",
        "en": "Amid the butchery, Rome's tragic hero, Consul Lucius Aemilius Paullus, met his end with Roman stoicism. Though gravely wounded early in the fray, Paullus rallied remnants of his praetorian guard for a final stand. When young tribune Lentulus rode up offering his horse, urging the consul to flee and save the Republic, Paullus refused. 'Do not squander precious moments in weeping,' he replied. 'Ride swiftly to Rome. Tell the Senate to fortify the walls before Hannibal arrives. As for me, let me perish here alongside the brave soldiers who fell beneath my command.' Paullus turned back into the storm of spears, dying by the sword. His colleague Varro, architect of the disaster, fled to Venusia with a handful of horsemen."
    },
    {
        "id": "scene_17_lethality_rate",
        "title": "Lethality Rate: 100 Deaths Per Minute",
        "start_sec": 1515.0,
        "end_sec": 1590.0,
        "speaker": "Victor Vance (Narrator)",
        "vi": "Hãy nhìn vào những con số lạnh lùng của lịch sử. Cuộc tàn sát kéo dài suốt từ giữa trưa cho đến khi hoàng hôn buông xuống. Trong khoảng thời gian hơn sáu tiếng đồng hồ, cứ mỗi sáu mươi giây trôi qua, có hơn một trăm binh sĩ La Mã bị chém chết. Để so sánh: trong ngày đầu tiên của Trận Somme năm 1916 — biểu tượng tàn khốc của Thế chiến Thứ Nhất với súng máy tối tân và pháo binh hạng nặng — quân đội Anh tổn thất hai vạn người trong một ngày. Nhưng tại Cannae, chỉ bằng sức mạnh cơ bắp của kiếm thép, giáo mác và đá ném, Hannibal đã xóa sổ gần bảy vạn mạng người trên một mảnh đất chật hẹp chỉ trong vài giờ. Đây là tỷ lệ tiêu hao sinh lực con người cao nhất từng được ghi nhận trong toàn bộ lịch sử chiến tranh của loài người.",
        "en": "Reflect upon the cold statistics of history. The slaughter raged from midday until the setting of the sun. For over six continuous hours, more than one hundred Roman soldiers were slaughtered every sixty seconds. To put this in perspective: on the opening day of the Battle of the Somme in 1916, amidst modern machine guns and high explosives, British casualties totaled twenty thousand. At Cannae, using solely hand-held iron, bronze, and stone, Hannibal obliterated nearly seventy thousand men in an afternoon. It remains the highest rate of human carnage ever documented in ancient warfare."
    },
    {
        "id": "scene_18_three_bushels_gold",
        "title": "Desolation & Three Bushels of Gold Rings",
        "start_sec": 1590.0,
        "end_sec": 1650.0,
        "speaker": "Victor Vance (Narrator)",
        "vi": "Khi ánh bình minh ngày hôm sau chiếu rọi xuống dải đồng bằng sông Aufidus, một cảnh tượng kinh hoàng hiện ra trước mắt những kẻ thắng cuộc. Xác người và xác ngựa nằm la liệt, chồng chất lên nhau ba bốn tầng. Hơn bảy vạn thi thể La Mã nằm bất động dưới nắng hè gay gắt. Trong số những người chết có Chấp chính quan Paullus, hai cựu Chấp chính quan, hai mươi chín Chỉ huy quân sự cấp cao, và hơn tám mươi Thượng nghị sĩ La Mã — một phần ba bộ não tinh hoa chính trị của nền Cộng hòa đã bị xóa sổ chỉ trong một buổi chiều. Vài tuần sau, Mago Barca trở về Carthage. Đứng trước Viện Trưởng lão ngỡ ngàng, Mago trút ba thùng đong lúa đầy ắp nhẫn vàng ra sàn cung điện. Mỗi chiếc nhẫn rơi xuống là một lời tuyên cáo ngạo nghễ: giới tinh hoa thống trị của Rome đã không còn tồn tại.",
        "en": "When morning light broke over the Aufidus plains, the victors beheld an ocean of carnage. Tens of thousands of bodies and horse carcasses lay stacked in heaps under the summer sun. Among the dead lay Consul Paullus, two former consuls, twenty-nine military tribunes, and eighty Roman senators — one third of the Republic's governing elite wiped out in a single afternoon. Weeks later, Mago Barca arrived in Carthage. Before the stunned assembly, he poured three bushels of gold rings onto the marble floor — rings stripped from the fingers of dead Roman equites and magistrates. Each chime echoed a brutal truth: Rome's ruling class had been decimated."
    },
    {
        "id": "scene_19_cue4_grand_synthesis",
        "title": "Cue 4: Grand Synthesis & The Maharbal Riddle",
        "start_sec": 1650.0,
        "end_sec": 1800.0,
        "speaker": "Seven Nguyen",
        "vi": "Sáu mươi bảy ngàn năm trăm xác lính La Mã nằm lại bên bờ sông Aufidus. Cụm từ 'Hannibal ante portas' — Hannibal đang trước cổng thành — trở thành cơn ác mộng kinh hoàng nhất lịch sử thành Rome. Bất kỳ đế chế nào khác cũng sẽ quỳ gối xin hàng sau khi mất đi ba đạo quân chủ lực liên tiếp. Nhưng đây là La Mã. Viện Nguyên Lão cấm khóc tang quá ba mươi ngày, từ chối chuộc tù binh, giải phóng tám ngàn nô lệ để lập quân đoàn mới, và kiên cường chiến đấu thêm mười bốn năm nữa cho đến ngày Scipio đánh bại Hannibal tại Zama. Hơn hai ngàn năm trôi qua, Cannae vẫn là đỉnh cao chói lọi, là chuẩn mực vàng của nghệ thuật bao vây tiêu diệt. Từ Bá tước Von Schlieffen năm 1914, Trận Stalingrad năm 1942, cho đến cú móc sườn 'Hail Mary' của Đại tướng Norman Schwarzkopf trong Chiến dịch Bão táp Sa mạc năm 1991 — mọi bộ óc quân sự vĩ đại đều khao khát tái hiện lại vòng vây hoàn hảo của Cannae. Nhưng trận đánh này cũng để lại một câu hỏi muôn thuở: Ngay sau chiến thắng, viên tướng kỵ binh Maharbal đã giục Hannibal: 'Hãy cho tôi dẫn kỵ binh phi thẳng về Rome, chỉ năm ngày nữa ngài sẽ yến tiệc trên Đồi Capitoline!' Nhưng Hannibal đã từ chối. Liệu việc Hannibal không tấn công thành Rome là một sự thận trọng sáng suốt trước giới hạn hậu cần và máy công thành? Hay đó là sai lầm chết người đã tước đi cơ hội duy nhất để Carthage làm chủ vận mệnh thế giới? Hãy để lại góc nhìn chiến thuật của quý vị ở phần bình luận bên dưới. Tôi là Seven Nguyen từ Studio Historical-2d. Xin chào và hẹn gặp lại trong hồ sơ tác chiến tiếp theo.",
        "en": "Sixty-seven thousand Roman dead lay beside the Aufidus. The cry 'Hannibal ante portas' — Hannibal is at the gates — echoed in terror through the streets of Rome. Any other empire would have sued for peace after losing three consular armies in succession. But this was Rome. The Senate limited mourning to thirty days, refused to ransom prisoners, enlisted eight thousand slaves into new legions, and fought on for fourteen bitter years until Scipio defeated Hannibal at Zama. Over two millennia later, Cannae remains the gold standard of double envelopment. From Count von Schlieffen in 1914, to Stalingrad in 1942, to General Norman Schwarzkopf's 'Hail Mary' hook in Desert Storm 1991 — every military master has sought to replicate the perfection of Cannae. Yet the battle leaves behind an eternal riddle: Immediately following the victory, cavalry commander Maharbal urged: 'Send me forward with the cavalry, and in five days you shall dine upon the Capitoline!' Hannibal refused. Was this restraint a wise calculation given siege limitations and stretched supply lines? Or was it the fatal hesitation that cost Carthage mastery of the ancient world? Share your strategic assessment in the comments below. I am Seven Nguyen from Studio Historical-2d. Until our next battle dossier."
    }
]

async def synthesize_all_scenes():
    print(f"\n=======================================================")
    print(f" [PHASE 1] Synthesizing Voice Tracks for 20 Scenes")
    print(f"=======================================================")
    
    tasks = []
    for sc in SCENES:
        sid = sc["id"]
        # Vietnamese
        vi_mp3 = os.path.join(VOICE_VI_DIR, f"{sid}_vi.mp3")
        # English
        en_mp3 = os.path.join(VOICE_EN_DIR, f"{sid}_en.mp3")
        
        # Seven Nguyen cues vs Narrator voice parameters
        if "Seven Nguyen" in sc["speaker"]:
            vi_voice, vi_rate, vi_pitch = "vi-VN-NamMinhNeural", "-3%", "-2Hz"
            en_voice, en_rate, en_pitch = "en-US-ChristopherNeural", "-4%", "-2Hz"
        else:
            vi_voice, vi_rate, vi_pitch = "vi-VN-NamMinhNeural", "-3%", "-1Hz"
            en_voice, en_rate, en_pitch = "en-US-ChristopherNeural", "-4%", "-2Hz"
            
        print(f"[*] Queuing {sid} ({sc['speaker']})...")
        
        async def run_pair(vi_t, vi_v, vi_r, vi_p, vi_out, en_t, en_v, en_r, en_p, en_out):
            # Synthesize VI
            if not os.path.exists(vi_out):
                c_vi = edge_tts.Communicate(vi_t, vi_v, rate=vi_r, pitch=vi_p)
                await c_vi.save(vi_out)
            # Synthesize EN
            if not os.path.exists(en_out):
                c_en = edge_tts.Communicate(en_t, en_v, rate=en_r, pitch=en_p)
                await c_en.save(en_out)
                
        tasks.append(run_pair(
            sc["vi"], vi_voice, vi_rate, vi_pitch, vi_mp3,
            sc["en"], en_voice, en_rate, en_pitch, en_mp3
        ))
        
    await asyncio.gather(*tasks)
    print("\n[OK] All 20 Vietnamese and English audio scenes synthesized successfully!")

def generate_kinetic_ass_subtitles():
    print(f"\n=======================================================")
    print(f" [PHASE 2] Generating Kinetic ASS Subtitles (Chiaroscuro & Gold)")
    print(f"=======================================================")
    
    ass_header = """[Script Info]
Title: Studio Historical-2d - Episode 01: Cannae 216 BC
ScriptType: v4.00+
WrapStyle: 0
ScaledBorderAndShadow: yes
YCbCr Matrix: TV.709
PlayResX: 1920
PlayResY: 1080

[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: WarRoomNarrator,Georgia,44,&H00FFFFFF,&H000000FF,&H00000000,&HA0000000,-1,0,0,0,100,100,1.2,0,1,3,4,2,80,80,95,1
Style: WarRoomHost,Georgia,46,&H00FFFFFF,&H000000FF,&H00000000,&HB0000000,-1,0,0,0,102,102,1.3,0,1,3,5,2,80,80,95,1

[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
"""

    keywords_gold = [
        "216 BC", "216 Trước Công Nguyên", "Cannae", "Hannibal Barca", "Hannibal",
        "Rome", "La Mã", "Aufidus", "Volturnus", "Hasdrubal", "Paullus", "Varro",
        "Mago", "Maharbal", "Fabius", "Fabian", "Libya", "Iberian", "Gallic",
        "86.400", "50.000", "67.500", "gladius", "scutum", "maniple",
        "double encirclement", "vòng vây kép", "đòn vu hồi kép", "cánh cung lồi",
        "cánh cung lõm", "convex crescent", "concave crescent", "Hannibal ante portas"
    ]
    
    def format_time(sec):
        h = int(sec // 3600)
        m = int((sec % 3600) // 60)
        s = sec % 60
        cs = int((s - int(s)) * 100)
        return f"{h:01d}:{m:02d}:{int(s):02d}.{cs:02d}"

    def style_text(text):
        res = text
        for kw in keywords_gold:
            if kw in res:
                res = res.replace(kw, f"{{\\c&H0037AFD4&\\b1}}{kw}{{\\c&H00FFFFFF&\\b0}}")
        return res

    events_vi = []
    events_en = []
    
    for sc in SCENES:
        t_start = format_time(sc["start_sec"])
        t_end = format_time(sc["end_sec"])
        style = "WarRoomHost" if "Seven Nguyen" in sc["speaker"] else "WarRoomNarrator"
        
        # Vietnamese
        txt_vi = style_text(sc["vi"])
        events_vi.append(f"Dialogue: 0,{t_start},{t_end},{style},{sc['speaker']},0,0,0,,{txt_vi}")
        
        # English
        txt_en = style_text(sc["en"])
        events_en.append(f"Dialogue: 0,{t_start},{t_end},{style},{sc['speaker']},0,0,0,,{txt_en}")
        
    ass_vi_path = os.path.join(SUBS_DIR, "cannae_kinetic_subtitles_vi.ass")
    ass_en_path = os.path.join(SUBS_DIR, "cannae_kinetic_subtitles_en.ass")
    
    with open(ass_vi_path, "w", encoding="utf-8") as f:
        f.write(ass_header + "\n".join(events_vi) + "\n")
    with open(ass_en_path, "w", encoding="utf-8") as f:
        f.write(ass_header + "\n".join(events_en) + "\n")
        
    print(f"[OK] Kinetic ASS Subtitles (VI) generated: {ass_vi_path}")
    print(f"[OK] Kinetic ASS Subtitles (EN) generated: {ass_en_path}")
    
    # Also generate SRT subtitles
    def write_srt(scenes, lang_key, output_srt):
        lines = []
        for i, sc in enumerate(scenes, 1):
            s_sec = sc["start_sec"]
            e_sec = sc["end_sec"]
            s_time = f"{int(s_sec//3600):02d}:{int((s_sec%3600)//60):02d}:{int(s_sec%60):02d},{int((s_sec%1)*1000):03d}"
            e_time = f"{int(e_sec//3600):02d}:{int((e_sec%3600)//60):02d}:{int(e_sec%60):02d},{int((e_sec%1)*1000):03d}"
            lines.append(f"{i}\n{s_time} --> {e_time}\n{sc[lang_key]}\n")
        with open(output_srt, "w", encoding="utf-8") as f:
            f.write("\n".join(lines))
            
    srt_vi_path = os.path.join(SUBS_DIR, "cannae_subtitles_vi.srt")
    srt_en_path = os.path.join(SUBS_DIR, "cannae_subtitles_en.srt")
    write_srt(SCENES, "vi", srt_vi_path)
    write_srt(SCENES, "en", srt_en_path)
    print(f"[OK] Standard SRT Subtitles generated: {srt_vi_path} and {srt_en_path}")

def build_30m_master_narration_and_mix():
    print(f"\n=======================================================")
    print(f" [PHASE 3] Compiling Master 30-Minute Narration & Mix")
    print(f"=======================================================")
    
    # Create FFmpeg concat list for VI and EN
    list_vi = os.path.join(VOICE_VI_DIR, "concat_vi.txt")
    list_en = os.path.join(VOICE_EN_DIR, "concat_en.txt")
    
    with open(list_vi, "w", encoding="utf-8") as f_vi, open(list_en, "w", encoding="utf-8") as f_en:
        for sc in SCENES:
            sid = sc["id"]
            vi_p = os.path.join(VOICE_VI_DIR, f"{sid}_vi.mp3").replace("\\", "/")
            en_p = os.path.join(VOICE_EN_DIR, f"{sid}_en.mp3").replace("\\", "/")
            f_vi.write(f"file '{vi_p}'\n")
            f_en.write(f"file '{en_p}'\n")
            
    # Concatenate and normalize VI
    master_vi_mp3 = os.path.join(VOICE_VI_DIR, "cannae_voiceover_vi_30m_master.mp3")
    cmd_vi = [
        "ffmpeg", "-y",
        "-f", "concat", "-safe", "0", "-i", list_vi,
        "-af", "loudnorm=I=-14.0:TP=-1.0:LRA=11.0",
        "-c:a", "libmp3lame", "-b:a", "192k",
        master_vi_mp3
    ]
    subprocess.run(cmd_vi, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, check=True)
    print(f"[OK] Master 30-min Vietnamese Voiceover: {master_vi_mp3}")
    
    # Concatenate and normalize EN
    master_en_mp3 = os.path.join(VOICE_EN_DIR, "cannae_voiceover_en_30m_master.mp3")
    cmd_en = [
        "ffmpeg", "-y",
        "-f", "concat", "-safe", "0", "-i", list_en,
        "-af", "loudnorm=I=-14.0:TP=-1.0:LRA=11.0",
        "-c:a", "libmp3lame", "-b:a", "192k",
        master_en_mp3
    ]
    subprocess.run(cmd_en, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, check=True)
    print(f"[OK] Master 30-min English Voiceover: {master_en_mp3}")
    
    # Multi-Track Master Container Packaging (MKV container with Dual Audio Tracks)
    sfx_cav = os.path.join(SFX_DIR, "binaural_hasdrubal_cavalry_sweep.wav")
    master_multitrack = os.path.join(MASTER_DIR, "cannae_master_multitrack_audio.mka")
    
    cmd_mux = [
        "ffmpeg", "-y",
        "-i", master_en_mp3,
        "-i", master_vi_mp3,
        "-map", "0:a",
        "-map", "1:a",
        "-c:a", "aac",
        "-b:a", "192k",
        "-metadata:s:a:0", "language=eng",
        "-metadata:s:a:0", "title=English (BBC/Documentary Baritone)",
        "-metadata:s:a:1", "language=vie",
        "-metadata:s:a:1", "title=Tiếng Việt (Host Seven Nguyen)",
        master_multitrack
    ]
    subprocess.run(cmd_mux, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, check=True)
    print(f"[OK] Master Multi-Track Audio Container: {master_multitrack}")

async def main():
    await synthesize_all_scenes()
    generate_kinetic_ass_subtitles()
    build_30m_master_narration_and_mix()
    print("\n=======================================================")
    print(" [COMPLETED] EP01 Audio, Voice & Subtitle Master Delivery Ready!")
    print("=======================================================")

if __name__ == "__main__":
    asyncio.run(main())
