{"slug":"agents365-ai-video-podcast-maker-23c145","title":"\u77e5\u8bc6\u89c6\u9891\u64ad\u5ba2\u5236\u4f5c\u6d41\u6c34\u7ebf","description":"\u4ece\u9009\u9898\u3001\u7814\u7a76\u3001\u811a\u672c\u3001TTS\u3001Remotion \u5408\u6210\u5230 4K \u6e32\u67d3\u4e0e BGM \u6df7\u97f3\u7684\u5b8c\u6574\u77e5\u8bc6\u89c6\u9891\u5236\u4f5c\u65b9\u6cd5\uff0c\u542b\u5206\u9636\u6bb5\u53c2\u8003\u6587\u6863\u3001\u7ec4\u4ef6\u6a21\u677f\u3001\u65f6\u95f4\u8f74\u5bf9\u9f50\u4e0e\u4ea7\u7269\u6821\u9a8c\u811a\u672c\u3002\u9002\u7528\u4e8e\u6a2a\u5c4f\u77e5\u8bc6\u8bb2\u89e3\u4e0e\u7ad6\u5c4f\u5207\u7247\uff0c\u9700\u672c\u5730 Python\u3001Node\u3001FFmpeg \u4e0e TTS \u540e\u7aef\u3002","category":"\u526a\u8f91\u4e0e\u5305\u88c5","tags":["Agents365-ai","\u526a\u8f91\u4e0e\u5305\u88c5"],"author":"Agents365-ai","source_url":"https://github.com/Agents365-ai/video-podcast-maker/blob/33b8078e3e87c9626d39d144b4c901b4ebf16f74/skills/video-podcast-maker/SKILL.md","license":"MIT","status":"published","verification":"source_reviewed","verification_notes":"\u5df2\u6838\u5bf9\u539f\u59cb\u4ed3\u5e93\u3001\u56fa\u5b9a\u63d0\u4ea4\u3001\u8bb8\u53ef\u3001\u6280\u80fd\u6b63\u6587\u4e0e\u5305\u7ed3\u6784\uff0c\u5e76\u8865\u5145\u4e2d\u6587\u6267\u884c\u9a8c\u6536\u8bf4\u660e\uff1b\u672a\u8fd0\u884c\u5305\u5185\u811a\u672c\u3002","revision":"57dd7d879f864dcd9d5ceb8b19113168","created_at":"2026-11-02T14:47:08+00:00","updated_at":"2026-11-02T14:47:08+00:00","source_repo":"Agents365-ai/video-podcast-maker","source_path":"skills/video-podcast-maker/SKILL.md","source_commit":"33b8078e3e87c9626d39d144b4c901b4ebf16f74","source_updated_at":"2026-11-02T14:46:04+00:00","stars":0,"proxy_score":null,"score":null,"grade":null,"dimensions":{},"evaluation":{},"installs":0,"platforms":[],"formats":[],"category_slug":"packaging","category_name":"\u526a\u8f91\u4e0e\u5305\u88c5","quality":{"review_type":"text_and_package_review","readiness":"requires_setup","reviewed_at":"2026-11-02T14:46:04+00:00","review_summary":"\u65b9\u6cd5\u94fe\u6761\u5b8c\u6574\u3001\u9636\u6bb5\u6587\u6863\u4e0e\u6821\u9a8c\u811a\u672c\u9f50\u5907\uff0c\u5c5e\u53ef\u76f4\u63a5\u6307\u5bfc\u751f\u4ea7\u7684\u9ad8\u4ef7\u503c\u6280\u80fd\uff1b\u4f46\u9700\u7528\u6237\u81ea\u5907 Node/FFmpeg/Chromium \u4e0e TTS \u540e\u7aef\uff0c\u4e14\u5916\u90e8\u4f9d\u8d56 remotion-best-practices \u672a\u968f\u5305\u63d0\u4f9b\uff0c\u6b65\u9aa4\u7f16\u53f7\u4e0e\u5fc5\u9700\u73af\u5883\u53d8\u91cf\u8868\u8ff0\u5b58\u5728\u4e0d\u4e00\u81f4\uff0c\u9700\u5148\u8865\u9f50\u73af\u5883\u518d\u6267\u884c\u3002","cost_notes":"edge \u540e\u7aef\u514d\u8d39\uff1bAzure \u8bed\u97f3\u6309\u5fae\u8f6f\u8ba1\u8d39\uff0c\u9700\u7528\u6237\u81ea\u884c\u786e\u8ba4\u989d\u5ea6\u4e0e\u4ef7\u683c\u3002npm \u4f9d\u8d56\u4e0e Chrome \u4e0b\u8f7d\u5360\u7528\u78c1\u76d8\u4e0e\u5e26\u5bbd\u3002\u5305\u5185\u672a\u7ed9\u51fa\u4efb\u4f55\u62a5\u4ef7\u3002","source_sha256":"367cca15731a8474e630f2dd77cb8c7ddac9c8c8b484cabd9b83490751f7010a","prerequisites":["python3 \u4e0e requirements.txt \u4e2d\u7684\u4f9d\u8d56","node/npx \u4e0e\u53ef\u7528\u7684 Chromium/Chrome headless","ffmpeg","TTS \u540e\u7aef\uff1aedge-tts\uff08\u514d\u5bc6\u94a5\uff09\u6216 Azure Speech SDK \u53ca\u7528\u6237\u81ea\u5907\u7684 AZURE_SPEECH_KEY\u3001AZURE_SPEECH_REGION","\u53ef\u9009\uff1aremotion-best-practices \u6280\u80fd\u3001assetseeker/imagencn/videogencn \u7d20\u6750\u6280\u80fd","\u9996\u6b21\u5efa Remotion \u9879\u76ee\u9700\u4e0b\u8f7d\u7ea6 2.2GB npm \u5305\u4e0e\u7ea6 90MB Chrome headless shell\uff08\u6309\u5305\u5185\u8bf4\u660e\uff0c\u672a\u5b9e\u6d4b\uff09"],"checks":["timing.json \u7684 total_duration \u4e0e podcast_audio.wav \u5b9e\u9645\u65f6\u957f\u5dee\u5728 \u00b10.5s \u5185\uff0c\u4e14\u5404\u8282\u65f6\u95f4\u6765\u81ea\u771f\u5b9e TTS \u800c\u975e\u624b\u5199\u4f30\u7b97","Video.tsx \u5bf9 TransitionSeries \u7684\u91cd\u53e0\u5e27\u505a\u4e86\u6309\u6bd4\u4f8b\u7f29\u653e\uff0c\u6e32\u67d3\u603b\u5e27\u6570\u7b49\u4e8e timing.total_frames","output.mp4 \u4e3a 3840\u00d72160\u300130fps\uff0c\u97f3\u8f68\u5b58\u5728\u4e14\u4e0e\u65c1\u767d\u5bf9\u9f50\uff0c\u62bd\u67e5\u65e0\u9ed1\u5e27","16:9 \u4e0e 4:3 \u4e24\u5f20\u7f29\u7565\u56fe\u5747\u5df2\u751f\u6210\u4e14\u843d\u5728 videos/{name}/ \u5185","verify_output.py \u9000\u51fa\u7801\u4e3a 0\uff0c\u6216\u4e3a 2 \u4e14\u9010\u6761\u590d\u6838\u8fc7\u544a\u8b66\uff1bpublish_info.md \u542b\u6807\u9898\u3001\u7b80\u4ecb\u3001\u6807\u7b7e\u3001\u7ae0\u8282"],"limitations":["\u5305\u5185\u811a\u672c\u4e0e\u6a21\u677f\u672a\u5728\u672c\u5ba1\u9605\u4e2d\u8fd0\u884c\uff0c\u6e32\u67d3\u53ef\u884c\u6027\u3001\u4f9d\u8d56\u7248\u672c\u517c\u5bb9\u6027\u4e0e\u5b9e\u9645\u753b\u8d28\u5747\u672a\u9a8c\u8bc1","\u4f9d\u8d56\u5916\u90e8\u6280\u80fd remotion-best-practices \u4e0e\u53ef\u9009\u7d20\u6750\u6280\u80fd\uff0c\u672a\u968f\u5305\u63d0\u4f9b\uff0c\u7f3a\u5931\u65f6\u53ea\u80fd\u6309 SKILL.md \u7684\u6700\u4f4e\u89c4\u5219\u6267\u884c","\u4ec5\u5185\u7f6e edge \u4e0e azure \u4e24\u4e2a TTS \u540e\u7aef\uff0c\u5176\u4ed6\u8bed\u97f3\u5e73\u53f0\u9700\u53e6\u884c\u5b89\u88c5 ttsCN \u5e76\u81ea\u884c\u8c03\u7528","4K \u6e32\u67d3\u8017\u65f6\u957f\u4e14\u5360\u78c1\u76d8\uff0c\u5305\u5185\u672a\u7ed9\u51fa\u5b9e\u6d4b\u8017\u65f6\u6216\u8d44\u6e90\u5360\u7528\u6570\u636e"],"issues":["SKILL.md \u58f0\u660e\u4f9d\u8d56 remotion-best-practices\uff0c\u4f46\u8be5\u6280\u80fd\u4e0d\u5728\u5305\u5185\uff0c\u5c5e\u5916\u90e8\u4f9d\u8d56\uff0c\u9700\u7528\u6237\u81ea\u884c\u5b89\u88c5","SKILL.md \u63d0\u5230\u300cSteps 5.5 \u548c 10.2\u300d\u751f\u6210 publish_info\uff0c\u4f46\u5de5\u4f5c\u6d41\u8868\u4e2d\u672a\u5217\u51fa 5.5 \u4e0e 10.2 \u6b65\u9aa4\uff0c\u6b65\u9aa4\u7f16\u53f7\u5b58\u5728\u4e0d\u4e00\u81f4\uff0c\u5f85\u6838\u5b9e","metadata \u4e2d openclaw.requires.env \u628a AZURE_SPEECH_KEY/REGION \u5217\u4e3a\u5fc5\u9700\uff0c\u800c\u6b63\u6587\u79f0 edge \u4e3a\u9ed8\u8ba4\u514d\u5bc6\u94a5\u540e\u7aef\uff0c\u4e24\u5904\u8868\u8ff0\u51b2\u7a81","SKILL.md \u79f0\u300cThis skill performs no update checks\u300d\uff0c\u4f46\u66f4\u65b0\u65b9\u5f0f\u4f9d\u8d56\u5916\u90e8 skills CLI\uff0c\u5c5e\u5305\u5916\u6d41\u7a0b"],"missing_files":[]},"quality_url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/SHILIU-QUALITY.md","usage_guide":{"task":"\u628a\u7528\u6237\u7ed9\u5b9a\u4e3b\u9898\u505a\u6210\u5e26\u65c1\u767d\u3001\u5b57\u5e55\u3001\u52a8\u753b\u5206\u955c\u4e0e\u80cc\u666f\u97f3\u4e50\u7684\u77e5\u8bc6\u8bb2\u89e3\u89c6\u9891\uff0c\u5e76\u5728\u6e32\u67d3\u524d\u7ecf Studio \u9884\u89c8\u786e\u8ba4\u3001\u6e32\u67d3\u540e\u6821\u9a8c\u97f3\u753b\u540c\u6b65\u4e0e\u4ea7\u7269\u5b8c\u6574\u6027\u3002","inputs":"\u4e3b\u9898\u6216\u9009\u9898\u65b9\u5411\uff1b\u76ee\u6807\u5e73\u53f0\u4e0e\u65f6\u957f\uff1b\u65c1\u767d\u8bed\u8a00\u4e0e\u97f3\u8272\u504f\u597d\uff1b\u53ef\u9009\u53c2\u8003\u89c6\u9891/\u56fe\u7247\u7528\u4e8e\u98ce\u683c\u5b66\u4e60\uff1b\u672c\u5730\u5df2\u88c5 python3\u3001node/npx\u3001ffmpeg \u4e0e Chromium\uff1bTTS \u540e\u7aef\u9009\u62e9\uff08edge \u514d\u5bc6\u94a5\uff0cazure \u9700\u7528\u6237\u81ea\u5907 AZURE_SPEECH_KEY \u4e0e AZURE_SPEECH_REGION\uff09\uff1b\u53ef\u590d\u7528\u7684 Remotion \u9879\u76ee\u76ee\u5f55\u3002","outputs":"videos/{name}/ \u4e0b\u7684 topic_definition.md\u3001topic_research.md\u3001podcast.txt\u3001phonemes.json\u3001assets/manifest.json\u3001podcast_audio.wav\u3001podcast_audio.srt\u3001timing.json\u300116:9 \u4e0e 4:3 \u7f29\u7565\u56fe\u3001output.mp4\u3001video_with_bgm.mp4\u3001final_video.mp4\u3001publish_info.md\uff0c\u4ee5\u53ca\u53ef\u9009\u7684 shorts/ \u7ad6\u5c4f\u5207\u7247\uff1bverify_output.py \u7684\u6821\u9a8c\u7ed3\u679c\u3002","example_input":"\u4e3b\u9898\uff1a\u7ed9\u975e\u6280\u672f\u8bfb\u8005\u8bb2\u6e05\u695a\u300c\u5411\u91cf\u6570\u636e\u5e93\u662f\u4ec0\u4e48\u3001\u4ec0\u4e48\u65f6\u5019\u8be5\u7528\u300d\u3002\u76ee\u6807\u5e73\u53f0 B \u7ad9\u6a2a\u5c4f\uff0c\u65f6\u957f 6-8 \u5206\u949f\uff0c\u4e2d\u6587\u65c1\u767d\uff0c\u7528 edge \u540e\u7aef\uff0c\u98ce\u683c\u504f\u7b80\u6d01\u4fe1\u606f\u56fe\u3002\u8bf7\u5148\u51fa\u9009\u9898\u5b9a\u4e49\u548c\u7814\u7a76\u7b14\u8bb0\uff0c\u518d\u5199\u65c1\u767d\u811a\u672c\uff0c\u6e32\u67d3\u524d\u7ed9\u6211 Studio \u9884\u89c8\u3002","example_output":"\u793a\u610f\uff08\u975e\u771f\u5b9e\u8fd0\u884c\u7ed3\u679c\uff09\uff1avideos/vector-db-intro/ \u76ee\u5f55\u4e0b\u751f\u6210 topic_definition.md\uff08\u53d7\u4f17\u3001\u6838\u5fc3\u95ee\u9898\u3001\u8fb9\u754c\uff09\u3001topic_research.md\uff08\u6765\u6e90\u6e05\u5355\u4e0e\u5f85\u6838\u5b9e\u9879\uff09\u3001podcast.txt\uff08\u5206 6 \u8282\u65c1\u767d\uff09\u3001timing.json\uff08\u5404\u8282\u8d77\u6b62\u5e27\uff0c\u6765\u81ea\u771f\u5b9e TTS\uff09\u3001thumbnail_remotion_16x9.png \u4e0e _4x3.png\u3001output.mp4\uff083840\u00d72160\uff09\u3001video_with_bgm.mp4\u3001final_video.mp4\u3001publish_info.md\uff08\u6807\u9898/\u7b80\u4ecb/\u6807\u7b7e/\u7ae0\u8282\uff09\uff0c\u5e76\u9644 verify_output.py \u7684\u9000\u51fa\u7801\u4e0e\u544a\u8b66\u6e05\u5355\u3002"},"read_url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145","skill_url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/SKILL.md","download_url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/download","install_url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/install","files":[{"path":".env.example","bytes":662,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/.env.example"},{"path":"AGENTS.md","bytes":1657,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/AGENTS.md"},{"path":"LICENSE","bytes":1069,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/LICENSE"},{"path":"SHILIU-QUALITY.md","bytes":2839,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/SHILIU-QUALITY.md"},{"path":"SKILL.md","bytes":19756,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/SKILL.md"},{"path":"assets/bilibili-triple-black.mp4","bytes":1410793,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/assets/bilibili-triple-black.mp4"},{"path":"assets/bilibili-triple-white.mp4","bytes":1444246,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/assets/bilibili-triple-white.mp4"},{"path":"assets/perfect-beauty-191271.mp3","bytes":7048364,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/assets/perfect-beauty-191271.mp3"},{"path":"assets/snow-stevekaldes-piano-397491.mp3","bytes":2465324,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/assets/snow-stevekaldes-piano-397491.mp3"},{"path":"package.json","bytes":1105,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/package.json"},{"path":"phonemes.template.json","bytes":9839,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/phonemes.template.json"},{"path":"prefs_schema.json","bytes":16931,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/prefs_schema.json"},{"path":"references/design-guide.md","bytes":20674,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/references/design-guide.md"},{"path":"references/design-learning.md","bytes":3769,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/references/design-learning.md"},{"path":"references/natural-narration.md","bytes":8900,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/references/natural-narration.md"},{"path":"references/platform-matrix.md","bytes":4126,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/references/platform-matrix.md"},{"path":"references/script-polish.md","bytes":15585,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/references/script-polish.md"},{"path":"references/troubleshooting.md","bytes":20000,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/references/troubleshooting.md"},{"path":"references/visual-taste.md","bytes":11732,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/references/visual-taste.md"},{"path":"references/workflow-assets.md","bytes":14020,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/references/workflow-assets.md"},{"path":"references/workflow-production.md","bytes":24863,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/references/workflow-production.md"},{"path":"references/workflow-publish.md","bytes":10387,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/references/workflow-publish.md"},{"path":"references/workflow-script.md","bytes":16873,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/references/workflow-script.md"},{"path":"references/zh-polyphones.md","bytes":3437,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/references/zh-polyphones.md"},{"path":"requirements.txt","bytes":344,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/requirements.txt"},{"path":"scripts/_state.py","bytes":3242,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/scripts/_state.py"},{"path":"scripts/align_timing_from_srt.py","bytes":22392,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/scripts/align_timing_from_srt.py"},{"path":"scripts/assets.py","bytes":15728,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/scripts/assets.py"},{"path":"scripts/audit_beat_sync.py","bytes":15905,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/scripts/audit_beat_sync.py"},{"path":"scripts/audit_components.py","bytes":4479,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/scripts/audit_components.py"},{"path":"scripts/check_prereqs.py","bytes":6383,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/scripts/check_prereqs.py"},{"path":"scripts/cli.py","bytes":13700,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/scripts/cli.py"},{"path":"scripts/cli_envelope.py","bytes":5237,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/scripts/cli_envelope.py"},{"path":"scripts/components.py","bytes":8380,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/scripts/components.py"},{"path":"scripts/generate_shorts.py","bytes":15757,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/scripts/generate_shorts.py"},{"path":"scripts/generate_tts.py","bytes":20695,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/scripts/generate_tts.py"},{"path":"scripts/get_pref.py","bytes":2254,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/scripts/get_pref.py"},{"path":"scripts/learn_design.py","bytes":40128,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/scripts/learn_design.py"},{"path":"scripts/migrate_prefs.py","bytes":7877,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/scripts/migrate_prefs.py"},{"path":"scripts/resolve_backend.py","bytes":264,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/scripts/resolve_backend.py"},{"path":"scripts/resolve_bgm_path.py","bytes":1330,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/scripts/resolve_bgm_path.py"},{"path":"scripts/tts/__init__.py","bytes":43,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/scripts/tts/__init__.py"},{"path":"scripts/tts/backends/__init__.py","bytes":4691,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/scripts/tts/backends/__init__.py"},{"path":"scripts/tts/backends/base.py","bytes":879,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/scripts/tts/backends/base.py"},{"path":"scripts/tts/backends/native.py","bytes":20205,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/scripts/tts/backends/native.py"},{"path":"scripts/tts/markers.py","bytes":1549,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/scripts/tts/markers.py"},{"path":"scripts/tts/phonemes.py","bytes":5036,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/scripts/tts/phonemes.py"},{"path":"scripts/tts/sections.py","bytes":8262,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/scripts/tts/sections.py"},{"path":"scripts/tts/srt.py","bytes":7370,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/scripts/tts/srt.py"},{"path":"scripts/tts/voice_advisor.py","bytes":5236,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/scripts/tts/voice_advisor.py"},{"path":"scripts/verify_output.py","bytes":33372,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/scripts/verify_output.py"},{"path":"shiliu-quality.json","bytes":2747,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/shiliu-quality.json"},{"path":"shiliu-source.json","bytes":288,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/shiliu-source.json"},{"path":"templates/README.md","bytes":4383,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/README.md"},{"path":"templates/Root.tsx","bytes":7396,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/Root.tsx"},{"path":"templates/ShortVideo.tsx","bytes":5138,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/ShortVideo.tsx"},{"path":"templates/Thumbnail.tsx","bytes":2749,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/Thumbnail.tsx"},{"path":"templates/Video.en.tsx","bytes":14919,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/Video.en.tsx"},{"path":"templates/Video.tsx","bytes":15102,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/Video.tsx"},{"path":"templates/components/AnimatedBackground.tsx","bytes":6759,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/components/AnimatedBackground.tsx"},{"path":"templates/components/AssetImage.tsx","bytes":2228,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/components/AssetImage.tsx"},{"path":"templates/components/AssetVideo.tsx","bytes":2022,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/components/AssetVideo.tsx"},{"path":"templates/components/AudioWaveform.tsx","bytes":3727,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/components/AudioWaveform.tsx"},{"path":"templates/components/ChapterProgressBar.tsx","bytes":3200,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/components/ChapterProgressBar.tsx"},{"path":"templates/components/CodeBlock.tsx","bytes":1893,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/components/CodeBlock.tsx"},{"path":"templates/components/ComparisonCard.tsx","bytes":2630,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/components/ComparisonCard.tsx"},{"path":"templates/components/DataBar.tsx","bytes":2151,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/components/DataBar.tsx"},{"path":"templates/components/DataTable.tsx","bytes":2414,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/components/DataTable.tsx"},{"path":"templates/components/DiagramReveal.tsx","bytes":13092,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/components/DiagramReveal.tsx"},{"path":"templates/components/ErrorBoundary.tsx","bytes":1530,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/components/ErrorBoundary.tsx"},{"path":"templates/components/FeatureGrid.tsx","bytes":2485,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/components/FeatureGrid.tsx"},{"path":"templates/components/FlowChart.tsx","bytes":4720,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/components/FlowChart.tsx"},{"path":"templates/components/Icon.tsx","bytes":2184,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/components/Icon.tsx"},{"path":"templates/components/IconCard.tsx","bytes":1682,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/components/IconCard.tsx"},{"path":"templates/components/LottieAnimation.tsx","bytes":3372,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/components/LottieAnimation.tsx"},{"path":"templates/components/MediaSection.tsx","bytes":3179,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/components/MediaSection.tsx"},{"path":"templates/components/OverlayLayer.tsx","bytes":1209,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/components/OverlayLayer.tsx"},{"path":"templates/components/QuoteBlock.tsx","bytes":1838,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/components/QuoteBlock.tsx"},{"path":"templates/components/SectionLayouts.tsx","bytes":18709,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/components/SectionLayouts.tsx"},{"path":"templates/components/ShortCTACard.tsx","bytes":1198,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/components/ShortCTACard.tsx"},{"path":"templates/components/ShortIntroCard.tsx","bytes":1362,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/components/ShortIntroCard.tsx"},{"path":"templates/components/StatCounter.tsx","bytes":2276,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/components/StatCounter.tsx"},{"path":"templates/components/Subtitles.tsx","bytes":5833,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/components/Subtitles.tsx"},{"path":"templates/components/Timeline.tsx","bytes":4448,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/components/Timeline.tsx"},{"path":"templates/components/animations.tsx","bytes":7873,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/components/animations.tsx"},{"path":"templates/components/iconMap.ts","bytes":4269,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/components/iconMap.ts"},{"path":"templates/components/index.ts","bytes":2303,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/components/index.ts"},{"path":"templates/components/layouts.tsx","bytes":1640,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/components/layouts.tsx"},{"path":"templates/components/useAssets.ts","bytes":2896,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/components/useAssets.ts"},{"path":"templates/components/useTiming.ts","bytes":2694,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/components/useTiming.ts"},{"path":"templates/podcast.txt","bytes":1783,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/podcast.txt"},{"path":"templates/podcast_en.txt","bytes":1735,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/podcast_en.txt"},{"path":"templates/podcast_zh.txt","bytes":1929,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/podcast_zh.txt"},{"path":"templates/presets/kinetic-typography/README.md","bytes":3919,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/presets/kinetic-typography/README.md"},{"path":"templates/presets/kinetic-typography/Thumbnail.tsx.template","bytes":4348,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/presets/kinetic-typography/Thumbnail.tsx.template"},{"path":"templates/presets/kinetic-typography/Video.tsx.template","bytes":16420,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/presets/kinetic-typography/Video.tsx.template"},{"path":"templates/presets/kinetic-typography/colors.json","bytes":1749,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/presets/kinetic-typography/colors.json"},{"path":"templates/presets/kinetic-typography/motion.json","bytes":796,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/presets/kinetic-typography/motion.json"},{"path":"templates/presets/kinetic-typography/voice.json","bytes":931,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/presets/kinetic-typography/voice.json"},{"path":"templates/remotion.config.ts","bytes":117,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/templates/remotion.config.ts"},{"path":"tsconfig.json","bytes":337,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/tsconfig.json"},{"path":"tsconfig.templates.json","bytes":188,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/tsconfig.templates.json"},{"path":"usage.json","bytes":1714,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/usage.json"},{"path":"user_prefs.template.json","bytes":3496,"url":"https://shiliuai.cn/api/v2/skills/agents365-ai-video-podcast-maker-23c145/files/user_prefs.template.json"}],"content":"---\nname: video-podcast-maker\ndescription: Use when the user gives a topic and wants an automated topic-driven narrated explainer, podcast, or knowledge-summary video (Bilibili / YouTube / Xiaohongshu / Douyin / WeChat Channels), or asks to learn visual design patterns from a reference video/image. Trigger when the user mentions creating a knowledge video, narrated explainer, video podcast, or animated infographic-style video from a topic \u2014 even if they don't say \"video podcast\" explicitly. Also trigger when the user wants to regenerate, re-render, rebuild, update, or iterate on a narrated video this skill already produced \u2014 e.g. they edited the script/prompt, changed the visuals, or swapped the background music and want the final video remade (reuse the existing videos/{name}/ directory, never start a new project). Do NOT trigger for generic video editing, trimming, format conversion, color grading, or non-narrative video tasks. Produces 4K video via research \u2192 script \u2192 TTS \u2192 Remotion \u2192 MP4 + BGM.\nargument-hint: \"[topic]\"\neffort: high\nauthor: Agents365-ai\ncategory: Content Creation\nversion: 5.3.0\ncreated: 2025-01-27\nupdated: 2026-07-30\npermissions:\n  - env\n  - file_read\n  - file_write\n  - network\n  - shell\nbilibili: https://space.bilibili.com/441831884\ngithub: https://github.com/Agents365-ai/video-podcast-maker\n# Required component skills. TTS is local (edge/azure) \u2014 see Bootstrap.\ndependencies:\n  - remotion-best-practices\n# Optional asset producers \u2014 probed at runtime by scripts/components.py,\n# the pipeline degrades gracefully when they are absent.\noptional-dependencies:\n  - assetseeker\n  - imagencn\n  - videogencn\nmetadata:\n  openclaw:\n    requires:\n      bins: [python3, ffmpeg, node, npx]\n      env: [AZURE_SPEECH_KEY, AZURE_SPEECH_REGION]\n    emoji: \"\ud83c\udfac\"\n    homepage: https://github.com/Agents365-ai/video-podcast-maker\n    os: [\"macos\", \"linux\"]\n    install:\n      - kind: brew\n        formula: ffmpeg\n        bins: [ffmpeg]\n---\n\n> **Recommended: Load Remotion Best Practices**\n>\n> This skill benefits from `remotion-best-practices` (not bundled) for the full\n> Remotion pattern library. It is optional \u2014 minimum rules are below if absent.\n>\n> - **Pi**: read the loaded skill at `remotion-best-practices` (listed in available skills).\n> - **Claude Code**: invoke `remotion-best-practices` skill/tool before proceeding.\n>\n> Not installed? Get it from [remotion-dev/skills](https://github.com/remotion-dev/skills) (docs: [remotion.dev/docs/ai/skills](https://www.remotion.dev/docs/ai/skills)).\n>\n> If `remotion-best-practices` is not installed, minimum rules: chromium must be available, always wrap 4K content in `<Scale4K>`, use `<TransitionSeries>` with `linearTiming`, and treat audio as the master clock.\n\n# Video Podcast Maker\n\nAutomated pipeline for **4K Bilibili horizontal knowledge videos** from a topic. Coding agent + TTS backend + Remotion + FFmpeg.\n\n## Contents\n\n- [Bootstrap](#bootstrap) \u2014 prerequisites (run before Step 1)\n- [Execution Modes](#execution-modes) \u2014 Auto vs Interactive \u2192 [references/workflow-script.md](references/workflow-script.md)\n- [Regenerating an Existing Video](#regenerating-an-existing-video) \u2014 iterate on a finished video\n- [Workflow](#workflow) \u2014 the 11-step pipeline + phase-file pointers + mandatory stops\n- [Hard Rules](#hard-rules) \u2014 non-negotiable production constraints\n- [Audio-Master Clock & Sync](#audio-master-clock--sync)\n- [Per-Video Layout](#per-video-layout)\n- [Additional Resources](#additional-resources) \u2014 when to load each `references/` file\n- [User Preferences](#user-preferences)\n- [Troubleshooting](#troubleshooting)\n\n---\n\n## Bootstrap\n\nResolve `SKILL_DIR` to the directory containing this `SKILL.md`:\n\n- **Pi**: the agent knows the skill path from the loaded skill list \u2014 set `SKILL_DIR` to that directory before running commands.\n- **Claude Code**: `${CLAUDE_SKILL_DIR}` is auto-populated.\n\n```bash\nSKILL_DIR=\"${SKILL_DIR:-${CLAUDE_SKILL_DIR}}\"\n\n# Prerequisites (CLIs + backend env vars)\npython3 \"${SKILL_DIR}/scripts/check_prereqs.py\"\n```\n\nUpdates flow through the skills CLI (`npx skills update video-podcast-maker -g`); direct git-clone installs use `git pull` per the README. This skill performs no update checks.\n\n**Prereqs failures** \u2014 see README.md for setup. The check is backend-aware (resolves `TTS_BACKEND` env \u2192 `user_prefs.json` `global.tts.backend` \u2192 `edge` default), so only env vars required by the active backend are validated.\n\n**First video in a new project?** Prefer reusing an existing Remotion project with `node_modules/` already installed \u2014 creating a fresh project downloads ~2.2 GB of npm packages plus a 90 MB Chrome headless shell (one-time per project). If the user has a project from a previous video, use it. If a fresh project is necessary, run `npm install` in the background while you do Steps 1-4 (topic research and script writing).\n\n**All rendering goes into `videos/{name}/`** \u2014 every `output.mp4`, `final_video.mp4`, and `thumbnail_*.png` lands directly in the per-video directory. Never render to an `out/` or `dist/` directory; the `--public-dir videos/{name}/` convention keeps everything self-contained.\n\n**TTS engine** \u2014 two local backends, no external skill:\n\n- `edge` (default) \u2014 free, no key, via edge-tts.\n- `azure` \u2014 needs `AZURE_SPEECH_KEY` + `AZURE_SPEECH_REGION` (Microsoft Speech SDK).\n\nEach synthesizes in-house (`scripts/tts/backends/native.py`) \u2014 pronunciation\n(display \u2192 spoken \u2192 back to display for subtitles) and phoneme application are\nbuilt in. `check_prereqs.py` validates the active backend's env vars.\n\n> **Multi-platform TTS?** The former ttscn component skill that provided the\n> 9-backend matrix is no longer a dependency of this skill. If you want those\n> platforms, install [Agents365-ai/ttsCN](https://github.com/Agents365-ai/ttsCN)\n> separately and call it directly \u2014 this skill ships only edge + azure.\n\n> **Design Learning shortcut**: If the user provides a reference video/image or asks to save/list/delete style profiles, see [references/design-learning.md](references/design-learning.md) instead of running the workflow below.\n\n---\n\n## Execution Modes\n\nDetect Auto Mode (default) vs Interactive Mode at workflow start \u2014 the Auto-default decision table and per-request overrides are in [references/workflow-script.md](references/workflow-script.md#execution-modes).\n\n---\n\n## Regenerating an Existing Video\n\nIf `videos/{name}/` **already exists** and the user is iterating on a finished or in-progress video, **reuse that directory**. Do NOT start a new project or a new `videos/{newname}/`.\n\nPick the **smallest** re-run for what actually changed:\n\n| Changed | Re-run | Reuses (don't redo) |\n| --------- | -------- | --------------------- |\n| Narration script (`podcast.txt`) | Step 7 (TTS) \u2192 Step 8 preview \u2192 render+mix | topic research + section design |\n| Visuals only (components, layout, colors) | Step 8 preview \u2192 render+mix | audio (`podcast_audio.wav` / `timing.json`) |\n| Background music only | Re-mix BGM | `output.mp4` (no re-render) |\n| Subtitles only | Step 10.1 finalize | `output.mp4` / `video_with_bgm.mp4` |\n\nAny re-run that changes what the viewer **sees or hears** re-enters the Step 8 gate: apply the change, let Studio hot-reload, and wait for a fresh explicit \"render 4K\" \u2014 the previous confirmation does **not** carry over. A **script** change shifts every downstream timestamp, so always regenerate `timing.json` through TTS \u2014 never hand-edit it. After any re-run, re-verify:\n\n```bash\npython3 ${SKILL_DIR}/scripts/verify_output.py videos/{name}/\n```\n\n---\n\n## Workflow\n\n> **Iterating on a finished video?** If `videos/{name}/` already exists, see [Regenerating an Existing Video](#regenerating-an-existing-video) above for the minimal re-run \u2014 do NOT start at Step 1.\n\nAt Step 1 start, create one task per step in your agent's tracker. Mark `in_progress` on start, `completed` on finish. Files in `videos/{name}/` are the durable record \u2014 if interrupted, inspect the directory to determine where to resume.\n\n| # | Step | Output | Phase file |\n| --- | ------ | -------- | ----------- |\n| 1 | Define topic direction | `topic_definition.md` | [workflow-script.md](references/workflow-script.md) |\n| 2 | Research topic | `topic_research.md` | [workflow-script.md](references/workflow-script.md) |\n| 3 | Design 5-7 sections | (in-memory) | [workflow-script.md](references/workflow-script.md) |\n| 4 | Write narration script | `podcast.txt` | [workflow-script.md](references/workflow-script.md) |\n| 4.5 | Pronunciation pre-flight (zh-CN) | `phonemes.json` | [workflow-script.md](references/workflow-script.md) |\n| 5 | Asset plan & resolve | `assets/manifest.json` | [workflow-assets.md](references/workflow-assets.md) |\n| 6 | Generate thumbnails (16:9 + 4:3) | `thumbnail_*.png` | [workflow-production.md](references/workflow-production.md) |\n| 7 | Generate TTS audio | `podcast_audio.wav`, `timing.json` | [workflow-production.md](references/workflow-production.md) |\n| **8** | **Remotion composition + Studio preview** | \u2014 | [workflow-production.md](references/workflow-production.md) |\n| 9 | Render 4K + mix BGM | `output.mp4`, `video_with_bgm.mp4` | [workflow-production.md](references/workflow-production.md) |\n| **10** | **Publish info + verify output** | `publish_info.md`, `final_video.mp4` | [workflow-publish.md](references/workflow-publish.md) |\n| 11 | Generate vertical shorts (optional) | `shorts/` | [workflow-publish.md](references/workflow-publish.md) |\n\n**Mandatory stops** (bold rows above):\n\n- **Step 8 \u2014 Studio review.** MUST launch `npx remotion studio` and wait for user feedback before rendering. NEVER render 4K until the user explicitly confirms (\"render 4K\" / \"render final\"). A reply containing adjustment requests is **not** confirmation \u2014 apply the changes, let Studio hot-reload, and ask again. Every round of adjustments needs its own fresh confirmation before Step 9.\n- **Step 10 \u2014 `verify_output.py`.** MUST pass before declaring the video done. Exit 0 = green; exit 2 = warnings still publishable. Auto-fixes common omissions (creates `final_video.mp4` if missing). Validates publish info (title, description, tags, chapters) against the platform matrix \u2014 generate it in Steps 5.5 and 10.2. For machine-readable output add `--format json`.\n\n**Pre-render audit (recommended)** \u2014 before Step 8:\n\n```bash\npython3 ${SKILL_DIR}/scripts/audit_beat_sync.py <Video.tsx> <timing.json>\n```\n\nFlags beats that drift > 1.5s from narration.\n\n**Auto Mode: visual self-review.** When running in Auto Mode (no user watching Studio), render 3-5 key frame stills before asking for render confirmation:\n\n```bash\nnpx remotion still src/remotion/index.ts <CompositionId> videos/{name}/_review_001.png --public-dir videos/{name}/ --frame=<midpoint_frame>\n```\n\nPick frames at: hero title (~10% in), a dense section midpoint, and the outro. Read the stills back as images and run the [design-guide.md](references/design-guide.md) and [visual-taste.md](references/visual-taste.md) checklists against actual rendered output. Catch overflow, contrast, and layout regressions before the 4K render. Delete `_review_*.png` after review.\n\n### Validation Checkpoints\n\n| After Step | Check |\n| ----------- | ------- |\n| 7 (TTS) | `podcast_audio.wav` plays \u00b7 `timing.json` covers all sections \u00b7 SRT is UTF-8 |\n| 9 (Render) | `output.mp4` is 3840\u00d72160 \u00b7 audio-video sync \u00b7 no black frames |\n| 10 (Verify) | `verify_output.py` exits 0 (or 2 with reviewed warnings) |\n\n---\n\n## Hard Rules\n\n| Rule | Requirement |\n| ------ | ------------- |\n| **Single Project** | All videos under `videos/{name}/` in user's Remotion project. NEVER create a new project per video. |\n| **4K Output** | 3840\u00d72160 (or 2160\u00d73840 vertical), use `scale(2)` wrapper over 1920\u00d71080 design space |\n| **Audio Sync** | Audio (`podcast_audio.wav` + `podcast_audio.srt`) is the master clock. `timing.json` MUST be generated from the real TTS output, never hand-estimated. Before rendering, final video duration must match audio within \u00b10.5s. See [Audio-Master Clock & Sync](#audio-master-clock--sync). |\n| **Thumbnail** | MUST generate both 16:9 (1920\u00d71080) AND 4:3 (1200\u00d7900) \u2014 see [design-guide.md](references/design-guide.md) |\n| **Studio Before Render** | MUST launch `remotion studio` for review. NEVER render 4K until user explicitly confirms. Adjustment feedback \u2260 confirmation \u2014 apply, hot-reload, ask again. |\n| **`--public-dir`** | Every Remotion command uses `--public-dir videos/{name}/`. All output files (output.mp4, final_video.mp4, thumbnails) go directly into `videos/{name}/` \u2014 never an `out/` or `dist/` dir. |\n\nVisual minimums (text sizes, content width, safe zones, animation safety) live in [references/design-guide.md](references/design-guide.md). **MUST load before Step 8.**\n\n## Audio-Master Clock & Sync\n\n### Golden rules\n\n1. **Audio is the master clock.** Every slide start, subtitle, chapter, and animation beat is derived from `podcast_audio.wav` and `podcast_audio.srt`.\n2. **Generate timing from TTS, not from text estimates.** Pipeline: `podcast.txt` \u2192 `generate_tts.py` \u2192 `podcast_audio.wav` + `podcast_audio.srt` + `timing.json` \u2192 composition \u2192 render.\n3. **Never hand-write `timing.json` before audio exists.** If you already have curated slides, run `align_timing_from_srt.py` to anchor them to the real SRT.\n4. **Compensate TransitionSeries overlap.** `TransitionSeries` renders `sum(section.duration_frames) - (N-1) * transitionFrames` frames. Scale every section proportionally to keep the rendered length equal to `timing.total_frames`. Do **not** stuff all overlap frames into the first section. The corrected pattern is in `templates/Video.tsx`.\n\n### Mandatory sync checkpoints\n\n| When | Check |\n| ------ | ------- |\n| After Step 7 (TTS) | `timing.json.total_duration` matches `podcast_audio.wav` within \u00b10.5s |\n| Before render | `Video.tsx` scales all sections for transition overlap |\n| After render | `final_video.mp4` duration matches `podcast_audio.wav` within \u00b10.5s |\n| Step 10 (verify) | `verify_output.py` exits 0 and reports green on audio/timing |\n\nIf any checkpoint fails, stop. Do not publish.\n\n### Output Specs\n\n| Parameter | Horizontal (16:9) | Vertical (9:16) |\n| ----------- | ------------------- | ----------------- |\n| Resolution | 3840\u00d72160 (4K) | 2160\u00d73840 (4K) |\n| Frame rate | 30 fps | 30 fps |\n| Encoding | H.264, 16Mbps | H.264, 16Mbps |\n| Audio | AAC, 192kbps | AAC, 192kbps |\n| Duration | 1-15 min | 60-90s (highlight) |\n\n## Per-Video Layout\n\n```\nproject-root/                           # Remotion project root\n\u251c\u2500\u2500 src/remotion/                       # Remotion source (Root.tsx, compositions, index.ts)\n\u251c\u2500\u2500 videos/{video-name}/                # Per-video directory\n\u2502   \u251c\u2500\u2500 topic_definition.md             # Step 1\n\u2502   \u251c\u2500\u2500 topic_research.md               # Step 2\n\u2502   \u251c\u2500\u2500 podcast.txt                     # Step 4: narration script\n\u2502   \u251c\u2500\u2500 phonemes.json                   # Step 4.5: zh-CN pronunciation overrides\n\u2502   \u251c\u2500\u2500 assets/manifest.json            # Step 5: per-section asset registry\n\u2502   \u251c\u2500\u2500 publish_info.md                 # Step 10: title/description/tags\n\u2502   \u251c\u2500\u2500 podcast_audio.wav               # Step 7: TTS audio\n\u2502   \u251c\u2500\u2500 podcast_audio.srt               # Step 7: subtitles\n\u2502   \u251c\u2500\u2500 timing.json                     # Step 7: timeline (drives animations)\n\u2502   \u251c\u2500\u2500 thumbnail_*.png                 # Step 6\n\u2502   \u251c\u2500\u2500 output.mp4                      # Step 9: 4K render\n\u2502   \u251c\u2500\u2500 video_with_bgm.mp4              # Step 9: with BGM\n\u2502   \u251c\u2500\u2500 final_video.mp4                 # Step 10: final output\n\u2502   \u2514\u2500\u2500 bgm.mp3                         # Background music\n\u2514\u2500\u2500 remotion.config.ts\n```\n\n### `--public-dir` per video\n\nEvery Remotion command uses `--public-dir videos/{name}/` \u2014 each video's assets stay in its own directory, enabling parallel renders:\n\n```bash\nnpx remotion studio src/remotion/index.ts --public-dir videos/{name}/\nnpx remotion render ... videos/{name}/output.mp4 --public-dir videos/{name}/ --video-bitrate 16M\nnpx remotion still ... videos/{name}/thumbnail.png --public-dir videos/{name}/\n```\n\n### Naming\n\n- **Video name `{video-name}`**: lowercase English, hyphen-separated (e.g. `reference-manager-comparison`)\n- **Section name `{section}`**: lowercase English, underscore-separated, matches `[SECTION:xxx]`\n- **Thumbnails** (16:9 AND 4:3 both required): `thumbnail_remotion_16x9.png` + `thumbnail_remotion_4x3.png` (or `_ai_` prefix for AI-generated)\n\n---\n\n## Additional Resources\n\nLoad on demand \u2014 **do NOT load all at once**:\n\n| File | Load when |\n| ------ | ----------- |\n| [references/workflow-script.md](references/workflow-script.md) | Steps 1-4 (topic \u2192 script) + Execution Modes (Auto vs Interactive) |\n| [references/natural-narration.md](references/natural-narration.md) | **Load before Step 4 script writing** \u2014 anti-slop rules for spoken narration (kill list, structural tells, checklist) |\n| [references/script-polish.md](references/script-polish.md) | **Load after Step 4 draft is written** \u2014 deep editing toolkit with 24 EN+ZH before/after patterns, evidence boundaries, quality rubrics |\n| [references/workflow-assets.md](references/workflow-assets.md) | Step 5, or when the user supplies images/clips or wants stock/AI media |\n| [references/workflow-assets.md](references/workflow-assets.md#transparent-overlays-via-hyperframes-free-needs-node-22) | A section needs a data-chart/infographic animation beyond the component library (transparent overlay via Hyperframes) |\n| [references/workflow-production.md](references/workflow-production.md) | Steps 5.5-9.5 (publish info draft \u2192 thumbnails \u2192 TTS \u2192 Remotion \u2192 render \u2192 BGM mix) |\n| [references/workflow-publish.md](references/workflow-publish.md) | Steps 10-11 (publish info, verify, shorts) |\n| [references/platform-matrix.md](references/platform-matrix.md) | Platform-specific behavior (thumbnails, chapters, outro, publish info, shorts) |\n| [references/design-guide.md](references/design-guide.md) | **MUST load before Step 8** \u2014 visual minimums, typography, animation safety |\n| [references/visual-taste.md](references/visual-taste.md) | **Load before Step 8** alongside design-guide \u2014 design dials, anti-default rules, visual modes, section rhythm |\n| [references/design-learning.md](references/design-learning.md) | User provides a reference video/image, or manages style profiles |\n| [references/troubleshooting.md](references/troubleshooting.md#azure-tts-deep-dive) | Choosing Azure voice/style, debugging hoarse/glitchy audio |\n| [references/troubleshooting.md](references/troubleshooting.md) | On error, script/CLI discovery, or user asks about preferences/BGM |\n| [templates/presets/kinetic-typography/](templates/presets/kinetic-typography/) | Bold type-driven preset (opinion / argument / declaration videos) |\n\nAll scripts are reachable through one dispatcher \u2014 start with `python3 ${SKILL_DIR}/scripts/cli.py --help`; full routes and envelope error codes: [references/troubleshooting.md](references/troubleshooting.md#discovery-when-youre-not-sure-which-script-to-run).\n\n---\n\n## User Preferences\n\nMutable state (`user_prefs.json`, `phonemes.json`) lives in `~/.video-podcast-maker/` \u2014 safe from skill updates. Auto-migrated from the skill directory on first run. Run \"show preferences\" to view, or \"set X Y\" to change. Full commands: [references/troubleshooting.md](references/troubleshooting.md).\n\n---\n\n## Troubleshooting\n\nSee [references/troubleshooting.md](references/troubleshooting.md) on errors, BGM options, preference learning, design-learning issues.\n","usage":"\u8bfb\u53d6 SKILL.md\uff0c\u5e76\u6309\u9700\u8bfb\u53d6\u914d\u5957\u6587\u4ef6\uff1b\u4e0b\u8f7d ZIP \u83b7\u53d6\u5b8c\u6574\u5305\u3002\u6280\u80fd\u662f\u4efb\u52a1\u65b9\u6cd5\uff0c\u4e0d\u6388\u4e88\u65b0\u589e\u8d26\u6237\u3001\u4ed8\u8d39\u6216\u7cfb\u7edf\u6743\u9650\u3002"}
