diff --git a/assets/1_processed/render_props.json b/assets/1_processed/render_props.json index 558494e..789d73a 100644 --- a/assets/1_processed/render_props.json +++ b/assets/1_processed/render_props.json @@ -16,8 +16,8 @@ }, "financials": { "income": 703, - "expenditure": 1038.0, - "assetBalance": 543.0 + "expenditure": 288.0, + "assetBalance": 1349.0 }, "events": [], "isCritical": false @@ -30,8 +30,8 @@ }, "financials": { "income": 703, - "expenditure": 1059.0, - "assetBalance": 203.0 + "expenditure": 294.0, + "assetBalance": 1799.0 }, "events": [], "isCritical": false @@ -44,11 +44,11 @@ }, "financials": { "income": 703, - "expenditure": 1080.0, - "assetBalance": -168.0 + "expenditure": 300.0, + "assetBalance": 2256.0 }, "events": [], - "isCritical": true + "isCritical": false }, { "year": 2028, @@ -58,11 +58,11 @@ }, "financials": { "income": 703, - "expenditure": 1102.0, - "assetBalance": -591.0 + "expenditure": 306.0, + "assetBalance": 2721.0 }, "events": [], - "isCritical": true + "isCritical": false }, { "year": 2029, @@ -72,11 +72,11 @@ }, "financials": { "income": 703, - "expenditure": 1124.0, - "assetBalance": -1101.0 + "expenditure": 312.0, + "assetBalance": 3194.0 }, "events": [], - "isCritical": true + "isCritical": false }, { "year": 2030, @@ -86,11 +86,11 @@ }, "financials": { "income": 703, - "expenditure": 1146.0, - "assetBalance": -1709.0 + "expenditure": 318.0, + "assetBalance": 3675.0 }, "events": [], - "isCritical": true + "isCritical": false }, { "year": 2031, @@ -100,11 +100,11 @@ }, "financials": { "income": 703, - "expenditure": 1169.0, - "assetBalance": -2431.0 + "expenditure": 324.0, + "assetBalance": 4164.0 }, "events": [], - "isCritical": true + "isCritical": false }, { "year": 2032, @@ -114,11 +114,14 @@ }, "financials": { "income": 703, - "expenditure": 1192.0, - "assetBalance": -3285.0 + "expenditure": 331.0, + "assetBalance": 4661.0 }, - "events": [], - "isCritical": true + "events": [ + "Event", + "Event" + ], + "isCritical": false }, { "year": 2033, @@ -128,13 +131,11 @@ }, "financials": { "income": 703, - "expenditure": 1216.0, - "assetBalance": -4291.0 + "expenditure": 337.0, + "assetBalance": 5166.0 }, - "events": [ - "Event" - ], - "isCritical": true + "events": [], + "isCritical": false }, { "year": 2034, @@ -144,11 +145,11 @@ }, "financials": { "income": 703, - "expenditure": 1241.0, - "assetBalance": -5472.0 + "expenditure": 344.0, + "assetBalance": 5680.0 }, "events": [], - "isCritical": true + "isCritical": false }, { "year": 2035, @@ -158,11 +159,11 @@ }, "financials": { "income": 703, - "expenditure": 1265.0, - "assetBalance": -6856.0 + "expenditure": 351.0, + "assetBalance": 6203.0 }, "events": [], - "isCritical": true + "isCritical": false }, { "year": 2036, @@ -172,11 +173,11 @@ }, "financials": { "income": 703, - "expenditure": 1291.0, - "assetBalance": -8471.0 + "expenditure": 358.0, + "assetBalance": 6734.0 }, "events": [], - "isCritical": true + "isCritical": false }, { "year": 2037, @@ -186,13 +187,13 @@ }, "financials": { "income": 703, - "expenditure": 1316.0, - "assetBalance": -10356.0 + "expenditure": 365.0, + "assetBalance": 7273.0 }, "events": [ "Event" ], - "isCritical": true + "isCritical": false }, { "year": 2038, @@ -202,11 +203,11 @@ }, "financials": { "income": 0, - "expenditure": 1343.0, - "assetBalance": -13252.0 + "expenditure": 373.0, + "assetBalance": 7119.0 }, "events": [], - "isCritical": true + "isCritical": false }, { "year": 2039, @@ -216,11 +217,11 @@ }, "financials": { "income": 0, - "expenditure": 1370.0, - "assetBalance": -16609.0 + "expenditure": 380.0, + "assetBalance": 6953.0 }, "events": [], - "isCritical": true + "isCritical": false }, { "year": 2040, @@ -230,11 +231,11 @@ }, "financials": { "income": 0, - "expenditure": 1397.0, - "assetBalance": -20497.0 + "expenditure": 388.0, + "assetBalance": 6774.0 }, "events": [], - "isCritical": true + "isCritical": false }, { "year": 2041, @@ -244,11 +245,11 @@ }, "financials": { "income": 0, - "expenditure": 1425.0, - "assetBalance": -24997.0 + "expenditure": 395.0, + "assetBalance": 6581.0 }, "events": [], - "isCritical": true + "isCritical": false }, { "year": 2042, @@ -258,11 +259,11 @@ }, "financials": { "income": 0, - "expenditure": 1453.0, - "assetBalance": -30200.0 + "expenditure": 403.0, + "assetBalance": 6376.0 }, "events": [], - "isCritical": true + "isCritical": false }, { "year": 2043, @@ -272,11 +273,11 @@ }, "financials": { "income": 0, - "expenditure": 1483.0, - "assetBalance": -36213.0 + "expenditure": 411.0, + "assetBalance": 6155.0 }, "events": [], - "isCritical": true + "isCritical": false }, { "year": 2044, @@ -286,11 +287,11 @@ }, "financials": { "income": 0, - "expenditure": 1512.0, - "assetBalance": -43157.0 + "expenditure": 420.0, + "assetBalance": 5921.0 }, "events": [], - "isCritical": true + "isCritical": false }, { "year": 2045, @@ -300,11 +301,11 @@ }, "financials": { "income": 0, - "expenditure": 1542.0, - "assetBalance": -51173.0 + "expenditure": 428.0, + "assetBalance": 5670.0 }, "events": [], - "isCritical": true + "isCritical": false }, { "year": 2046, @@ -314,11 +315,11 @@ }, "financials": { "income": 0, - "expenditure": 1573.0, - "assetBalance": -60422.0 + "expenditure": 437.0, + "assetBalance": 5404.0 }, "events": [], - "isCritical": true + "isCritical": false }, { "year": 2047, @@ -328,11 +329,11 @@ }, "financials": { "income": 0, - "expenditure": 1605.0, - "assetBalance": -71090.0 + "expenditure": 445.0, + "assetBalance": 5121.0 }, "events": [], - "isCritical": true + "isCritical": false }, { "year": 2048, @@ -342,11 +343,11 @@ }, "financials": { "income": 0, - "expenditure": 1637.0, - "assetBalance": -83390.0 + "expenditure": 454.0, + "assetBalance": 4820.0 }, "events": [], - "isCritical": true + "isCritical": false }, { "year": 2049, @@ -356,11 +357,11 @@ }, "financials": { "income": 0, - "expenditure": 1670.0, - "assetBalance": -97568.0 + "expenditure": 463.0, + "assetBalance": 4502.0 }, "events": [], - "isCritical": true + "isCritical": false }, { "year": 2050, @@ -370,11 +371,11 @@ }, "financials": { "income": 0, - "expenditure": 1703.0, - "assetBalance": -113906.0 + "expenditure": 472.0, + "assetBalance": 4164.0 }, "events": [], - "isCritical": true + "isCritical": false }, { "year": 2051, @@ -384,11 +385,11 @@ }, "financials": { "income": 0, - "expenditure": 1737.0, - "assetBalance": -132729.0 + "expenditure": 482.0, + "assetBalance": 3807.0 }, "events": [], - "isCritical": true + "isCritical": false }, { "year": 2052, @@ -398,11 +399,11 @@ }, "financials": { "income": 0, - "expenditure": 1772.0, - "assetBalance": -154410.0 + "expenditure": 492.0, + "assetBalance": 3430.0 }, "events": [], - "isCritical": true + "isCritical": false }, { "year": 2053, @@ -412,11 +413,11 @@ }, "financials": { "income": 0, - "expenditure": 1807.0, - "assetBalance": -179379.0 + "expenditure": 501.0, + "assetBalance": 3031.0 }, "events": [], - "isCritical": true + "isCritical": false }, { "year": 2054, @@ -426,11 +427,11 @@ }, "financials": { "income": 0, - "expenditure": 1843.0, - "assetBalance": -208129.0 + "expenditure": 511.0, + "assetBalance": 2611.0 }, "events": [], - "isCritical": true + "isCritical": false }, { "year": 2055, @@ -440,11 +441,11 @@ }, "financials": { "income": 0, - "expenditure": 1880.0, - "assetBalance": -241229.0 + "expenditure": 522.0, + "assetBalance": 2167.0 }, "events": [], - "isCritical": true + "isCritical": false }, { "year": 2056, @@ -454,11 +455,11 @@ }, "financials": { "income": 0, - "expenditure": 1918.0, - "assetBalance": -279331.0 + "expenditure": 532.0, + "assetBalance": 1700.0 }, "events": [], - "isCritical": true + "isCritical": false }, { "year": 2057, @@ -468,13 +469,13 @@ }, "financials": { "income": 0, - "expenditure": 1956.0, - "assetBalance": -323187.0 + "expenditure": 543.0, + "assetBalance": 1209.0 }, "events": [ "Event" ], - "isCritical": true + "isCritical": false }, { "year": 2058, @@ -484,11 +485,11 @@ }, "financials": { "income": 0, - "expenditure": 1995.0, - "assetBalance": -373660.0 + "expenditure": 554.0, + "assetBalance": 691.0 }, "events": [], - "isCritical": true + "isCritical": false }, { "year": 2059, @@ -498,11 +499,11 @@ }, "financials": { "income": 0, - "expenditure": 2035.0, - "assetBalance": -431744.0 + "expenditure": 565.0, + "assetBalance": 147.0 }, "events": [], - "isCritical": true + "isCritical": false }, { "year": 2060, @@ -512,8 +513,8 @@ }, "financials": { "income": 0, - "expenditure": 2076.0, - "assetBalance": -498581.0 + "expenditure": 576.0, + "assetBalance": -424.0 }, "events": [], "isCritical": true @@ -526,8 +527,8 @@ }, "financials": { "income": 0, - "expenditure": 2117.0, - "assetBalance": -575486.0 + "expenditure": 587.0, + "assetBalance": -1075.0 }, "events": [], "isCritical": true @@ -540,8 +541,8 @@ }, "financials": { "income": 0, - "expenditure": 2160.0, - "assetBalance": -663969.0 + "expenditure": 599.0, + "assetBalance": -1836.0 }, "events": [], "isCritical": true @@ -554,8 +555,8 @@ }, "financials": { "income": 0, - "expenditure": 2203.0, - "assetBalance": -765767.0 + "expenditure": 611.0, + "assetBalance": -2723.0 }, "events": [], "isCritical": true @@ -568,8 +569,8 @@ }, "financials": { "income": 0, - "expenditure": 2247.0, - "assetBalance": -882879.0 + "expenditure": 623.0, + "assetBalance": -3754.0 }, "events": [], "isCritical": true @@ -582,8 +583,8 @@ }, "financials": { "income": 0, - "expenditure": 2292.0, - "assetBalance": -1017603.0 + "expenditure": 636.0, + "assetBalance": -4954.0 }, "events": [], "isCritical": true @@ -596,8 +597,8 @@ }, "financials": { "income": 0, - "expenditure": 2338.0, - "assetBalance": -1172581.0 + "expenditure": 649.0, + "assetBalance": -6345.0 }, "events": [], "isCritical": true @@ -610,8 +611,8 @@ }, "financials": { "income": 0, - "expenditure": 2385.0, - "assetBalance": -1350853.0 + "expenditure": 662.0, + "assetBalance": -7959.0 }, "events": [], "isCritical": true @@ -624,8 +625,8 @@ }, "financials": { "income": 0, - "expenditure": 2432.0, - "assetBalance": -1555913.0 + "expenditure": 675.0, + "assetBalance": -9827.0 }, "events": [], "isCritical": true @@ -638,8 +639,8 @@ }, "financials": { "income": 0, - "expenditure": 2481.0, - "assetBalance": -1791781.0 + "expenditure": 688.0, + "assetBalance": -11990.0 }, "events": [], "isCritical": true @@ -652,8 +653,8 @@ }, "financials": { "income": 0, - "expenditure": 2530.0, - "assetBalance": -2063078.0 + "expenditure": 702.0, + "assetBalance": -14490.0 }, "events": [], "isCritical": true @@ -666,8 +667,8 @@ }, "financials": { "income": 0, - "expenditure": 2581.0, - "assetBalance": -2375121.0 + "expenditure": 716.0, + "assetBalance": -17380.0 }, "events": [], "isCritical": true @@ -680,8 +681,8 @@ }, "financials": { "income": 0, - "expenditure": 2633.0, - "assetBalance": -2734022.0 + "expenditure": 730.0, + "assetBalance": -20717.0 }, "events": [], "isCritical": true @@ -694,8 +695,8 @@ }, "financials": { "income": 0, - "expenditure": 2685.0, - "assetBalance": -3146810.0 + "expenditure": 745.0, + "assetBalance": -24570.0 }, "events": [], "isCritical": true @@ -708,8 +709,8 @@ }, "financials": { "income": 0, - "expenditure": 2739.0, - "assetBalance": -3621571.0 + "expenditure": 760.0, + "assetBalance": -29015.0 }, "events": [], "isCritical": true @@ -722,8 +723,8 @@ }, "financials": { "income": 0, - "expenditure": 2794.0, - "assetBalance": -4167601.0 + "expenditure": 775.0, + "assetBalance": -34143.0 }, "events": [], "isCritical": true @@ -736,8 +737,8 @@ }, "financials": { "income": 0, - "expenditure": 2850.0, - "assetBalance": -4795590.0 + "expenditure": 791.0, + "assetBalance": -40055.0 }, "events": [], "isCritical": true @@ -750,8 +751,8 @@ }, "financials": { "income": 0, - "expenditure": 2907.0, - "assetBalance": -5517836.0 + "expenditure": 806.0, + "assetBalance": -46870.0 }, "events": [], "isCritical": true @@ -764,8 +765,8 @@ }, "financials": { "income": 0, - "expenditure": 2965.0, - "assetBalance": -6348476.0 + "expenditure": 823.0, + "assetBalance": -54723.0 }, "events": [], "isCritical": true @@ -785,15 +786,15 @@ "total": 703 }, "expenses": { - "living": 415.20000000000005, - "housing": 311.4, - "education": 155.7, - "tax": 103.80000000000001, - "event": 51.900000000000006 + "living": 115.2, + "housing": 86.39999999999999, + "education": 43.199999999999996, + "tax": 28.8, + "event": 14.4 }, - "totalExpense": 1038.0, - "netCashFlow": -335.0, - "assetBalance": 543.0 + "totalExpense": 288.0, + "netCashFlow": 415.0, + "assetBalance": 1349.0 }, { "year": 2026, @@ -802,15 +803,15 @@ "total": 703 }, "expenses": { - "living": 423.6, - "housing": 317.7, - "education": 158.85, - "tax": 105.9, - "event": 52.95 + "living": 117.60000000000001, + "housing": 88.2, + "education": 44.1, + "tax": 29.400000000000002, + "event": 14.700000000000001 }, - "totalExpense": 1059.0, - "netCashFlow": -356.0, - "assetBalance": 203.0 + "totalExpense": 294.0, + "netCashFlow": 409.0, + "assetBalance": 1799.0 }, { "year": 2027, @@ -819,15 +820,15 @@ "total": 703 }, "expenses": { - "living": 432.0, - "housing": 324.0, - "education": 162.0, - "tax": 108.0, - "event": 54.0 + "living": 120.0, + "housing": 90.0, + "education": 45.0, + "tax": 30.0, + "event": 15.0 }, - "totalExpense": 1080.0, - "netCashFlow": -377.0, - "assetBalance": -168.0 + "totalExpense": 300.0, + "netCashFlow": 403.0, + "assetBalance": 2256.0 }, { "year": 2028, @@ -836,15 +837,15 @@ "total": 703 }, "expenses": { - "living": 440.8, - "housing": 330.59999999999997, - "education": 165.29999999999998, - "tax": 110.2, - "event": 55.1 + "living": 122.4, + "housing": 91.8, + "education": 45.9, + "tax": 30.6, + "event": 15.3 }, - "totalExpense": 1102.0, - "netCashFlow": -399.0, - "assetBalance": -591.0 + "totalExpense": 306.0, + "netCashFlow": 397.0, + "assetBalance": 2721.0 }, { "year": 2029, @@ -853,15 +854,15 @@ "total": 703 }, "expenses": { - "living": 449.6, - "housing": 337.2, - "education": 168.6, - "tax": 112.4, - "event": 56.2 + "living": 124.80000000000001, + "housing": 93.6, + "education": 46.8, + "tax": 31.200000000000003, + "event": 15.600000000000001 }, - "totalExpense": 1124.0, - "netCashFlow": -421.0, - "assetBalance": -1101.0 + "totalExpense": 312.0, + "netCashFlow": 391.0, + "assetBalance": 3194.0 }, { "year": 2030, @@ -870,15 +871,15 @@ "total": 703 }, "expenses": { - "living": 458.40000000000003, - "housing": 343.8, - "education": 171.9, - "tax": 114.60000000000001, - "event": 57.300000000000004 + "living": 127.2, + "housing": 95.39999999999999, + "education": 47.699999999999996, + "tax": 31.8, + "event": 15.9 }, - "totalExpense": 1146.0, - "netCashFlow": -443.0, - "assetBalance": -1709.0 + "totalExpense": 318.0, + "netCashFlow": 385.0, + "assetBalance": 3675.0 }, { "year": 2031, @@ -887,15 +888,15 @@ "total": 703 }, "expenses": { - "living": 467.6, - "housing": 350.7, - "education": 175.35, - "tax": 116.9, - "event": 58.45 + "living": 129.6, + "housing": 97.2, + "education": 48.6, + "tax": 32.4, + "event": 16.2 }, - "totalExpense": 1169.0, - "netCashFlow": -466.0, - "assetBalance": -2431.0 + "totalExpense": 324.0, + "netCashFlow": 379.0, + "assetBalance": 4164.0 }, { "year": 2032, @@ -904,15 +905,15 @@ "total": 703 }, "expenses": { - "living": 476.8, - "housing": 357.59999999999997, - "education": 178.79999999999998, - "tax": 119.2, - "event": 59.6 + "living": 132.4, + "housing": 99.3, + "education": 49.65, + "tax": 33.1, + "event": 16.55 }, - "totalExpense": 1192.0, - "netCashFlow": -489.0, - "assetBalance": -3285.0 + "totalExpense": 331.0, + "netCashFlow": 372.0, + "assetBalance": 4661.0 }, { "year": 2033, @@ -921,15 +922,15 @@ "total": 703 }, "expenses": { - "living": 486.40000000000003, - "housing": 364.8, - "education": 182.4, - "tax": 121.60000000000001, - "event": 60.800000000000004 + "living": 134.8, + "housing": 101.1, + "education": 50.55, + "tax": 33.7, + "event": 16.85 }, - "totalExpense": 1216.0, - "netCashFlow": -513.0, - "assetBalance": -4291.0 + "totalExpense": 337.0, + "netCashFlow": 366.0, + "assetBalance": 5166.0 }, { "year": 2034, @@ -938,15 +939,15 @@ "total": 703 }, "expenses": { - "living": 496.40000000000003, - "housing": 372.3, - "education": 186.15, - "tax": 124.10000000000001, - "event": 62.050000000000004 + "living": 137.6, + "housing": 103.2, + "education": 51.6, + "tax": 34.4, + "event": 17.2 }, - "totalExpense": 1241.0, - "netCashFlow": -538.0, - "assetBalance": -5472.0 + "totalExpense": 344.0, + "netCashFlow": 359.0, + "assetBalance": 5680.0 }, { "year": 2035, @@ -955,15 +956,15 @@ "total": 703 }, "expenses": { - "living": 506.0, - "housing": 379.5, - "education": 189.75, - "tax": 126.5, - "event": 63.25 + "living": 140.4, + "housing": 105.3, + "education": 52.65, + "tax": 35.1, + "event": 17.55 }, - "totalExpense": 1265.0, - "netCashFlow": -562.0, - "assetBalance": -6856.0 + "totalExpense": 351.0, + "netCashFlow": 352.0, + "assetBalance": 6203.0 }, { "year": 2036, @@ -972,15 +973,15 @@ "total": 703 }, "expenses": { - "living": 516.4, - "housing": 387.3, - "education": 193.65, - "tax": 129.1, - "event": 64.55 + "living": 143.20000000000002, + "housing": 107.39999999999999, + "education": 53.699999999999996, + "tax": 35.800000000000004, + "event": 17.900000000000002 }, - "totalExpense": 1291.0, - "netCashFlow": -588.0, - "assetBalance": -8471.0 + "totalExpense": 358.0, + "netCashFlow": 345.0, + "assetBalance": 6734.0 }, { "year": 2037, @@ -989,15 +990,15 @@ "total": 703 }, "expenses": { - "living": 526.4, - "housing": 394.8, - "education": 197.4, - "tax": 131.6, - "event": 65.8 + "living": 146.0, + "housing": 109.5, + "education": 54.75, + "tax": 36.5, + "event": 18.25 }, - "totalExpense": 1316.0, - "netCashFlow": -613.0, - "assetBalance": -10356.0 + "totalExpense": 365.0, + "netCashFlow": 338.0, + "assetBalance": 7273.0 }, { "year": 2038, @@ -1006,15 +1007,15 @@ "total": 0 }, "expenses": { - "living": 537.2, - "housing": 402.9, - "education": 201.45, - "tax": 134.3, - "event": 67.15 + "living": 149.20000000000002, + "housing": 111.89999999999999, + "education": 55.949999999999996, + "tax": 37.300000000000004, + "event": 18.650000000000002 }, - "totalExpense": 1343.0, - "netCashFlow": -1343.0, - "assetBalance": -13252.0 + "totalExpense": 373.0, + "netCashFlow": -373.0, + "assetBalance": 7119.0 }, { "year": 2039, @@ -1023,15 +1024,15 @@ "total": 0 }, "expenses": { - "living": 548.0, - "housing": 411.0, - "education": 205.5, - "tax": 137.0, - "event": 68.5 + "living": 152.0, + "housing": 114.0, + "education": 57.0, + "tax": 38.0, + "event": 19.0 }, - "totalExpense": 1370.0, - "netCashFlow": -1370.0, - "assetBalance": -16609.0 + "totalExpense": 380.0, + "netCashFlow": -380.0, + "assetBalance": 6953.0 }, { "year": 2040, @@ -1040,15 +1041,15 @@ "total": 0 }, "expenses": { - "living": 558.8000000000001, - "housing": 419.09999999999997, - "education": 209.54999999999998, - "tax": 139.70000000000002, - "event": 69.85000000000001 + "living": 155.20000000000002, + "housing": 116.39999999999999, + "education": 58.199999999999996, + "tax": 38.800000000000004, + "event": 19.400000000000002 }, - "totalExpense": 1397.0, - "netCashFlow": -1397.0, - "assetBalance": -20497.0 + "totalExpense": 388.0, + "netCashFlow": -388.0, + "assetBalance": 6774.0 }, { "year": 2041, @@ -1057,15 +1058,15 @@ "total": 0 }, "expenses": { - "living": 570.0, - "housing": 427.5, - "education": 213.75, - "tax": 142.5, - "event": 71.25 + "living": 158.0, + "housing": 118.5, + "education": 59.25, + "tax": 39.5, + "event": 19.75 }, - "totalExpense": 1425.0, - "netCashFlow": -1425.0, - "assetBalance": -24997.0 + "totalExpense": 395.0, + "netCashFlow": -395.0, + "assetBalance": 6581.0 }, { "year": 2042, @@ -1074,15 +1075,15 @@ "total": 0 }, "expenses": { - "living": 581.2, - "housing": 435.9, - "education": 217.95, - "tax": 145.3, - "event": 72.65 + "living": 161.20000000000002, + "housing": 120.89999999999999, + "education": 60.449999999999996, + "tax": 40.300000000000004, + "event": 20.150000000000002 }, - "totalExpense": 1453.0, - "netCashFlow": -1453.0, - "assetBalance": -30200.0 + "totalExpense": 403.0, + "netCashFlow": -403.0, + "assetBalance": 6376.0 }, { "year": 2043, @@ -1091,15 +1092,15 @@ "total": 0 }, "expenses": { - "living": 593.2, - "housing": 444.9, - "education": 222.45, - "tax": 148.3, - "event": 74.15 + "living": 164.4, + "housing": 123.3, + "education": 61.65, + "tax": 41.1, + "event": 20.55 }, - "totalExpense": 1483.0, - "netCashFlow": -1483.0, - "assetBalance": -36213.0 + "totalExpense": 411.0, + "netCashFlow": -411.0, + "assetBalance": 6155.0 }, { "year": 2044, @@ -1108,15 +1109,15 @@ "total": 0 }, "expenses": { - "living": 604.8000000000001, - "housing": 453.59999999999997, - "education": 226.79999999999998, - "tax": 151.20000000000002, - "event": 75.60000000000001 + "living": 168.0, + "housing": 126.0, + "education": 63.0, + "tax": 42.0, + "event": 21.0 }, - "totalExpense": 1512.0, - "netCashFlow": -1512.0, - "assetBalance": -43157.0 + "totalExpense": 420.0, + "netCashFlow": -420.0, + "assetBalance": 5921.0 }, { "year": 2045, @@ -1125,15 +1126,15 @@ "total": 0 }, "expenses": { - "living": 616.8000000000001, - "housing": 462.59999999999997, - "education": 231.29999999999998, - "tax": 154.20000000000002, - "event": 77.10000000000001 + "living": 171.20000000000002, + "housing": 128.4, + "education": 64.2, + "tax": 42.800000000000004, + "event": 21.400000000000002 }, - "totalExpense": 1542.0, - "netCashFlow": -1542.0, - "assetBalance": -51173.0 + "totalExpense": 428.0, + "netCashFlow": -428.0, + "assetBalance": 5670.0 }, { "year": 2046, @@ -1142,15 +1143,15 @@ "total": 0 }, "expenses": { - "living": 629.2, - "housing": 471.9, - "education": 235.95, - "tax": 157.3, - "event": 78.65 + "living": 174.8, + "housing": 131.1, + "education": 65.55, + "tax": 43.7, + "event": 21.85 }, - "totalExpense": 1573.0, - "netCashFlow": -1573.0, - "assetBalance": -60422.0 + "totalExpense": 437.0, + "netCashFlow": -437.0, + "assetBalance": 5404.0 }, { "year": 2047, @@ -1159,15 +1160,15 @@ "total": 0 }, "expenses": { - "living": 642.0, - "housing": 481.5, - "education": 240.75, - "tax": 160.5, - "event": 80.25 + "living": 178.0, + "housing": 133.5, + "education": 66.75, + "tax": 44.5, + "event": 22.25 }, - "totalExpense": 1605.0, - "netCashFlow": -1605.0, - "assetBalance": -71090.0 + "totalExpense": 445.0, + "netCashFlow": -445.0, + "assetBalance": 5121.0 }, { "year": 2048, @@ -1176,15 +1177,15 @@ "total": 0 }, "expenses": { - "living": 654.8000000000001, - "housing": 491.09999999999997, - "education": 245.54999999999998, - "tax": 163.70000000000002, - "event": 81.85000000000001 + "living": 181.60000000000002, + "housing": 136.2, + "education": 68.1, + "tax": 45.400000000000006, + "event": 22.700000000000003 }, - "totalExpense": 1637.0, - "netCashFlow": -1637.0, - "assetBalance": -83390.0 + "totalExpense": 454.0, + "netCashFlow": -454.0, + "assetBalance": 4820.0 }, { "year": 2049, @@ -1193,15 +1194,15 @@ "total": 0 }, "expenses": { - "living": 668.0, - "housing": 501.0, - "education": 250.5, - "tax": 167.0, - "event": 83.5 + "living": 185.20000000000002, + "housing": 138.9, + "education": 69.45, + "tax": 46.300000000000004, + "event": 23.150000000000002 }, - "totalExpense": 1670.0, - "netCashFlow": -1670.0, - "assetBalance": -97568.0 + "totalExpense": 463.0, + "netCashFlow": -463.0, + "assetBalance": 4502.0 }, { "year": 2050, @@ -1210,15 +1211,15 @@ "total": 0 }, "expenses": { - "living": 681.2, - "housing": 510.9, - "education": 255.45, - "tax": 170.3, - "event": 85.15 + "living": 188.8, + "housing": 141.6, + "education": 70.8, + "tax": 47.2, + "event": 23.6 }, - "totalExpense": 1703.0, - "netCashFlow": -1703.0, - "assetBalance": -113906.0 + "totalExpense": 472.0, + "netCashFlow": -472.0, + "assetBalance": 4164.0 }, { "year": 2051, @@ -1227,15 +1228,15 @@ "total": 0 }, "expenses": { - "living": 694.8000000000001, - "housing": 521.1, - "education": 260.55, - "tax": 173.70000000000002, - "event": 86.85000000000001 + "living": 192.8, + "housing": 144.6, + "education": 72.3, + "tax": 48.2, + "event": 24.1 }, - "totalExpense": 1737.0, - "netCashFlow": -1737.0, - "assetBalance": -132729.0 + "totalExpense": 482.0, + "netCashFlow": -482.0, + "assetBalance": 3807.0 }, { "year": 2052, @@ -1244,15 +1245,15 @@ "total": 0 }, "expenses": { - "living": 708.8000000000001, - "housing": 531.6, - "education": 265.8, - "tax": 177.20000000000002, - "event": 88.60000000000001 + "living": 196.8, + "housing": 147.6, + "education": 73.8, + "tax": 49.2, + "event": 24.6 }, - "totalExpense": 1772.0, - "netCashFlow": -1772.0, - "assetBalance": -154410.0 + "totalExpense": 492.0, + "netCashFlow": -492.0, + "assetBalance": 3430.0 }, { "year": 2053, @@ -1261,15 +1262,15 @@ "total": 0 }, "expenses": { - "living": 722.8000000000001, - "housing": 542.1, - "education": 271.05, - "tax": 180.70000000000002, - "event": 90.35000000000001 + "living": 200.4, + "housing": 150.29999999999998, + "education": 75.14999999999999, + "tax": 50.1, + "event": 25.05 }, - "totalExpense": 1807.0, - "netCashFlow": -1807.0, - "assetBalance": -179379.0 + "totalExpense": 501.0, + "netCashFlow": -501.0, + "assetBalance": 3031.0 }, { "year": 2054, @@ -1278,15 +1279,15 @@ "total": 0 }, "expenses": { - "living": 737.2, - "housing": 552.9, - "education": 276.45, - "tax": 184.3, - "event": 92.15 + "living": 204.4, + "housing": 153.29999999999998, + "education": 76.64999999999999, + "tax": 51.1, + "event": 25.55 }, - "totalExpense": 1843.0, - "netCashFlow": -1843.0, - "assetBalance": -208129.0 + "totalExpense": 511.0, + "netCashFlow": -511.0, + "assetBalance": 2611.0 }, { "year": 2055, @@ -1295,15 +1296,15 @@ "total": 0 }, "expenses": { - "living": 752.0, - "housing": 564.0, - "education": 282.0, - "tax": 188.0, - "event": 94.0 + "living": 208.8, + "housing": 156.6, + "education": 78.3, + "tax": 52.2, + "event": 26.1 }, - "totalExpense": 1880.0, - "netCashFlow": -1880.0, - "assetBalance": -241229.0 + "totalExpense": 522.0, + "netCashFlow": -522.0, + "assetBalance": 2167.0 }, { "year": 2056, @@ -1312,15 +1313,15 @@ "total": 0 }, "expenses": { - "living": 767.2, - "housing": 575.4, - "education": 287.7, - "tax": 191.8, - "event": 95.9 + "living": 212.8, + "housing": 159.6, + "education": 79.8, + "tax": 53.2, + "event": 26.6 }, - "totalExpense": 1918.0, - "netCashFlow": -1918.0, - "assetBalance": -279331.0 + "totalExpense": 532.0, + "netCashFlow": -532.0, + "assetBalance": 1700.0 }, { "year": 2057, @@ -1329,15 +1330,15 @@ "total": 0 }, "expenses": { - "living": 782.4000000000001, - "housing": 586.8, - "education": 293.4, - "tax": 195.60000000000002, - "event": 97.80000000000001 + "living": 217.20000000000002, + "housing": 162.9, + "education": 81.45, + "tax": 54.300000000000004, + "event": 27.150000000000002 }, - "totalExpense": 1956.0, - "netCashFlow": -1956.0, - "assetBalance": -323187.0 + "totalExpense": 543.0, + "netCashFlow": -543.0, + "assetBalance": 1209.0 }, { "year": 2058, @@ -1346,15 +1347,15 @@ "total": 0 }, "expenses": { - "living": 798.0, - "housing": 598.5, - "education": 299.25, - "tax": 199.5, - "event": 99.75 + "living": 221.60000000000002, + "housing": 166.2, + "education": 83.1, + "tax": 55.400000000000006, + "event": 27.700000000000003 }, - "totalExpense": 1995.0, - "netCashFlow": -1995.0, - "assetBalance": -373660.0 + "totalExpense": 554.0, + "netCashFlow": -554.0, + "assetBalance": 691.0 }, { "year": 2059, @@ -1363,15 +1364,15 @@ "total": 0 }, "expenses": { - "living": 814.0, - "housing": 610.5, - "education": 305.25, - "tax": 203.5, - "event": 101.75 + "living": 226.0, + "housing": 169.5, + "education": 84.75, + "tax": 56.5, + "event": 28.25 }, - "totalExpense": 2035.0, - "netCashFlow": -2035.0, - "assetBalance": -431744.0 + "totalExpense": 565.0, + "netCashFlow": -565.0, + "assetBalance": 147.0 }, { "year": 2060, @@ -1380,15 +1381,15 @@ "total": 0 }, "expenses": { - "living": 830.4000000000001, - "housing": 622.8, - "education": 311.4, - "tax": 207.60000000000002, - "event": 103.80000000000001 + "living": 230.4, + "housing": 172.79999999999998, + "education": 86.39999999999999, + "tax": 57.6, + "event": 28.8 }, - "totalExpense": 2076.0, - "netCashFlow": -2076.0, - "assetBalance": -498581.0 + "totalExpense": 576.0, + "netCashFlow": -576.0, + "assetBalance": -424.0 }, { "year": 2061, @@ -1397,15 +1398,15 @@ "total": 0 }, "expenses": { - "living": 846.8000000000001, - "housing": 635.1, - "education": 317.55, - "tax": 211.70000000000002, - "event": 105.85000000000001 + "living": 234.8, + "housing": 176.1, + "education": 88.05, + "tax": 58.7, + "event": 29.35 }, - "totalExpense": 2117.0, - "netCashFlow": -2117.0, - "assetBalance": -575486.0 + "totalExpense": 587.0, + "netCashFlow": -587.0, + "assetBalance": -1075.0 }, { "year": 2062, @@ -1414,15 +1415,15 @@ "total": 0 }, "expenses": { - "living": 864.0, - "housing": 648.0, - "education": 324.0, - "tax": 216.0, - "event": 108.0 + "living": 239.60000000000002, + "housing": 179.7, + "education": 89.85, + "tax": 59.900000000000006, + "event": 29.950000000000003 }, - "totalExpense": 2160.0, - "netCashFlow": -2160.0, - "assetBalance": -663969.0 + "totalExpense": 599.0, + "netCashFlow": -599.0, + "assetBalance": -1836.0 }, { "year": 2063, @@ -1431,15 +1432,15 @@ "total": 0 }, "expenses": { - "living": 881.2, - "housing": 660.9, - "education": 330.45, - "tax": 220.3, - "event": 110.15 + "living": 244.4, + "housing": 183.29999999999998, + "education": 91.64999999999999, + "tax": 61.1, + "event": 30.55 }, - "totalExpense": 2203.0, - "netCashFlow": -2203.0, - "assetBalance": -765767.0 + "totalExpense": 611.0, + "netCashFlow": -611.0, + "assetBalance": -2723.0 }, { "year": 2064, @@ -1448,15 +1449,15 @@ "total": 0 }, "expenses": { - "living": 898.8000000000001, - "housing": 674.1, - "education": 337.05, - "tax": 224.70000000000002, - "event": 112.35000000000001 + "living": 249.20000000000002, + "housing": 186.9, + "education": 93.45, + "tax": 62.300000000000004, + "event": 31.150000000000002 }, - "totalExpense": 2247.0, - "netCashFlow": -2247.0, - "assetBalance": -882879.0 + "totalExpense": 623.0, + "netCashFlow": -623.0, + "assetBalance": -3754.0 }, { "year": 2065, @@ -1465,15 +1466,15 @@ "total": 0 }, "expenses": { - "living": 916.8000000000001, - "housing": 687.6, - "education": 343.8, - "tax": 229.20000000000002, - "event": 114.60000000000001 + "living": 254.4, + "housing": 190.79999999999998, + "education": 95.39999999999999, + "tax": 63.6, + "event": 31.8 }, - "totalExpense": 2292.0, - "netCashFlow": -2292.0, - "assetBalance": -1017603.0 + "totalExpense": 636.0, + "netCashFlow": -636.0, + "assetBalance": -4954.0 }, { "year": 2066, @@ -1482,15 +1483,15 @@ "total": 0 }, "expenses": { - "living": 935.2, - "housing": 701.4, - "education": 350.7, - "tax": 233.8, - "event": 116.9 + "living": 259.6, + "housing": 194.7, + "education": 97.35, + "tax": 64.9, + "event": 32.45 }, - "totalExpense": 2338.0, - "netCashFlow": -2338.0, - "assetBalance": -1172581.0 + "totalExpense": 649.0, + "netCashFlow": -649.0, + "assetBalance": -6345.0 }, { "year": 2067, @@ -1499,15 +1500,15 @@ "total": 0 }, "expenses": { - "living": 954.0, - "housing": 715.5, - "education": 357.75, - "tax": 238.5, - "event": 119.25 + "living": 264.8, + "housing": 198.6, + "education": 99.3, + "tax": 66.2, + "event": 33.1 }, - "totalExpense": 2385.0, - "netCashFlow": -2385.0, - "assetBalance": -1350853.0 + "totalExpense": 662.0, + "netCashFlow": -662.0, + "assetBalance": -7959.0 }, { "year": 2068, @@ -1516,15 +1517,15 @@ "total": 0 }, "expenses": { - "living": 972.8000000000001, - "housing": 729.6, - "education": 364.8, - "tax": 243.20000000000002, - "event": 121.60000000000001 + "living": 270.0, + "housing": 202.5, + "education": 101.25, + "tax": 67.5, + "event": 33.75 }, - "totalExpense": 2432.0, - "netCashFlow": -2432.0, - "assetBalance": -1555913.0 + "totalExpense": 675.0, + "netCashFlow": -675.0, + "assetBalance": -9827.0 }, { "year": 2069, @@ -1533,15 +1534,15 @@ "total": 0 }, "expenses": { - "living": 992.4000000000001, - "housing": 744.3, - "education": 372.15, - "tax": 248.10000000000002, - "event": 124.05000000000001 + "living": 275.2, + "housing": 206.4, + "education": 103.2, + "tax": 68.8, + "event": 34.4 }, - "totalExpense": 2481.0, - "netCashFlow": -2481.0, - "assetBalance": -1791781.0 + "totalExpense": 688.0, + "netCashFlow": -688.0, + "assetBalance": -11990.0 }, { "year": 2070, @@ -1550,15 +1551,15 @@ "total": 0 }, "expenses": { - "living": 1012.0, - "housing": 759.0, - "education": 379.5, - "tax": 253.0, - "event": 126.5 + "living": 280.8, + "housing": 210.6, + "education": 105.3, + "tax": 70.2, + "event": 35.1 }, - "totalExpense": 2530.0, - "netCashFlow": -2530.0, - "assetBalance": -2063078.0 + "totalExpense": 702.0, + "netCashFlow": -702.0, + "assetBalance": -14490.0 }, { "year": 2071, @@ -1567,15 +1568,15 @@ "total": 0 }, "expenses": { - "living": 1032.4, - "housing": 774.3, - "education": 387.15, - "tax": 258.1, - "event": 129.05 + "living": 286.40000000000003, + "housing": 214.79999999999998, + "education": 107.39999999999999, + "tax": 71.60000000000001, + "event": 35.800000000000004 }, - "totalExpense": 2581.0, - "netCashFlow": -2581.0, - "assetBalance": -2375121.0 + "totalExpense": 716.0, + "netCashFlow": -716.0, + "assetBalance": -17380.0 }, { "year": 2072, @@ -1584,15 +1585,15 @@ "total": 0 }, "expenses": { - "living": 1053.2, - "housing": 789.9, - "education": 394.95, - "tax": 263.3, - "event": 131.65 + "living": 292.0, + "housing": 219.0, + "education": 109.5, + "tax": 73.0, + "event": 36.5 }, - "totalExpense": 2633.0, - "netCashFlow": -2633.0, - "assetBalance": -2734022.0 + "totalExpense": 730.0, + "netCashFlow": -730.0, + "assetBalance": -20717.0 }, { "year": 2073, @@ -1601,15 +1602,15 @@ "total": 0 }, "expenses": { - "living": 1074.0, - "housing": 805.5, - "education": 402.75, - "tax": 268.5, - "event": 134.25 + "living": 298.0, + "housing": 223.5, + "education": 111.75, + "tax": 74.5, + "event": 37.25 }, - "totalExpense": 2685.0, - "netCashFlow": -2685.0, - "assetBalance": -3146810.0 + "totalExpense": 745.0, + "netCashFlow": -745.0, + "assetBalance": -24570.0 }, { "year": 2074, @@ -1618,15 +1619,15 @@ "total": 0 }, "expenses": { - "living": 1095.6000000000001, - "housing": 821.6999999999999, - "education": 410.84999999999997, - "tax": 273.90000000000003, - "event": 136.95000000000002 + "living": 304.0, + "housing": 228.0, + "education": 114.0, + "tax": 76.0, + "event": 38.0 }, - "totalExpense": 2739.0, - "netCashFlow": -2739.0, - "assetBalance": -3621571.0 + "totalExpense": 760.0, + "netCashFlow": -760.0, + "assetBalance": -29015.0 }, { "year": 2075, @@ -1635,15 +1636,15 @@ "total": 0 }, "expenses": { - "living": 1117.6000000000001, - "housing": 838.1999999999999, - "education": 419.09999999999997, - "tax": 279.40000000000003, - "event": 139.70000000000002 + "living": 310.0, + "housing": 232.5, + "education": 116.25, + "tax": 77.5, + "event": 38.75 }, - "totalExpense": 2794.0, - "netCashFlow": -2794.0, - "assetBalance": -4167601.0 + "totalExpense": 775.0, + "netCashFlow": -775.0, + "assetBalance": -34143.0 }, { "year": 2076, @@ -1652,15 +1653,15 @@ "total": 0 }, "expenses": { - "living": 1140.0, - "housing": 855.0, - "education": 427.5, - "tax": 285.0, - "event": 142.5 + "living": 316.40000000000003, + "housing": 237.29999999999998, + "education": 118.64999999999999, + "tax": 79.10000000000001, + "event": 39.550000000000004 }, - "totalExpense": 2850.0, - "netCashFlow": -2850.0, - "assetBalance": -4795590.0 + "totalExpense": 791.0, + "netCashFlow": -791.0, + "assetBalance": -40055.0 }, { "year": 2077, @@ -1669,15 +1670,15 @@ "total": 0 }, "expenses": { - "living": 1162.8, - "housing": 872.1, - "education": 436.05, - "tax": 290.7, - "event": 145.35 + "living": 322.40000000000003, + "housing": 241.79999999999998, + "education": 120.89999999999999, + "tax": 80.60000000000001, + "event": 40.300000000000004 }, - "totalExpense": 2907.0, - "netCashFlow": -2907.0, - "assetBalance": -5517836.0 + "totalExpense": 806.0, + "netCashFlow": -806.0, + "assetBalance": -46870.0 }, { "year": 2078, @@ -1686,15 +1687,15 @@ "total": 0 }, "expenses": { - "living": 1186.0, - "housing": 889.5, - "education": 444.75, - "tax": 296.5, - "event": 148.25 + "living": 329.20000000000005, + "housing": 246.89999999999998, + "education": 123.44999999999999, + "tax": 82.30000000000001, + "event": 41.150000000000006 }, - "totalExpense": 2965.0, - "netCashFlow": -2965.0, - "assetBalance": -6348476.0 + "totalExpense": 823.0, + "netCashFlow": -823.0, + "assetBalance": -54723.0 } ], "meta": { @@ -1708,278 +1709,282 @@ "text": "お客様のライフプランを提供するために、お客様の基本情報をお願いいたします。 すいませんが、お客様のお名前からお願いいたします。", "insight": "ライフプランのヒアリング", "targetYear": 2024, - "duration": 10.992, + "duration": 11.136, "type": "dialogue", "visualType": "dialogue", - "visualAssetIndex": null, "speaker": "FP", - "brollKeyword": null, - "audioPath": "public/segment_001.mp3" + "brollKeyword": "Japanese financial advisor consulting client", + "audioPath": "public\\segment_001.mp3", + "brollPath": "broll/Client Consulting_4486777.mp4" }, { "id": 2, - "text": "はい、私がテスト太郎として", + "text": "はい、私がテスト太郎です", "insight": "お客様の自己紹介", "targetYear": 2024, "duration": 8.0, "type": "dialogue", "visualType": "dialogue", - "visualAssetIndex": null, "speaker": "家族代表様", - "brollKeyword": null, - "audioPath": "public/dialogue_clip_1.mp3" + "brollKeyword": "Japanese man introduced himself", + "audioPath": "public/dialogue_clip_1.mp3", + "brollPath": "broll/Self-Introduction_7958453.mp4" }, { "id": 3, "text": "家族情報として、 生年月日の方は?", "insight": "ライフプランのヒアリング", "targetYear": 2024, - "duration": 5.304, + "duration": 3.0, "type": "dialogue", "visualType": "dialogue", - "visualAssetIndex": null, "speaker": "FP", - "brollKeyword": null, - "audioPath": "public/segment_003.mp3" + "brollKeyword": "Japanese advisor asking about family", + "audioPath": "public\\segment_003.mp3", + "brollPath": "broll/Advisor Inquiring_7844849.mp4" }, { "id": 4, - "text": "はい、生年月日の方は、1980年の1月の1日です。", + "text": "1980年の1月の1日です。", "insight": "生年月日の回答", "targetYear": 2024, "duration": 9.0, "type": "dialogue", "visualType": "dialogue", - "visualAssetIndex": null, "speaker": "家族代表様", - "brollKeyword": null, - "audioPath": "public/dialogue_clip_2.mp3" + "brollKeyword": "Asian man giving his birthday", + "audioPath": "public/dialogue_clip_2.mp3", + "brollPath": "broll/Giving Birthday_5529618.mp4" }, { "id": 5, "text": "ということは、47歳ということでよろしいでしょうか。", "insight": "年齢の確認", "targetYear": 2024, - "duration": 4.392, + "duration": 4.32, "type": "dialogue", "visualType": "dialogue", - "visualAssetIndex": null, "speaker": "FP", - "brollKeyword": null, - "audioPath": "public/segment_005.mp3" + "brollKeyword": "Japanese financial planner verifying age", + "audioPath": "public\\segment_005.mp3", + "brollPath": "broll/Verifying Age_6539952.mp4" }, { "id": 6, - "text": "はい。", - "insight": "年齢の確認", + "text": "そうですね、はい。", + "insight": "年齢の确认", "targetYear": 2024, "duration": 3.0, "type": "dialogue", "visualType": "dialogue", - "visualAssetIndex": null, "speaker": "家族代表様", - "brollKeyword": null, - "audioPath": "public/dialogue_clip_3.mp3" + "brollKeyword": "Asian man nodding in agreement", + "audioPath": "public/dialogue_clip_3.mp3", + "brollPath": "broll/Nodding In Agreement_4586579.mp4" }, { "id": 7, "text": "皆様、こんにちは!ライフプランニングを通じて、皆様の夢を叶えるお手伝いをさせていただきます。", "insight": "オープニング", "targetYear": 2024, - "duration": 7.944, + "duration": 7.824, "type": "narration", "visualType": "ppt", "visualAssetIndex": 0, - "brollKeyword": "挨拶", - "audioPath": "public/segment_007.mp3" + "brollKeyword": "Japanese businessman greeting warmly", + "audioPath": "public\\segment_007.mp3", + "brollPath": "broll/Warm Greeting_3304352.mp4" }, { "id": 8, "text": "本日は、テスト太郎様、花子様ご夫婦のライフプランについて一緒に考えていきたいと思います。", "insight": "家族構成", "targetYear": 2024, - "duration": 10.32, + "duration": 7.92, "type": "narration", "visualType": "ppt", "visualAssetIndex": 1, - "brollKeyword": "家族", - "audioPath": "public/segment_008.mp3" + "brollKeyword": "Japanese family sitting together", + "audioPath": "public\\segment_008.mp3", + "brollPath": "broll/Family Gathering_5856567.mp4" }, { "id": 9, "text": "太郎様は47歳、花子様は37歳でいらっしゃいますね。息子様の年齢は7歳で、小学校は公立とのこと。教育プランも中学校から私立をご検討されているんですね。", "insight": "教育プラン", "targetYear": 2024, - "duration": 13.896, + "duration": 14.328, "type": "narration", "visualType": "ppt", "visualAssetIndex": 1, - "brollKeyword": "教育", - "audioPath": "public/segment_009.mp3" + "brollKeyword": "Japanese student studying hard", + "audioPath": "public\\segment_009.mp3", + "brollPath": "broll/Studying Hard_7958453.mp4" }, { "id": 10, "text": "太郎様の年収は703万円、花子様の年収は368万円。合計で1071万円の収入がある一方で、年間支出は1038万円とのこと。現在の資産は852万円ですね。", "insight": "家計の現状", "targetYear": 2024, - "duration": 15.816, + "duration": 15.768, "type": "narration", "visualType": "ppt", "visualAssetIndex": 1, - "brollKeyword": "家計", - "audioPath": "public/segment_010.mp3" + "brollKeyword": "Japanese couple calculating budget", + "audioPath": "public\\segment_010.mp3", + "brollPath": "broll/Budgeting Couple_7958685.mp4" }, { "id": 11, "text": "次に、今後のライフイベントについて見ていきましょう。", "insight": "ライフイベント", "targetYear": 2024, - "duration": 6.456, + "duration": 4.488, "type": "narration", "visualType": "ppt", "visualAssetIndex": 2, - "brollKeyword": "イベント", - "audioPath": "public/segment_011.mp3" + "brollKeyword": "Japanese calendar with events marked", + "audioPath": "public\\segment_011.mp3", + "brollPath": "broll/Marked Calendar_9057559.mp4" }, { "id": 12, "text": "2029年には車の交換、2032年には息子様が私立中学校へ入学されます。結婚記念日の海外旅行やリフォーム工事も予定されていますね。2053年で住宅ローンが完済するのは素晴らしいですね。", "insight": "イベントの詳細", "targetYear": 2030, - "duration": 17.904, + "duration": 18.408, "type": "narration", "visualType": "ppt", "visualAssetIndex": 2, - "brollKeyword": "イベント", - "audioPath": "public/segment_012.mp3" + "brollKeyword": "Japanese family visiting a new car", + "audioPath": "public\\segment_012.mp3", + "brollPath": "broll/Car Shopping_31980658.mp4" }, { "id": 13, "text": "将来に対する不安について、インタビューでこのように語られていました。", "insight": "お客様の声", "targetYear": 2024, - "duration": 5.005011, + "duration": 5.005, "type": "narration", "visualType": "video", "visualAssetIndex": 0, - "brollKeyword": "インタビュー" + "brollKeyword": "Japanese man talking in interview", + "brollPath": "broll/Interview Talking_4428754.mp4" }, { "id": 14, "text": "将来に対する不安について、インタビューでこのように語られていました。", "insight": "お客様の声", "targetYear": 2024, - "duration": 5.005011, + "duration": 5.005, "type": "narration", "visualType": "video", - "visualAssetIndex": 0, - "brollKeyword": "インタビュー" + "visualAssetIndex": 1, + "brollKeyword": "Japanese man explaining feelings", + "brollPath": "broll/Expressing Feelings_7957918.mp4" }, { "id": 15, "text": "それでは、今後の資産推移をシミュレーションで見てみましょう。", "insight": "シミュレーション", "targetYear": 2024, - "duration": 5.064, + "duration": 5.352, "type": "narration", "visualType": "chart", "visualAssetIndex": null, - "brollKeyword": "シミュレーション", - "audioPath": "public/segment_015.mp3" + "brollKeyword": "Japanese financial consultant showing graphs", + "audioPath": "public\\segment_015.mp3", + "brollPath": "broll/Showing Graphs_7844858.mp4" }, { "id": 16, - "text": "このグラフは、現在の収入と支出、そして将来のライフイベントを考慮した上で、資産がどのように推移していくかを予測したものです。60歳で退職されると、一時的に資産が減少しますが、年金受給開始後は安定していく見込みです。", + "text": "このグラフは、現在の収入と支出、和将来のライフイベントを考慮した上で、資産がどのように推移していくかを予測したものです。60歳で退職されると、一時的に資産が減少しますが、年金受給開始後は安定していく見込みです。", "insight": "資産推移", "targetYear": 2040, - "duration": 19.968, + "duration": 19.728, "type": "narration", "visualType": "chart", "visualAssetIndex": null, - "brollKeyword": "資産", - "audioPath": "public/segment_016.mp3" + "brollKeyword": "Japanese retired couple smiling", + "audioPath": "public\\segment_016.mp3", + "brollPath": "broll/Smiling Retirees_6761158.mp4" }, { "id": 17, "text": "最後に、今後の対策とアドバイスです。", "insight": "対策とアドバイス", "targetYear": 2024, - "duration": 5.4, + "duration": 3.24, "type": "narration", "visualType": "ppt", "visualAssetIndex": 5, - "brollKeyword": "アドバイス", - "audioPath": "public/segment_017.mp3" + "brollKeyword": "Japanese consultant pointing at document", + "audioPath": "public\\segment_017.mp3", + "brollPath": "broll/Consultant Pointing_7844849.mp4" }, { "id": 18, "text": "本日はありがとうございました。より詳細なライフプランや個別のご相談については、お気軽にお問い合わせください。", "insight": "クロージング", "targetYear": 2024, - "duration": 11.376, + "duration": 9.6, "type": "narration", "visualType": "ppt", "visualAssetIndex": 6, - "brollKeyword": "相談", - "audioPath": "public/segment_018.mp3" + "brollKeyword": "Japanese advisor bowing politely", + "audioPath": "public\\segment_018.mp3", + "brollPath": "broll/Polite Bowing_7958678.mp4" } ], "assets": { - "broll": {}, + "broll": { + "Japanese family sitting together": "Family Gathering_5856567.mp4", + "Japanese couple calculating budget": "Budgeting Couple_7958685.mp4", + "Japanese man explaining feelings": "Expressing Feelings_7957918.mp4", + "Asian man nodding in agreement": "Nodding In Agreement_4586579.mp4", + "Japanese retired couple smiling": "Smiling Retirees_6761158.mp4", + "Japanese family visiting a new car": "Car Shopping_31980658.mp4", + "Japanese consultant pointing at document": "Consultant Pointing_7844849.mp4", + "Japanese advisor asking about family": "Advisor Inquiring_7844849.mp4", + "Asian man giving his birthday": "Giving Birthday_5529618.mp4", + "Japanese businessman greeting warmly": "Warm Greeting_3304352.mp4", + "Japanese student studying hard": "Studying Hard_7958453.mp4", + "Japanese calendar with events marked": "Marked Calendar_9057559.mp4", + "Japanese financial planner verifying age": "Verifying Age_6539952.mp4", + "Japanese advisor bowing politely": "Polite Bowing_7958678.mp4", + "Japanese man introduced himself": "Self-Introduction_7958453.mp4", + "Japanese financial consultant showing graphs": "Showing Graphs_7844858.mp4", + "Japanese financial advisor consulting client": "Client Consulting_4486777.mp4", + "Japanese man talking in interview": "Interview Talking_4428754.mp4" + }, "videoClips": [ { "id": "clip_1", - "outputPath": "public\\clip_1_52.0-57.0.mp4", - "filepath": "public\\clip_1_52.0-57.0.mp4", - "start": 52.0, - "end": 57.0, + "outputPath": "public\\clip_1_13.0-18.0.mp4", + "filepath": "public\\clip_1_13.0-18.0.mp4", + "start": 13.0, + "end": 18.0, "duration": 5.0, - "description": "すいませんが、前代の、ざっくりでよろしいので、年収はどのくらいになりますでしょうか。\n[58.0s - 61.0s] 年収が今700万くらいですね。" + "description": "すいませんが、お客様のお名前からお願いいたします。\nはい、私がテストテロとして、家族情報として、\n生年月日の方は?\nはい、生年月日の方は、1980年の1月の1日です。" }, { "id": "clip_2", - "outputPath": "public\\clip_2_62.0-67.0.mp4", - "filepath": "public\\clip_2_62.0-67.0.mp4", - "start": 62.0, - "end": 67.0, + "outputPath": "public\\clip_2_52.0-57.0.mp4", + "filepath": "public\\clip_2_52.0-57.0.mp4", + "start": 52.0, + "end": 57.0, "duration": 5.0, - "description": "では、家族構成について、お客様、ご結婚はなされておりますか。\n[69.0s - 70.0s] そうですね。\n[70.0s - 71.0s] はい。\n[71.0s - 75.0s] 下の名前だけでいいの" + "description": "すいませんが、前代の、ざっくりでよろしいので、年収はどのくらいになりますでしょうか。\n年収が今700万くらいですね。" }, { "id": "clip_3", - "outputPath": "public\\clip_3_106.0-111.0.mp4", - "filepath": "public\\clip_3_106.0-111.0.mp4", - "start": 106.0, - "end": 111.0, + "outputPath": "public\\clip_3_71.0-76.0.mp4", + "filepath": "public\\clip_3_71.0-76.0.mp4", + "start": 71.0, + "end": 76.0, "duration": 5.0, - "description": "では続きまして、お子様の方はいらっしゃいますか。\n[110.0s - 112.0s] はい、います。\n[112.0s - 114.0s] 何人いらっしゃいますか。\n[114.0s - 115.0s] " - }, - { - "id": "dialogue_clip_1", - "outputPath": "public/dialogue_clip_1.mp4", - "filepath": "public/dialogue_clip_1.mp4", - "start": 27.0, - "end": 35.0, - "duration": 8.0, - "description": "はい、私がテスト太郎として..." - }, - { - "id": "dialogue_clip_2", - "outputPath": "public/dialogue_clip_2.mp4", - "filepath": "public/dialogue_clip_2.mp4", - "start": 35.0, - "end": 44.0, - "duration": 9.0, - "description": "生年月日の方は、1980年の1月の1日です。" - }, - { - "id": "dialogue_clip_3", - "outputPath": "public/dialogue_clip_3.mp4", - "filepath": "public/dialogue_clip_3.mp4", - "start": 69.0, - "end": 72.0, - "duration": 3.0, - "description": "はい。" + "description": "下の名前だけでいいので、奥様のお名前をお願いいたします。\n花子です。\nはい。奥様の生年月日を教えていただけますか。\n1990年の1月の10日です。" } ], "slides": [ diff --git a/assets/1_processed/translation_cache.json b/assets/1_processed/translation_cache.json index 390a881..ecb1079 100644 --- a/assets/1_processed/translation_cache.json +++ b/assets/1_processed/translation_cache.json @@ -26,5 +26,23 @@ "戦略": "strategy", "投資": "investment", "挨拶": "greeting", - "疑問": "question" + "疑問": "question", + "Japanese family sitting together": "family gathering", + "Japanese couple calculating budget": "budgeting couple", + "Japanese man explaining feelings": "expressing feelings", + "Asian man nodding in agreement": "nodding in agreement", + "Japanese retired couple smiling": "smiling retirees", + "Japanese family visiting a new car": "car shopping", + "Japanese consultant pointing at document": "consultant pointing", + "Japanese advisor asking about family": "advisor inquiring", + "Asian man giving his birthday": "giving birthday", + "Japanese businessman greeting warmly": "warm greeting", + "Japanese student studying hard": "studying hard", + "Japanese calendar with events marked": "marked calendar", + "Japanese financial planner verifying age": "verifying age", + "Japanese advisor bowing politely": "polite bowing", + "Japanese man introduced himself": "self-introduction", + "Japanese financial consultant showing graphs": "showing graphs", + "Japanese financial advisor consulting client": "client consulting", + "Japanese man talking in interview": "interview talking" } \ No newline at end of file diff --git a/backend/audio_generator.py b/backend/audio_generator.py index c33514d..5a72730 100644 --- a/backend/audio_generator.py +++ b/backend/audio_generator.py @@ -61,9 +61,25 @@ class AudioGenerator: text = segment["text"] is_video_clip = segment.get("type") == "video_clip" or segment.get("visualType") == "video" - # Skip TTS for video clips (keep original audio) - if is_video_clip: - print(f" ⏭️ Keeping original audio for video segment {segment_id}") + # Check if this segment should use existing audio (e.g. dialogue_clip) + current_audio_path = segment.get("audioPath", "") + is_manual_audio = "dialogue_clip" in current_audio_path + + # Skip TTS for video clips or segments with manual audio + if is_video_clip or is_manual_audio: + if is_manual_audio: + print(f" ⏭️ Keeping manual audio for segment {segment_id}: {current_audio_path}") + else: + print(f" ⏭️ Keeping original audio for video segment {segment_id}") + + # Still need to update duration if not present + if "duration" not in segment or segment["duration"] == 0: + try: + actual_duration = get_video_duration(str(current_audio_path)) + segment["duration"] = actual_duration + except: + pass + updated_segments.append(segment) continue diff --git a/backend/media_fetcher.py b/backend/media_fetcher.py index ea17442..e7ad5de 100644 --- a/backend/media_fetcher.py +++ b/backend/media_fetcher.py @@ -142,12 +142,14 @@ Example format: results = {} for jp_keyword, en_keyword in translations.items(): - print(f" 🔍 Searching Pexels for '{en_keyword}'...") + # ENHANCED: Inject explicit Japanese context for every search to avoid Caucasian subjects + search_query = f"Japanese {en_keyword} people Asian" + print(f" 🔍 Searching Pexels for '{en_keyword}' (with strong Japanese/Asian priority)...") - # Search Pexels + # Search Pexels with "Japanese" added to the query for better relevance headers = {"Authorization": self.api_key} params = { - "query": en_keyword, + "query": search_query, "per_page": max_per_keyword, "orientation": "landscape" } diff --git a/backend/rebuild_audio.py b/backend/rebuild_audio.py index 087b37e..bf2677c 100644 --- a/backend/rebuild_audio.py +++ b/backend/rebuild_audio.py @@ -1,6 +1,11 @@ import json import sys +import os from pathlib import Path +from dotenv import load_dotenv + +# Load environment variables from .env file +load_dotenv() # Add project root to sys.path to allow importing backend modules project_root = Path(__file__).parent.parent @@ -23,22 +28,33 @@ def rebuild_audio_from_props(): with open(props_path, "r", encoding="utf-8") as f: props = json.load(f) - # Prepare script data for the generator # RE-INDEX segments first print("🔢 Re-indexing script segments and fixing paths...") for i, segment in enumerate(props["script"]): new_id = i + 1 segment["id"] = new_id - if segment.get("visualType") != "video": + + # Determine if we should keep existing audio path + current_path = segment.get("audioPath", "") + is_original_clip = "dialogue_clip" in current_path + + if segment.get("visualType") == "video": + if "audioPath" in segment: + del segment["audioPath"] + elif is_original_clip: + # Keep the dialogue_clip path as is + print(f" ⏭️ Segment {new_id}: Keeping original audio path {current_path}") + pass + else: + # Assign standard naming for AI generated segments segment["audioPath"] = f"public/segment_{new_id:03d}.mp3" - elif "audioPath" in segment: - del segment["audioPath"] script_data = {"segments": props["script"]} # Generate new audio files (outputs to public/ folder) print("🎙️ Generating new audio files...") - updated_script_data = generate_audio_for_script(script_data) + updated_script_data = generate_audio_for_script(script_data, voice="fable") + # voice options: "alloy", "echo", "fable", "onyx", "nova", "shimmer" # Update the script in our props object props["script"] = updated_script_data["segments"] diff --git a/backend/scripter.py b/backend/scripter.py index 14f3589..9295654 100644 --- a/backend/scripter.py +++ b/backend/scripter.py @@ -127,11 +127,15 @@ class ScriptGenerator: 2. インタビュー内容やPDFの数値を最大限に活用し、事実に基づいた具体的な解説を行ってください。 3. 各セグメントの视覚素材(`visualType`)は、以下から適切に選択してください: - `ppt`: PPTスライドを表示する場合。`visualAssetIndex` を指定してください(基本はこちらを優先)。 + - `broll`: 抽象的なイメージ映像を表示する場合。`brollKeyword` を必ず指定してください。 - `chart`: 資産推移や収支の動的なグラフを表示する場合。シミュレーションの結果を具体的に説明するシーンで使用します。 - `video`: 本人のインタビュー映像を表示する場合。本人の肉声や想いを伝えるシーンで使用します。`visualAssetIndex` にクリップの番号を指定してください。 - - `dialogue`: 文字による対話形式(インタビューの再現)を表示する場合。動画の冒頭でインタビューのやり取りをテキストで再現する際に使用します。`speaker` 属性に話者名を指定してください。 + - `dialogue`: 文字による対話形式(インタビューの再現)を表示する場合。動画の冒端でインタビューのやり取りをテキストで再現する際に使用します。`speaker` 属性に话者名を指定してください。 4. ナレーションの中に「スライド〇〇をご覧ください」や「インタビューでもおっしゃっていた通り...」といった言葉を入れ、視聴者の視線を誘導してください。 5. 真人インタビュー(`video` タイプ)を使用する場合、ナレーションテキスト(`text` 属性)はそのクリップで本人が話している内容と一致させてください。 +6. `brollKeyword` についての指示: + - 単一の単語(例:「家族」)ではなく、**セグメントの文脈を反映した具体的な英語のフレーズ**(例:「Japanese family having dinner」、「Japanese businessman planning career」)を生成してください。 + - 人物が登場する場合は、必ず**「Japanese」または「Asian」**というキーワードをフレーズに含めてください。 【顧客情報】 - お名前: {client_name}様 @@ -170,7 +174,7 @@ class ScriptGenerator: "targetYear": 2025, "duration": 秒数, "type": "narration" | "dialogue" | "chart_intro" | "chart_highlight" | "video_clip", - "visualType": "ppt" | "video" | "chart" | "dialogue", + "visualType": "ppt" | "video" | "chart" | "dialogue" | "broll", "visualAssetIndex": 0, "speaker": "話者名", "brollKeyword": "キーワード" diff --git a/backend/update_broll.py b/backend/update_broll.py new file mode 100644 index 0000000..738d161 --- /dev/null +++ b/backend/update_broll.py @@ -0,0 +1,84 @@ +import json +import os +import sys +from pathlib import Path +from dotenv import load_dotenv + +# Add project root to sys.path +PROJECT_ROOT = Path(__file__).parent.parent +sys.path.append(str(PROJECT_ROOT)) + +from backend.media_fetcher import MediaFetcher + +def update_broll_assets(): + """ + Reads render_props.json, fetches B-Roll assets for segments that have + brollKeywords, and updates the assets.broll section. + Does NOT modify narration text. + """ + load_dotenv() + + props_path = PROJECT_ROOT / "assets" / "1_processed" / "render_props.json" + if not props_path.exists(): + print(f"❌ Error: {props_path} not found.") + return + + print(f"📖 Reading {props_path}...") + with open(props_path, "r", encoding="utf-8") as f: + props = json.load(f) + + # 1. Collect all keywords from script segments + keywords = set() + for segment in props.get("script", []): + kw = segment.get("brollKeyword") + if kw: + keywords.add(kw) + + if not keywords: + print("ℹ️ No B-Roll keywords found in script. Skipping.") + return + + print(f"🎬 Keywords found: {', '.join(keywords)}") + + # 2. Fetch assets using MediaFetcher + try: + fetcher = MediaFetcher() + # Fetch 1 video per keyword + broll_results = fetcher.fetch_broll(list(keywords), max_per_keyword=1) + + # 3. Update props["assets"]["broll"] + if "assets" not in props: + props["assets"] = {} + if "broll" not in props["assets"]: + props["assets"]["broll"] = {} + + new_broll_map = {} + for kw, videos in broll_results.items(): + if videos: + filename = Path(videos[0]["filepath"]).name + new_broll_map[kw] = filename + print(f" ✅ Mapped '{kw}' -> {filename}") + + props["assets"]["broll"].update(new_broll_map) + + # 4. Map brollPath in each segment for Remotion to use easily + # (Though Composition.tsx might already do this, we ensure consistency) + for segment in props.get("script", []): + kw = segment.get("brollKeyword") + if kw and kw in props["assets"]["broll"]: + filename = props["assets"]["broll"][kw] + segment["brollPath"] = f"broll/{filename}" + + # 5. Save + with open(props_path, "w", encoding="utf-8") as f: + json.dump(props, f, ensure_ascii=False, indent=2) + + print(f"✨ Successfully updated B-Roll assets in {props_path}") + + except Exception as e: + print(f"❌ Failed to fetch B-Roll: {e}") + import traceback + traceback.print_exc() + +if __name__ == "__main__": + update_broll_assets() diff --git a/main.py b/main.py index c6597eb..82b28c2 100644 --- a/main.py +++ b/main.py @@ -108,9 +108,9 @@ class VideoGeneratorPipeline: print("\n🎙️ Step 3.5/6: Generating audio narration...") script = self.generate_audio(script) - # Step 4: Fetch B-Roll assets (TEMPORARILY DISABLED) - print("\n🎬 Step 4/6: Fetching B-Roll assets (SKIPPED)...") - broll_assets = {} # self.fetch_broll(script, video_data) + # Step 4: Fetch B-Roll assets + print("\n🎬 Step 4/6: Fetching B-Roll assets...") + broll_assets = self.fetch_broll(script, video_data) # Step 5: Build render props print("\n📊 Step 5/6: Building render props...") @@ -225,7 +225,8 @@ class VideoGeneratorPipeline: try: # 1. Generate TTS audio for non-video segments - script_data = generate_audio_for_script(script_data, voice="alloy") + script_data = generate_audio_for_script(script_data, voice="nova") + # voice options: "alloy", "echo", "fable", "onyx", "nova", "shimmer" # 2. Sync duration for video segments with actual clip duration print(" 🎬 Syncing durations for interview video segments...") diff --git a/public/segment_001.mp3 b/public/segment_001.mp3 index e0e2895..3e91d7a 100644 Binary files a/public/segment_001.mp3 and b/public/segment_001.mp3 differ diff --git a/public/segment_002.mp3 b/public/segment_002.mp3 index ce232c0..7d857ff 100644 Binary files a/public/segment_002.mp3 and b/public/segment_002.mp3 differ diff --git a/public/segment_003.mp3 b/public/segment_003.mp3 index 72ddb28..bde393a 100644 Binary files a/public/segment_003.mp3 and b/public/segment_003.mp3 differ diff --git a/public/segment_004.mp3 b/public/segment_004.mp3 index 386518d..2562288 100644 Binary files a/public/segment_004.mp3 and b/public/segment_004.mp3 differ diff --git a/public/segment_005.mp3 b/public/segment_005.mp3 index 7e1afbb..f1f935c 100644 Binary files a/public/segment_005.mp3 and b/public/segment_005.mp3 differ diff --git a/public/segment_006.mp3 b/public/segment_006.mp3 index 46be9ea..975c022 100644 Binary files a/public/segment_006.mp3 and b/public/segment_006.mp3 differ diff --git a/public/segment_007.mp3 b/public/segment_007.mp3 index 2513d91..3d9ed6b 100644 Binary files a/public/segment_007.mp3 and b/public/segment_007.mp3 differ diff --git a/public/segment_008.mp3 b/public/segment_008.mp3 index d9a07f8..a390d19 100644 Binary files a/public/segment_008.mp3 and b/public/segment_008.mp3 differ diff --git a/public/segment_009.mp3 b/public/segment_009.mp3 index 0765496..12d058d 100644 Binary files a/public/segment_009.mp3 and b/public/segment_009.mp3 differ diff --git a/public/segment_010.mp3 b/public/segment_010.mp3 index 7771c52..8bbd43f 100644 Binary files a/public/segment_010.mp3 and b/public/segment_010.mp3 differ diff --git a/public/segment_011.mp3 b/public/segment_011.mp3 index b0f6fa3..21e367a 100644 Binary files a/public/segment_011.mp3 and b/public/segment_011.mp3 differ diff --git a/public/segment_012.mp3 b/public/segment_012.mp3 index a9cfc83..eda0941 100644 Binary files a/public/segment_012.mp3 and b/public/segment_012.mp3 differ diff --git a/public/segment_013.mp3 b/public/segment_013.mp3 index d4470cd..1fdde1f 100644 Binary files a/public/segment_013.mp3 and b/public/segment_013.mp3 differ diff --git a/public/segment_014.mp3 b/public/segment_014.mp3 index c662946..e351fd3 100644 Binary files a/public/segment_014.mp3 and b/public/segment_014.mp3 differ diff --git a/public/segment_015.mp3 b/public/segment_015.mp3 index b511ef5..f7326c0 100644 Binary files a/public/segment_015.mp3 and b/public/segment_015.mp3 differ diff --git a/public/segment_016.mp3 b/public/segment_016.mp3 index fabd9c5..e55154d 100644 Binary files a/public/segment_016.mp3 and b/public/segment_016.mp3 differ diff --git a/public/segment_017.mp3 b/public/segment_017.mp3 index 5dd1e30..4248aa8 100644 Binary files a/public/segment_017.mp3 and b/public/segment_017.mp3 differ diff --git a/public/segment_018.mp3 b/public/segment_018.mp3 index e7a6af8..9c307dd 100644 Binary files a/public/segment_018.mp3 and b/public/segment_018.mp3 differ diff --git a/public/slide_001.png b/public/slide_001.png index 8f6bce1..e0349f7 100644 Binary files a/public/slide_001.png and b/public/slide_001.png differ diff --git a/public/slide_002.png b/public/slide_002.png index 3cb1d60..0bf4e2e 100644 Binary files a/public/slide_002.png and b/public/slide_002.png differ diff --git a/public/slide_003.png b/public/slide_003.png index 7f2b068..908396e 100644 Binary files a/public/slide_003.png and b/public/slide_003.png differ diff --git a/public/slide_004.png b/public/slide_004.png index fb46bab..1fe76b7 100644 Binary files a/public/slide_004.png and b/public/slide_004.png differ diff --git a/public/slide_005.png b/public/slide_005.png index e50bf3e..e53ef82 100644 Binary files a/public/slide_005.png and b/public/slide_005.png differ diff --git a/public/slide_006.png b/public/slide_006.png index bc035c6..6003de6 100644 Binary files a/public/slide_006.png and b/public/slide_006.png differ diff --git a/public/slide_007.png b/public/slide_007.png index 8660b03..6cfa425 100644 Binary files a/public/slide_007.png and b/public/slide_007.png differ diff --git a/src/Composition.tsx b/src/Composition.tsx index 959506c..a67bc20 100644 --- a/src/Composition.tsx +++ b/src/Composition.tsx @@ -200,6 +200,77 @@ const SyncedSubtitles: React.FC<{ text: string; durationInFrames: number }> = ({ ); }; +// Helper component for B-Roll display in a dedicated space +const BRollWindow: React.FC<{ src: string; durationInFrames: number }> = ({ src, durationInFrames }) => { + const frame = useCurrentFrame(); + + const opacity = interpolate( + frame, + [0, 15, durationInFrames - 15, durationInFrames], + [0, 1, 1, 0], + { extrapolateLeft: "clamp", extrapolateRight: "clamp" } + ); + + const scale = interpolate( + frame, + [0, durationInFrames], + [1.1, 1.0], + { easing: Easing.out(Easing.quad) } + ); + + return ( +
+
+ + {/* Decorative element to give it a 'playing space' feel */} +
+
+ SCENE FOOTAGE +
+
+
+ ); +}; + export const MainVideo: React.FC = (props) => { const { charts, script, meta, assets } = props; const frame = useCurrentFrame(); @@ -233,14 +304,16 @@ export const MainVideo: React.FC = (props) => { else visualType = "ppt"; } + let brollPath = segment.brollPath || null; let visualAssetIndex = -1; - let brollPath = null; - if (visualType === "broll" && segment.brollKeyword && brollMap[segment.brollKeyword]) { - // Ensure no leading slash or "public/" prefix, brollMap usually contains just the filename + // If brollPath is missing but keyword exists, try to resolve it + if (!brollPath && segment.brollKeyword && brollMap[segment.brollKeyword]) { const filename = brollMap[segment.brollKeyword].split(/[\\/]/).pop(); brollPath = `broll/${filename}`; - } else if (typeof segment.visualAssetIndex === 'number') { + } + + if (typeof segment.visualAssetIndex === 'number') { visualAssetIndex = segment.visualAssetIndex; } else if (typeof segment.slideIndex === 'number') { visualAssetIndex = segment.slideIndex; @@ -276,15 +349,23 @@ export const MainVideo: React.FC = (props) => { return ( - {/* 2.5 Dynamic Chart Layer: Rendered outside the Sequence loop to prevent animation reset */} + {/* Layer 1: Background Gradient (z-index: 1) */} + + + {/* Layer 2: Dynamic Chart Layer (z-index: 3) - Continuous animation without reset */}
{charts?.cashFlow ? ( @@ -304,90 +385,106 @@ export const MainVideo: React.FC = (props) => { {/* Render each script segment as a Sequence */} {timeline.map((segment: any, sIdx: number) => { + const hasBroll = segment.brollPath && segment.visualType !== "video"; + return ( - {/* 1. Global Background: Light gradient (B-Roll disabled for now) */} + {/* Layer 3: Main Flex Grid (z-index: 5) - Ensures NO OVERLAP between content blocks */} - - {/* 2. Main Area: PPT Slide or Video Clip (Shrunk and offset to the right) */} - - {segment.visualType === "ppt" && ( - = 0 && slides[segment.visualAssetIndex] - ? staticFile(slides[segment.visualAssetIndex].image_path.replace(/^[\/\\]?public[\/\\]/, "").replace(/^[\/\\]/, "").split(/[\\/]/).pop() || "") - : null} - durationInFrames={segment.durationInFrames} - /> - )} + {/* Left Column (320px) - Reserved for Key Insights */} +
- {/* In B-Roll mode, we show the video in the main area too but with focus */} - {segment.visualType === "broll" && segment.brollPath && ( -
- + {segment.visualType === "ppt" && ( + = 0 && slides[segment.visualAssetIndex] + ? staticFile(slides[segment.visualAssetIndex].image_path.replace(/^[\/\\]?public[\/\\]/, "").replace(/^[\/\\]/, "").split(/[\\/]/).pop() || "") + : null} + durationInFrames={segment.durationInFrames} + /> + )} + + {segment.visualType === "dialogue" && ( + + )} + + {segment.visualType === "video" && segment.visualAssetIndex >= 0 && videoClips[segment.visualAssetIndex] && ( +
+
+ )} +
+ + {/* Right Column (400px) - B-Roll Footage */} + {hasBroll ? ( +
+
- )} - - {/* Chart Render - Removed from here to move to Global Layer for continuous animation */} - - {/* Video Clip Render */} - {segment.visualType === "video" && segment.visualAssetIndex >= 0 && videoClips[segment.visualAssetIndex] && ( -
-
- )} - - {/* Dialogue Render */} - {segment.visualType === "dialogue" && ( - + ) : ( +
// Spacer )} - {/* Floating Insight (Prioritize manual 'insight' field, fallback to auto-extraction) */} + {/* Layer 4: Floating Insight Overlay (z-index: 10) */} {(segment.insight || sIdx % 2 === 0) && ( - + + + )} - {/* Audio narration (if available) */} - {segment.audioPath && ( -