Cinematic Video Generation — 角色灵动性增强引擎 问题诊断 AI视频生成(doubao-seedance / kling / sora / veo)的通病: - ❌ 角色像蜡像,表情空白 - ❌ 动作机械,缺乏自然流畅感 - ❌ 手部僵硬,肢体不协调 - ❌ 眼神空洞,缺少情感表达 - ❌ 同一角色在不同clip间不一致 核心方法论:五维灵动框架 维度1:表情指令库 (Expression Vocabulary) | 情绪 | 英文指令 | 中文意境 | |------|---------|---------| | 忧伤 | "eyes glistening with unshed tears, lips slightly trembling, a bittersweet smile forming" | 眼含泪光,唇微颤,苦笑 | | 怅然 | "gazing into the distance with a melancholic longing, wind tousling her hair, lost in thought" | 远望含愁,风拂发丝 | | 温柔 | "a warm gentle smile spreading across her face, eyes crinkling at the corners, radiating k…

,\n r'^\\[.*\\]

Cinematic Video Generation — 角色灵动性增强引擎 问题诊断 AI视频生成(doubao-seedance / kling / sora / veo)的通病: - ❌ 角色像蜡像,表情空白 - ❌ 动作机械,缺乏自然流畅感 - ❌ 手部僵硬,肢体不协调 - ❌ 眼神空洞,缺少情感表达 - ❌ 同一角色在不同clip间不一致 核心方法论:五维灵动框架 维度1:表情指令库 (Expression Vocabulary) | 情绪 | 英文指令 | 中文意境 | |------|---------|---------| | 忧伤 | "eyes glistening with unshed tears, lips slightly trembling, a bittersweet smile forming" | 眼含泪光,唇微颤,苦笑 | | 怅然 | "gazing into the distance with a melancholic longing, wind tousling her hair, lost in thought" | 远望含愁,风拂发丝 | | 温柔 | "a warm gentle smile spreading across her face, eyes crinkling at the corners, radiating k…

,\n r'^\\.\\.\\.

Cinematic Video Generation — 角色灵动性增强引擎 问题诊断 AI视频生成(doubao-seedance / kling / sora / veo)的通病: - ❌ 角色像蜡像,表情空白 - ❌ 动作机械,缺乏自然流畅感 - ❌ 手部僵硬,肢体不协调 - ❌ 眼神空洞,缺少情感表达 - ❌ 同一角色在不同clip间不一致 核心方法论:五维灵动框架 维度1:表情指令库 (Expression Vocabulary) | 情绪 | 英文指令 | 中文意境 | |------|---------|---------| | 忧伤 | "eyes glistening with unshed tears, lips slightly trembling, a bittersweet smile forming" | 眼含泪光,唇微颤,苦笑 | | 怅然 | "gazing into the distance with a melancholic longing, wind tousling her hair, lost in thought" | 远望含愁,风拂发丝 | | 温柔 | "a warm gentle smile spreading across her face, eyes crinkling at the corners, radiating k…

,\n r'^(.*)

Cinematic Video Generation — 角色灵动性增强引擎 问题诊断 AI视频生成(doubao-seedance / kling / sora / veo)的通病: - ❌ 角色像蜡像,表情空白 - ❌ 动作机械,缺乏自然流畅感 - ❌ 手部僵硬,肢体不协调 - ❌ 眼神空洞,缺少情感表达 - ❌ 同一角色在不同clip间不一致 核心方法论:五维灵动框架 维度1:表情指令库 (Expression Vocabulary) | 情绪 | 英文指令 | 中文意境 | |------|---------|---------| | 忧伤 | "eyes glistening with unshed tears, lips slightly trembling, a bittersweet smile forming" | 眼含泪光,唇微颤,苦笑 | | 怅然 | "gazing into the distance with a melancholic longing, wind tousling her hair, lost in thought" | 远望含愁,风拂发丝 | | 温柔 | "a warm gentle smile spreading across her face, eyes crinkling at the corners, radiating k…

,\n ]\n\n for entry in srt_entries:\n s, e = entry['start'], entry['end']\n # 跳过完全在范围外的\n if e \u003c= phase_start or s >= phase_end:\n continue\n\n text = entry['text'].strip()\n # 跳过纯音乐/标签行\n is_skip = False\n for pat in skip_patterns:\n if re.match(pat, text):\n is_skip = True\n break\n if not is_skip and text:\n lyrics_lines.append(text)\n\n return lyrics_lines\n\n\ndef extract_audio_phase(audio_path: str, phase_start: float, phase_end: float,\n output_path: str) -> bool:\n \"\"\"使用 FFmpeg 从完整音频中截取指定时间段\"\"\"\n duration = phase_end - phase_start\n\n # FFmpeg 路径\n ffmpeg = os.path.expanduser('~/tools/ffmpeg/ffmpeg')\n if not os.path.exists(ffmpeg):\n ffmpeg = 'ffmpeg'\n\n cmd = [\n ffmpeg,\n '-i', audio_path,\n '-ss', str(phase_start),\n '-t', str(duration),\n '-c:a', 'aac',\n '-b:a', '192k',\n '-y',\n output_path,\n ]\n\n print(f\"🎵 截取音频: {phase_start:.1f}s → {phase_end:.1f}s ({duration:.1f}s)\")\n print(f\" 命令: {' '.join(cmd)}\")\n\n result = subprocess.run(cmd, capture_output=True, text=True)\n if result.returncode != 0:\n print(f\"❌ FFmpeg 错误:\\n{result.stderr}\", file=sys.stderr)\n return False\n\n return True\n\n\ndef main():\n parser = argparse.ArgumentParser(\n description='从完整音频 + SRT + 歌词中提取 Phase 分段素材'\n )\n parser.add_argument('--audio', required=True, help='完整音频文件路径')\n parser.add_argument('--srt', required=True, help='完整 SRT 字幕文件路径')\n parser.add_argument('--lyrics', help='歌词文本文件路径(可选,用于提取歌词片段)')\n parser.add_argument('--start', type=float, required=True,\n help='Phase 起始时间(秒)')\n parser.add_argument('--end', type=float, required=True,\n help='Phase 结束时间(秒)')\n parser.add_argument('--phase', type=int, required=True,\n help='Phase 编号')\n parser.add_argument('--outdir', default='.',\n help='输出根目录(默认当前目录)')\n\n args = parser.parse_args()\n\n phase_start = args.start\n phase_end = args.end\n phase_num = args.phase\n outdir = os.path.abspath(args.outdir)\n\n duration = phase_end - phase_start\n print(f\"🎬 Phase {phase_num}: {phase_start:.1f}s → {phase_end:.1f}s ({duration:.1f}s)\")\n print()\n\n # === 1. 解析完整 SRT ===\n if not os.path.exists(args.srt):\n print(f\"❌ SRT 文件不存在: {args.srt}\", file=sys.stderr)\n sys.exit(1)\n\n entries = parse_srt(args.srt)\n print(f\"📝 完整 SRT: {len(entries)} 条字幕\")\n\n # === 2. 提取分段 SRT ===\n phase_entries = extract_srt_phase(entries, phase_start, phase_end)\n print(f\"📝 Phase SRT: {len(phase_entries)} 条字幕\")\n\n if not phase_entries:\n print(\"⚠️ 该时间段内无字幕条目\")\n else:\n print(f\" 第一条: {format_srt_time(phase_entries[0]['start'])} → {phase_entries[0]['text'][:30]}\")\n print(f\" 最后条: {format_srt_time(phase_entries[-1]['end'])} → {phase_entries[-1]['text'][:30]}\")\n\n # 写入分段 SRT\n srt_outdir = os.path.join(outdir, 'subtitles')\n os.makedirs(srt_outdir, exist_ok=True)\n srt_path = os.path.join(srt_outdir, f'phase{phase_num}_lyrics.srt')\n\n phase_srt_content = build_phase_srt(phase_entries)\n with open(srt_path, 'w', encoding='utf-8') as f:\n f.write(phase_srt_content)\n print(f\"✅ 分段 SRT 已保存: {srt_path}\")\n print()\n\n # === 3. 提取歌词文本片段 ===\n lyrics_lines = extract_lyrics_phase(entries, phase_start, phase_end)\n lyrics_outdir = os.path.join(outdir, 'lyrics')\n os.makedirs(lyrics_outdir, exist_ok=True)\n lyrics_path = os.path.join(lyrics_outdir, f'phase{phase_num}_lyrics.txt')\n\n with open(lyrics_path, 'w', encoding='utf-8') as f:\n for line in lyrics_lines:\n f.write(line + '\\n')\n print(f\"📝 歌词片段 ({len(lyrics_lines)} 行): {lyrics_path}\")\n for line in lyrics_lines:\n print(f\" {line}\")\n print()\n\n # === 4. 截取分段音频 ===\n if not os.path.exists(args.audio):\n print(f\"⚠️ 音频文件不存在,跳过音频截取: {args.audio}\", file=sys.stderr)\n else:\n audio_outdir = os.path.join(outdir, 'audio')\n os.makedirs(audio_outdir, exist_ok=True)\n audio_path = os.path.join(audio_outdir, f'phase{phase_num}_audio.m4a')\n\n if extract_audio_phase(args.audio, phase_start, phase_end, audio_path):\n print(f\"✅ 分段音频已保存: {audio_path}\")\n print()\n\n # === 汇总 ===\n print(f\"🎉 Phase {phase_num} 素材提取完成!\")\n print(f\" 音频: {srt_path.replace('/subtitles/', '/audio/').replace('.srt', '.m4a')}\")\n print(f\" 字幕: {srt_path}\")\n print(f\" 歌词: {lyrics_path}\")\n\n\nif __name__ == '__main__':\n main()\n","content_type":"text/x-python; charset=utf-8","language":"python","size":9758,"content_sha256":"3c0fb578ed8b6c31865728c1e879144a4c6c3c6cfedca08f564fc2fa38126105"},{"filename":"scripts/generate_cinematic_prompt.sh","content":"#!/usr/bin/env bash\nset -euo pipefail\n\n# Cinematic Prompt Generator\n# 输入: 场景描述 → 输出: 五维灵动增强后的prompt\n\nSCRIPT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"\n\n# 默认角色卡 (可被项目级覆盖)\nCHARACTER=${CINEMATIC_CHARACTER:-\"\"}\nSCENE=${CINEMATIC_SCENE:-\"\"}\n\nusage() {\n cat \u003c\u003c'EOF'\nUsage:\n CINEMATIC_CHARACTER=\"Chloe, young woman, long black hair with pink tips, white floral dress, cherry blossom hairpin\" \\\n ./generate_cinematic_prompt.sh \"she rises from darkness into golden light\" --emotion wonder --camera crane-up --motion \"lifts chin slowly, fingers uncurl\" --context \"previous clip: dark void\"\n\nOptions:\n --emotion EMO Required emotion (wonder/melancholy/joy/serenity/determination/surprise)\n --camera TYPE Camera movement (push-in/tracking/crane-up/orbit/handheld/pull-back)\n --motion DESC Body movement description\n --context DESC Connection to previous clip\n --character DESC Override character description\n --scene DESC Scene/environment\n -o FILE Output to file\nEOF\n}\n\nEMOTION=\"\"\nCAMERA=\"\"\nMOTION=\"\"\nCONTEXT=\"\"\nOUTPUT=\"\"\n\nwhile [[ $# -gt 0 ]]; do\n case \"$1\" in\n --emotion) shift; EMOTION=\"$1\" ;;\n --camera) shift; CAMERA=\"$1\" ;;\n --motion) shift; MOTION=\"$1\" ;;\n --context) shift; CONTEXT=\"$1\" ;;\n --character) shift; CHARACTER=\"$1\" ;;\n --scene) shift; SCENE=\"$1\" ;;\n -o|--output) shift; OUTPUT=\"$1\" ;;\n -h|--help) usage; exit 0 ;;\n *) DESC=\"$1\" ;;\n esac\n shift\ndone\n\n# 表情映射\ndeclare -A EMOTION_MAP\nEMOTION_MAP[wonder]=\"eyes widening with wonder, mouth forming a soft oh, face illuminated with sudden awe\"\nEMOTION_MAP[melancholy]=\"gazing into the distance with a melancholic longing, lips slightly parted, a hint of sadness in her deep eyes\"\nEMOTION_MAP[joy]=\"a warm genuine smile spreading across her face, eyes crinkling with pure happiness, radiating warmth\"\nEMOTION_MAP[serenity]=\"a peaceful serene expression, eyes half-closed in contentment, the softest smile playing on her lips\"\nEMOTION_MAP[determination]=\"jaw set with quiet determination, eyes blazing with inner strength, unwavering resolute gaze\"\nEMOTION_MAP[surprise]=\"eyebrows rising in delight, eyes sparkling with unexpected wonder, an involuntary gasp\"\nEMOTION_MAP[bittersweet]=\"a bittersweet smile forming, eyes glistening with unshed tears, lips trembling slightly\"\nEMOTION_MAP[release]=\"shoulders dropping with relief, a peaceful exhale visible, serene contentment washing over her face\"\nEMOTION_MAP[hope]=\"eyes lifting toward the light, a tentative smile forming, face softening with cautious optimism\"\n\n# 运镜映射\ndeclare -A CAMERA_MAP\nCAMERA_MAP[push-in]=\"Slow gentle push-in toward her face\"\nCAMERA_MAP[tracking]=\"Smooth tracking shot following her movement\"\nCAMERA_MAP[crane-up]=\"Slow crane-up shot rising from below\"\nCAMERA_MAP[orbit]=\"Orbiting 360 degrees around her\"\nCAMERA_MAP[handheld]=\"Intimate handheld close-up with subtle natural movement\"\nCAMERA_MAP[pull-back]=\"Steady pull-back revealing the full scene\"\nCAMERA_MAP[aerial]=\"Aerial drone shot descending toward her\"\n\n# 构建prompt\nPROMPT=\"\"\n\n# 角色锚点\nif [[ -n \"$CHARACTER\" ]]; then\n PROMPT+=\"[Character: $CHARACTER]\\n\\n\"\nfi\n\n# 运镜 + 主体\nif [[ -n \"$CAMERA\" ]]; then\n CAMERA_DESC=\"${CAMERA_MAP[$CAMERA]:-$CAMERA shot}\"\n PROMPT+=\"$CAMERA_DESC: \"\nfi\n\n# 场景描述\nPROMPT+=\"${DESC:-she stands in contemplation}\"\n\n# 动作\nif [[ -n \"$MOTION\" ]]; then\n PROMPT+=\". She $MOTION\"\nfi\n\n# 表情\nif [[ -n \"$EMOTION\" ]]; then\n EMOTION_DESC=\"${EMOTION_MAP[$EMOTION]:-$EMOTION}\"\n PROMPT+=\". $EMOTION_DESC\"\nfi\n\n# 场景环境\nif [[ -n \"$SCENE\" ]]; then\n PROMPT+=\". $SCENE\"\nfi\n\n# 上下文衔接\nif [[ -n \"$CONTEXT\" ]]; then\n PROMPT+=\". $CONTEXT\"\nfi\n\n# 质量后缀\nPROMPT+=\". Cinematic quality, 4K, shallow depth of field, natural motion blur, film grain, soft lighting.\"\n\nif [[ -n \"$OUTPUT\" ]]; then\n echo -e \"$PROMPT\" > \"$OUTPUT\"\n echo \"Prompt saved to: $OUTPUT\"\nelse\n echo -e \"$PROMPT\"\nfi\n","content_type":"application/x-sh; charset=utf-8","language":"bash","size":3968,"content_sha256":"579973802cf6b6f53ba56639966c559fa985c98200b75465d9a48c7c7bad830e"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"Cinematic Video Generation — 角色灵动性增强引擎","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"问题诊断","type":"text"}]},{"type":"paragraph","content":[{"text":"AI视频生成(doubao-seedance / kling / sora / veo)的通病:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"❌ 角色像蜡像,表情空白","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"❌ 动作机械,缺乏自然流畅感","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"❌ 手部僵硬,肢体不协调","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"❌ 眼神空洞,缺少情感表达","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"❌ 同一角色在不同clip间不一致","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"核心方法论:五维灵动框架","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"维度1:表情指令库 (Expression Vocabulary)","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"情绪","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"英文指令","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"中文意境","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"忧伤","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"eyes glistening with unshed tears, lips slightly trembling, a bittersweet smile forming\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"眼含泪光,唇微颤,苦笑","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"怅然","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"gazing into the distance with a melancholic longing, wind tousling her hair, lost in thought\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"远望含愁,风拂发丝","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"温柔","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"a warm gentle smile spreading across her face, eyes crinkling at the corners, radiating kindness\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"温暖微笑,眼角弯弯","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"坚定","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"jaw set with quiet determination, eyes blazing with inner strength, unwavering gaze\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"下巴微抬,目光坚定","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"惊喜","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"eyes widening with wonder, mouth forming a soft 'oh', face illuminated with sudden joy\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"眼睛一亮,嘴微张","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"释然","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"shoulders dropping with relief, a peaceful exhale visible, serene contentment\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"肩膀放松,释然微笑","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"使用规则","type":"text","marks":[{"type":"strong"}]},{"text":":每个 clip 的 prompt 必须包含至少一个表情指令。","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"维度2:肢体动作指令 (Body Movement Vocabulary)","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"部位","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"微动作","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"大动作","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"手","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"fingers gracefully tracing the air\" / \"hands gently clasping petals\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"arms sweeping wide open\" / \"reaching toward the light\"","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"头","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"head tilting slightly\" / \"chin lifting gently\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"turning to look over her shoulder\" / \"head thrown back in laughter\"","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"身体","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"shoulders swaying subtly to the rhythm\" / \"body swaying gently\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"spinning slowly with dress flowing\" / \"leaning into the wind\"","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"脚","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"shifting weight from one foot to another\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"walking gracefully through the petals\" / \"twirling on tiptoe\"","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"使用规则","type":"text","marks":[{"type":"strong"}]},{"text":":每个 clip 至少 1 个微动作 + 1 个大动作(大场景时)。","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"维度3:运镜与角色互动 (Camera-Subject Interaction)","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"运镜","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"角色配合","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"效果","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"slow push-in","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"角色慢慢转向镜头","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"亲密感、情感拉近","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"tracking shot","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"角色漫步,镜头跟随","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"自然流畅、叙事感","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"crane up","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"角色抬头仰望,镜头上升","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"壮阔感、精神升华","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"orbit 360°","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"角色原地轻转,镜头环绕","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"空间感、梦幻感","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"handheld close-up","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"角色微表情特写","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"纪实感、情感冲击","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"pull back reveal","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"角色静止,镜头拉远","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"孤独感、渺小感","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"使用规则","type":"text","marks":[{"type":"strong"}]},{"text":":prompt 中必须指定运镜方式 + 角色对该运镜的自然反应。","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"维度4:角色一致性锚点 (Character Consistency Anchor)","type":"text"}]},{"type":"paragraph","content":[{"text":"每个 MV/视频项目需要一个 ","type":"text"},{"text":"角色卡","type":"text","marks":[{"type":"strong"}]},{"text":",在所有 clip prompt 中嵌入:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"[CHARACTER_ANCHOR]\nName: Chloe (克洛伊)\nAppearance: A young woman in her early 20s, long flowing black hair with subtle cherry blossom pink tips, \n wearing an ethereal white dress with delicate floral embroidery, slender figure, porcelain skin\nSignature features: Always has a small cherry blossom hairpin on the left side, \n eyes are deep brown with a hint of melancholy\nBuild: Petite, graceful, dancer-like posture\n[/CHARACTER_ANCHOR]","type":"text"}]},{"type":"paragraph","content":[{"text":"使用规则","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"每个 clip prompt 开头插入角色锚点(缩减版即可)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"关键特征(发色、服装、配饰)必须每 clip 重复","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"语气可以变,外貌不能变","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"维度5:动态连贯性 (Temporal Coherence)","type":"text"}]},{"type":"paragraph","content":[{"text":"相邻 clip 之间的动作衔接:","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"衔接类型","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"指令","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"延续动作","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"continuing her graceful turn from the previous moment\"","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"情绪转变","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"her expression shifts from wonder to quiet contentment\"","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"位置移动","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"having moved from the center to the edge of the frame\"","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"时间流逝","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"a moment later, petals have settled around her feet\"","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Prompt 构建模板","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"标准模板(每个 clip 必用)","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"[角色锚点: Chloe, long black hair with pink tips, white floral dress, cherry blossom hairpin]\n\n[运镜] tracking shot following [角色] as she [动作] through [场景].\n\n[主体动作] She [大动作], her [身体部位] [微动作]. \n\n[表情] [表情指令库中的具体描述].\n\n[场景/氛围] [场景细节], [光影], [色调].\n\n[动态连贯] [与上一个clip的衔接].\n\n cinematic quality, 4K, shallow depth of field, natural motion blur, film grain","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"实例:修复 Scene 8-1(从黑暗升起)","type":"text"}]},{"type":"paragraph","content":[{"text":"Before(僵硬版):","type":"text","marks":[{"type":"strong"}]}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"\"Slowly rising from deep darkness, a dim silhouette of a young woman emerges...\"","type":"text"}]}]},{"type":"paragraph","content":[{"text":"After(灵动版):","type":"text","marks":[{"type":"strong"}]}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"\"Chloe, a young woman with long flowing black hair tipped in soft pink, wearing an ethereal white floral dress, her cherry blossom hairpin catching the first rays of light. Slow crane-up shot: she lifts her chin slowly, eyes opening with quiet wonder as warm golden light begins to illuminate her face from below. Her fingers uncurl gracefully at her sides, shoulders relaxing as if releasing a deep breath she's been holding. Her lips part slightly, a soft expression of dawning hope crossing her features. Darkness gently dissolves around her like morning mist. Cinematic chiaroscuro, warm amber and gold palette, 4K, shallow depth of field, natural motion blur.\"","type":"text"}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"模型特定优化","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"doubao-seedance-1-5-pro","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ 支持首帧/尾帧参考图 → 用角色一致性最强的帧作为首帧","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"⚠️ 动作描述不要太复杂,一个核心动作 + 一个表情即可","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"💡 关键词权重:","type":"text"},{"text":"graceful","type":"text","marks":[{"type":"code_inline"}]},{"text":" > ","type":"text"},{"text":"smooth","type":"text","marks":[{"type":"code_inline"}]},{"text":" > ","type":"text"},{"text":"natural","type":"text","marks":[{"type":"code_inline"}]},{"text":" > ","type":"text"},{"text":"fluid","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"sora-2","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ 支持较长 prompt → 可以详细描述动作序列","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"⚠️ 角色一致性较弱 → 每次都要完整描述外貌","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"💡 运镜指令效果好,多用具体 camera movement","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"kling 系列","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ 人物动作生成强 → 动作描述可以大胆","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"⚠️ 表情细节弱 → 用光影和角度弥补","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"💡 ","type":"text"},{"text":"close-up","type":"text","marks":[{"type":"code_inline"}]},{"text":" + ","type":"text"},{"text":"soft lighting","type":"text","marks":[{"type":"code_inline"}]},{"text":" = 表情感","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"质量检查清单","type":"text"}]},{"type":"paragraph","content":[{"text":"生成后逐条检查:","type":"text"}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"角色表情是否有变化?(不是木偶脸)","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"肢体是否有自然动作?(不是站桩)","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"运镜是否和角色配合?(不是纯camera运动)","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"与上一clip是否有动作连贯性?","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"角色外貌是否一致?","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"整体氛围是否契合音乐情绪?","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"脚本","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"scripts/generate_cinematic_prompt.sh","type":"text","marks":[{"type":"code_inline"}]}]},{"type":"paragraph","content":[{"text":"输入:场景描述 + 角色卡 + 上下文 → 输出:优化后的 prompt","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"scripts/quality_check.py","type":"text","marks":[{"type":"code_inline"}]}]},{"type":"paragraph","content":[{"text":"输入:生成的 mp4 → 输出:质量评分(运动量/表情变化/连贯性)","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"与其他 Skill 协作","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"cinematic-video-gen (prompt增强 + 口型歌词)\n → qingyun-api / video_generate (实际生成)\n → video-lyrics-subtitle (字幕生成 + 烧录)\n → lyrics-video-sync (歌词卡点匹配)\n → ffmpeg-video-editor (后期合成)\n → av-sync-workflow (音视频节拍同步)","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"🎬 完整 MV 生成 Workflow(端到端)","type":"text"}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"以下是一首 MV 从零到成片的完整 pipeline,所有步骤使用现有 skill 工具链。","type":"text"}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"输入素材准备","type":"text"}]},{"type":"paragraph","content":[{"text":"所有素材存放在规范目录结构中:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"~/clawd/projects/MediaClaw/output/\u003cproject-name>/\n├── lyrics/lyrics.txt # 歌词原文\n├── audio/song_final.mp3 # 最终版音频\n├── script/mv_script.json # MV脚本(场景+镜头列表)\n├── frames/ # 参考帧图片\n│ ├── 01_first.png # 每个场景的首帧\n│ ├── 01_last.png # 每个场景的尾帧\n│ └── ...\n└── script/chloe-card.json # 角色卡","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 1: 歌词时间轴生成","type":"text"}]},{"type":"paragraph","content":[{"text":"工具","type":"text","marks":[{"type":"strong"}]},{"text":": ","type":"text"},{"text":"video-lyrics-subtitle","type":"text","marks":[{"type":"code_inline"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python3 ~/clawd/skills/video-lyrics-subtitle/scripts/generate_srt.py \\\n lyrics/lyrics.txt \\\n --audio audio/song_final.mp3 \\\n -o subtitles/lyrics.srt","type":"text"}]},{"type":"paragraph","content":[{"text":"输出:每句歌词的精确起止时间(SRT 格式)","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 1.5: Phase 音频/字幕分段提取","type":"text"}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"⚠️ 关键步骤!确保歌词/音频/视频三者同步。","type":"text","marks":[{"type":"strong"}]},{"text":" 跳过此步骤将导致:音频从头播放、字幕时间轴错位、视频和音频完全不对齐。","type":"text"}]}]},{"type":"paragraph","content":[{"text":"根据 ","type":"text"},{"text":"edit_plan.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" 中每个 Phase 的时间范围,从完整素材中截取对应的分段:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python3 ~/clawd/projects/MediaClaw/skills/cinematic-video-gen/scripts/extract_phase.py \\\n --audio audio/song_final.mp3 \\\n --srt subtitles/lyrics.srt \\\n --start 208.0 \\\n --end 237.0 \\\n --phase 1 \\\n --outdir .","type":"text"}]},{"type":"paragraph","content":[{"text":"输出:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"audio/phaseN_audio.m4a","type":"text","marks":[{"type":"code_inline"}]},{"text":" — 分段音频(精确对应视频时间范围)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"subtitles/phaseN_lyrics.srt","type":"text","marks":[{"type":"code_inline"}]},{"text":" — 分段字幕(时间轴从 ","type":"text"},{"text":"00:00:00,000","type":"text","marks":[{"type":"code_inline"}]},{"text":" 开始)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"lyrics/phaseN_lyrics.txt","type":"text","marks":[{"type":"code_inline"}]},{"text":" — 歌词文本片段","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"SRT 时间轴重置逻辑:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"遍历 SRT 所有条目,保留与 Phase 时间范围重叠的条目","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"裁剪部分重叠条目的起止时间到 Phase 范围内","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"所有时间减去 Phase 起始偏移量(如 -208.0s),使从 ","type":"text"},{"text":"00:00:00,000","type":"text","marks":[{"type":"code_inline"}]},{"text":" 开始","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 2: 场景×歌词映射","type":"text"}]},{"type":"paragraph","content":[{"text":"工具","type":"text","marks":[{"type":"strong"}]},{"text":": ","type":"text"},{"text":"lyrics-video-sync","type":"text","marks":[{"type":"code_inline"}]}]},{"type":"paragraph","content":[{"text":"将 MV 脚本中的场景/镜头与歌词时间轴对齐,确定:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"每个 clip 对应哪句歌词","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"纯音乐段、间奏段的划分","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"每个 clip 的时间范围","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"输出:","type":"text"},{"text":"edit_plan.json","type":"text","marks":[{"type":"code_inline"}]},{"text":"(每clip的歌词+时间+场景)","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 3: Prompt 组装(六维增强 + 口型)","type":"text"}]},{"type":"paragraph","content":[{"text":"工具","type":"text","marks":[{"type":"strong"}]},{"text":": ","type":"text"},{"text":"cinematic-video-gen","type":"text","marks":[{"type":"code_inline"}]},{"text":" (本 skill)","type":"text"}]},{"type":"paragraph","content":[{"text":"对每个 clip,自动读取:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"角色锚点","type":"text","marks":[{"type":"strong"}]},{"text":" — 从角色卡提取固定外貌描述","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"首帧参考图","type":"text","marks":[{"type":"strong"}]},{"text":" — ","type":"text"},{"text":"frames/XX_first.png","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"运镜 + 动作 + 表情","type":"text","marks":[{"type":"strong"}]},{"text":" — 从 MV 脚本场景描述 + 词库匹配","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"歌词口型","type":"text","marks":[{"type":"strong"}]},{"text":" — 从 edit_plan.json 读取对应歌词行","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"场景氛围","type":"text","marks":[{"type":"strong"}]},{"text":" — 光影、色调、背景","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"动态连贯","type":"text","marks":[{"type":"strong"}]},{"text":" — 与上一个 clip 的衔接指令","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"输出:每个 clip 的完整 prompt","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 4: 视频生成(首帧参考)","type":"text"}]},{"type":"paragraph","content":[{"text":"工具","type":"text","marks":[{"type":"strong"}]},{"text":": ","type":"text"},{"text":"qingyun-api","type":"text","marks":[{"type":"code_inline"}]},{"text":" (doubao-seedance)","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python3 ~/clawd/skills/qingyun-api/scripts/qingyun-video-doubao-local.py \\\n --prompt \"\u003cStep 3 生成的完整prompt>\" \\\n --first-frame frames/01_first.png \\\n --model doubao-seedance-1-5-pro-251215 \\\n --output video/clips/01_scene1.mp4","type":"text"}]},{"type":"paragraph","content":[{"text":"关键:","type":"text"},{"text":"--first-frame","type":"text","marks":[{"type":"code_inline"}]},{"text":" 确保角色一致性(base64 本地文件)","type":"text"}]},{"type":"paragraph","content":[{"text":"每个 clip 约 5 秒,按场景依次生成。","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 5: 字幕文件生成","type":"text"}]},{"type":"paragraph","content":[{"text":"工具","type":"text","marks":[{"type":"strong"}]},{"text":": ","type":"text"},{"text":"video-lyrics-subtitle","type":"text","marks":[{"type":"code_inline"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# SRT → ASS(KTV 高亮效果)\npython3 ~/clawd/skills/video-lyrics-subtitle/scripts/generate_ass.py \\\n subtitles/lyrics.srt \\\n --style ktv \\\n -o subtitles/lyrics.ass","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 6: 编译合成(⚠️ 使用分段素材!)","type":"text"}]},{"type":"paragraph","content":[{"text":"工具","type":"text","marks":[{"type":"strong"}]},{"text":": ","type":"text"},{"text":"ffmpeg-video-editor","type":"text","marks":[{"type":"code_inline"}]},{"text":" + ","type":"text"},{"text":"video-lyrics-subtitle","type":"text","marks":[{"type":"code_inline"}]}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"🔴 必须使用 Step 1.5 提取的分段素材,不是完整音频/字幕!","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ 用 ","type":"text"},{"text":"audio/phaseN_audio.m4a","type":"text","marks":[{"type":"code_inline"}]},{"text":"(分段音频)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"❌ 不要用 ","type":"text"},{"text":"audio/song_final.mp3","type":"text","marks":[{"type":"code_inline"}]},{"text":"(完整音频)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ 用 ","type":"text"},{"text":"subtitles/phaseN_lyrics.srt","type":"text","marks":[{"type":"code_inline"}]},{"text":"(分段字幕,从 00:00 开始)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"❌ 不要用 ","type":"text"},{"text":"subtitles/lyrics.srt","type":"text","marks":[{"type":"code_inline"}]},{"text":"(完整字幕)","type":"text"}]}]}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# 6a. FFmpeg xfade 拼接所有 clips + 分段音频 → 无字幕版\n~/tools/ffmpeg -i clip1.mp4 -i clip2.mp4 ... \\\n -i audio/phase1_audio.m4a \\\n -filter_complex \"xfade chain...\" \\\n -map \"[vout]\" -map N:a \\\n video/phase1_raw.mp4\n\n# 6b. 生成分段 ASS 字幕(从分段 SRT 转换)\npython3 ~/clawd/skills/video-lyrics-subtitle/scripts/generate_ass.py \\\n subtitles/phase1_lyrics.srt \\\n --style ktv \\\n -o subtitles/phase1_lyrics.ass\n\n# 6c. 用 skill 脚本烧录字幕 → 最终成片\nbash ~/clawd/skills/video-lyrics-subtitle/scripts/burn_subtitles.sh \\\n video/phase1_raw.mp4 \\\n subtitles/phase1_lyrics.ass \\\n video/phase1_final.mp4","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"全流程速查图","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"lyrics.txt + song.mp3\n ↓\n [Step 1] generate_srt.py → lyrics.srt (歌词时间轴)\n ↓\n [Step 1.5] extract_phase.py → phaseN_audio.m4a + phaseN_lyrics.srt + phaseN_lyrics.txt\n ↓\n [Step 2] lyrics-video-sync → edit_plan.json (场景×歌词映射)\n ↓\n [Step 3] cinematic-video-gen → 6维prompt (含口型歌词指令)\n ↓\n [Step 4] qingyun-video-doubao-local.py → clips/*.mp4 (首帧参考生成)\n ↓\n [Step 5] generate_ass.py → phaseN_lyrics.ass (从分段SRT转换)\n ↓\n [Step 6a] FFmpeg xfade → phaseN_raw.mp4 (拼接 + 分段音频)\n ↓\n [Step 6b] burn_subtitles.sh → phaseN_final.mp4 (烧录分段字幕)\n ↓\n 🎬 最终成片 (歌词/音频/视频三者严格同步)","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"生成后质量检查","type":"text"}]},{"type":"paragraph","content":[{"text":"每个 clip 生成后立即检查:","type":"text"}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"角色外貌是否与参考帧一致?","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"表情是否有变化(不是木偶脸)?","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"肢体是否有自然运动?","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"歌唱时嘴巴是否有动作?","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"与上一个 clip 动作是否连贯?","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"整体氛围是否契合音乐?","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"不达标 → 调整 prompt 重生成(同一 clip 最多重试 3 次)","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"模型 fallback 顺序","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"1. doubao-seedance-1-5-pro-251215 ← 首选,支持首帧参考\n2. kling (xingjiabiapi) ← 备选,动作生成强\n3. veo3.1 (Google AI Studio) ← 备选,质量高但渠道不稳定","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"🔴 维度6:口型歌词指令 (Lip-Sync Lyrics)","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"问题","type":"text"}]},{"type":"paragraph","content":[{"text":"AI视频生成时角色唱歌但嘴巴不动,没有对上歌词,看起来像假唱。","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"解决方案:将歌词片段嵌入 prompt","type":"text"}]},{"type":"paragraph","content":[{"text":"每个 clip 的 prompt 必须包含对应时间段的","type":"text"},{"text":"歌词文本+口型描述","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"[角色锚点 + 运镜 + 动作 + 表情]\n\nShe is singing the lyrics: \"桜が散る季節に\" (在樱花飘落的季节)\nHer mouth forms each syllable naturally, lips moving gracefully with the melody.\nShe sings with emotion, her voice carrying the weight of the words.\n\n[场景/氛围 + 质量后缀]","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"口型描述词库","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"歌唱状态","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"英文指令","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"正常演唱","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"singing softly, lips forming each syllable with gentle precision\"","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"高音爆发","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"belting out a powerful note, mouth open wide, jaw dropped slightly\"","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"气声轻唱","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"singing in a breathy whisper, lips barely parting, intimate and close\"","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"停顿换气","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"a brief pause, catching her breath, lips closing softly before the next phrase\"","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"情感爆发","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"voice cracking with emotion, singing through tears, raw and vulnerable\"","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"吟唱/哼鸣","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"humming softly with closed lips, a gentle melody vibrating through her\"","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"歌词→时间轴匹配规则","type":"text"}]},{"type":"paragraph","content":[{"text":"每个 clip 的时间范围必须在 ","type":"text"},{"text":"lyrics.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" 中找到对应歌词行,然后:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"有歌词","type":"text","marks":[{"type":"strong"}]},{"text":" → prompt 中写入 ","type":"text"},{"text":"She is singing: \"[原文]\" ([中文翻译])","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"纯音乐段","type":"text","marks":[{"type":"strong"}]},{"text":" → prompt 中写入 ","type":"text"},{"text":"She moves gracefully to the music, no singing in this moment","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"换气/间奏","type":"text","marks":[{"type":"strong"}]},{"text":" → prompt 中写入 ","type":"text"},{"text":"Between phrases, she takes a breath, a moment of quiet before the next note","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Prompt 模板(完整版)","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"[Character: Chloe, long black hair with pink tips, white floral dress, cherry blossom hairpin]\n\n[运镜] shot of [Chloe] as she [动作] through [场景].\n\n[主体动作] She [大动作], her [身体部位] [微动作].\n\n[表情] [表情指令].\n\n[歌唱] She is singing: \"[对应歌词原文]\" ([中文翻译]).\nHer lips form each syllable naturally, [口型状态描述].\nShe pours emotion into every word, [情感力度].\n\n[场景/氛围] [场景细节], [光影], [色调].\n\n[动态连贯] [与上一个clip的衔接].\n\ncinematic quality, 4K, shallow depth of field, natural motion blur, film grain","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"实例:Scene 9-1 带歌词版","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"[Character: Chloe, long black hair with pink tips, white floral dress, cherry blossom hairpin]\n\nSlow dissolve shot: Chloe's silhouette gradually transforms into floating cherry blossom petals.\nShe is singing the final line: \"桜が散る季節に、また逢いましょう\" (在樱花飘落的季节,我们再相见)\nHer lips softly form each syllable as her body dissolves, singing with bittersweet acceptance.\nA gentle smile plays on her face even as she fades, eyes glistening with unshed tears.\nThe last words linger in the air as petals carry her voice away.\nWarm golden light, soft pink and white palette, dreamy atmosphere.\nTransitioning from the previous aerial dawn shot into this ethereal dissolution.\ncinematic quality, 4K, shallow depth of field, natural motion blur, film grain","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"自动化 Pipeline","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"lyrics-video-sync (歌词时间轴)\n → cinematic-video-gen (生成带歌词的prompt)\n → qingyun-video-doubao-local.py (首帧参考 + prompt生成视频)\n → ffmpeg-video-editor (合成 + 音频混合)","type":"text"}]},{"type":"paragraph","content":[{"text":"当 ","type":"text"},{"text":"lyrics-video-sync","type":"text","marks":[{"type":"code_inline"}]},{"text":" 输出 edit_plan.json 后, ","type":"text"},{"text":"cinematic-video-gen","type":"text","marks":[{"type":"code_inline"}]},{"text":" 自动读取每个 clip 对应的歌词行, 生成完整 prompt(含口型指令),然后送入视频生成 API。","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"创建日期: 2026-04-10","type":"text","marks":[{"type":"em"}]},{"text":" ","type":"text"},{"text":"更新日期: 2026-04-10 — 新增维度6:口型歌词指令","type":"text","marks":[{"type":"em"}]}]}]},"metadata":{"date":"2026-06-05","name":"cinematic-video-gen","author":"@skillopedia","source":{"stars":65,"repo_name":"claude-code-skills","origin_url":"https://github.com/aaaaqwq/claude-code-skills/blob/HEAD/skills/cinematic-video-gen/SKILL.md","repo_owner":"aaaaqwq","body_sha256":"e056f673737405f8a0651cb5d5e492d1924a04aba1d618f08b0ad6515f98b09c","cluster_key":"8181d45836354e83a1c3153943a45a2726c5c6f68e58be855065715a48c91fb4","clean_bundle":{"format":"clean-skill-bundle-v1","source":"aaaaqwq/claude-code-skills/skills/cinematic-video-gen/SKILL.md","attachments":[{"id":"c8167106-b056-504b-9eb5-feb3b68c6a08","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/c8167106-b056-504b-9eb5-feb3b68c6a08/attachment.py","path":"scripts/extract_phase.py","size":9758,"sha256":"3c0fb578ed8b6c31865728c1e879144a4c6c3c6cfedca08f564fc2fa38126105","contentType":"text/x-python; charset=utf-8"},{"id":"89a3f1b7-15f5-5e17-ac31-96ef80ef77ab","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/89a3f1b7-15f5-5e17-ac31-96ef80ef77ab/attachment.sh","path":"scripts/generate_cinematic_prompt.sh","size":3968,"sha256":"579973802cf6b6f53ba56639966c559fa985c98200b75465d9a48c7c7bad830e","contentType":"application/x-sh; charset=utf-8"}],"bundle_sha256":"9311a5c84e3133eea716036e90363b5b37b2ac4f8abc64a800ebf26b9a629a59","attachment_count":2,"text_attachments":2,"attachment_storage":"skillopedia-attachments-v1","binary_attachments":0,"excluded_attachments":[]},"cluster_size":1,"skill_md_path":"skills/cinematic-video-gen/SKILL.md","import_metadata":{"date":"2026-06-05","author":"@skillopedia","version":"v1","category":"ai-agent-development","category_label":"AI"},"exact_dupes_collapsed_into_this":0},"version":"v1","category":"ai-agent-development","import_tag":"clean-skills-v1","description":"AI视频生成质量增强引擎。解决AI视频角色僵硬、表情空白、动作机械的问题。通过高级prompt工程+角色卡+运镜指令+表情库,让AI视频角色活起来。触发词:视频质量、角色僵硬、灵动、表情、动作、cinematic video、视频生成增强、MV视频、角色动画"}},"renderedAt":1782981596123}

Cinematic Video Generation — 角色灵动性增强引擎 问题诊断 AI视频生成(doubao-seedance / kling / sora / veo)的通病: - ❌ 角色像蜡像,表情空白 - ❌ 动作机械,缺乏自然流畅感 - ❌ 手部僵硬,肢体不协调 - ❌ 眼神空洞,缺少情感表达 - ❌ 同一角色在不同clip间不一致 核心方法论:五维灵动框架 维度1:表情指令库 (Expression Vocabulary) | 情绪 | 英文指令 | 中文意境 | |------|---------|---------| | 忧伤 | "eyes glistening with unshed tears, lips slightly trembling, a bittersweet smile forming" | 眼含泪光,唇微颤,苦笑 | | 怅然 | "gazing into the distance with a melancholic longing, wind tousling her hair, lost in thought" | 远望含愁,风拂发丝 | | 温柔 | "a warm gentle smile spreading across her face, eyes crinkling at the corners, radiating k…