🔄 卡若AI 同步 2026-02-23 19:27 | 更新:卡木、运营中枢工作台 | 排除 >20MB: 9 个
This commit is contained in:
250
03_卡木(木)/木叶_视频内容/视频切片/脚本/add_cover_only.py
Normal file
250
03_卡木(木)/木叶_视频内容/视频切片/脚本/add_cover_only.py
Normal file
@@ -0,0 +1,250 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
纳瓦尔切片专用:仅加封面(无字幕)
|
||||
- 封面 2.5 秒,毛玻璃+标题
|
||||
- 字体优先:苹方 > 思源黑体 Heavy > NotoSansCJK Black
|
||||
- 输出重编码控制体积
|
||||
"""
|
||||
|
||||
import argparse
|
||||
import json
|
||||
import math
|
||||
import os
|
||||
import re
|
||||
import subprocess
|
||||
import tempfile
|
||||
from pathlib import Path
|
||||
|
||||
from PIL import Image, ImageDraw, ImageFont, ImageFilter
|
||||
|
||||
SCRIPT_DIR = Path(__file__).resolve().parent
|
||||
SKILL_DIR = SCRIPT_DIR.parent
|
||||
FONTS_DIR = SKILL_DIR / "fonts"
|
||||
|
||||
# 封面字体优先级(好看、清晰)
|
||||
COVER_FONT_PATHS = [
|
||||
"/System/Library/Fonts/PingFang.ttc", # 苹方
|
||||
"/System/Library/Fonts/Supplemental/Songti.ttc", # 宋体
|
||||
str(FONTS_DIR / "SourceHanSansSC-Heavy.otf"), # 思源黑体 Heavy
|
||||
str(FONTS_DIR / "NotoSansCJK-Black.ttc"),
|
||||
str(FONTS_DIR / "SourceHanSansSC-Bold.otf"),
|
||||
"/System/Library/Fonts/STHeiti Medium.ttc",
|
||||
]
|
||||
|
||||
COVER_DURATION = 2.5
|
||||
COVER_STYLE = {
|
||||
"bg_blur": 35,
|
||||
"overlay_alpha": 200,
|
||||
"font_size": 88, # 稍大更醒目
|
||||
"color": (255, 255, 255),
|
||||
"outline_color": (30, 30, 50),
|
||||
"outline_width": 5,
|
||||
}
|
||||
|
||||
|
||||
def _to_simplified(text: str) -> str:
|
||||
try:
|
||||
from opencc import OpenCC
|
||||
return OpenCC("t2s").convert(str(text))
|
||||
except ImportError:
|
||||
return str(text)
|
||||
|
||||
|
||||
def get_cover_font(size: int) -> ImageFont.FreeTypeFont:
|
||||
"""封面专用字体"""
|
||||
for p in COVER_FONT_PATHS:
|
||||
if p and os.path.exists(p):
|
||||
try:
|
||||
return ImageFont.truetype(p, size)
|
||||
except Exception:
|
||||
continue
|
||||
return ImageFont.load_default()
|
||||
|
||||
|
||||
def get_text_size(draw, text, font):
|
||||
bbox = draw.textbbox((0, 0), text, font=font)
|
||||
return bbox[2] - bbox[0], bbox[3] - bbox[1]
|
||||
|
||||
|
||||
def draw_text_outline(draw, pos, text, font, color, outline_color, outline_width):
|
||||
x, y = pos
|
||||
for angle in range(0, 360, 45):
|
||||
dx = int(outline_width * math.cos(math.radians(angle)))
|
||||
dy = int(outline_width * math.sin(math.radians(angle)))
|
||||
draw.text((x + dx, y + dy), text, font=font, fill=outline_color)
|
||||
draw.text((x, y), text, font=font, fill=color)
|
||||
|
||||
|
||||
def create_cover_image(title: str, width: int, height: int, output_path: str, video_path: str = None) -> str:
|
||||
"""生成封面图(毛玻璃+标题)"""
|
||||
title = _to_simplified(str(title or "").strip()) or "精彩切片"
|
||||
font = get_cover_font(COVER_STYLE["font_size"])
|
||||
|
||||
# 背景
|
||||
if video_path and os.path.exists(video_path):
|
||||
tmp = output_path.replace(".png", "_bg.jpg")
|
||||
subprocess.run(
|
||||
["ffmpeg", "-y", "-ss", "1", "-i", video_path, "-vframes", "1", "-q:v", "2", tmp],
|
||||
capture_output=True,
|
||||
)
|
||||
if os.path.exists(tmp):
|
||||
bg = Image.open(tmp).resize((width, height))
|
||||
bg = bg.filter(ImageFilter.GaussianBlur(radius=COVER_STYLE["bg_blur"]))
|
||||
os.remove(tmp)
|
||||
else:
|
||||
bg = Image.new("RGB", (width, height), (30, 30, 50))
|
||||
else:
|
||||
bg = Image.new("RGB", (width, height), (30, 30, 50))
|
||||
|
||||
overlay = Image.new("RGBA", (width, height), (0, 0, 0, COVER_STYLE["overlay_alpha"]))
|
||||
img = Image.alpha_composite(bg.convert("RGBA"), overlay)
|
||||
draw = ImageDraw.Draw(img)
|
||||
|
||||
# 装饰线
|
||||
for i in range(3):
|
||||
alpha = 150 - i * 40
|
||||
draw.rectangle([0, i * 3, width, i * 3 + 2], fill=(255, 215, 0, alpha))
|
||||
draw.rectangle([0, height - i * 3 - 2, width, height - i * 3], fill=(255, 215, 0, alpha))
|
||||
|
||||
# 标题换行
|
||||
max_w = width - 80
|
||||
lines, cur = [], ""
|
||||
for c in title:
|
||||
test = cur + c
|
||||
w, _ = get_text_size(draw, test, font)
|
||||
if w <= max_w:
|
||||
cur = test
|
||||
else:
|
||||
if cur:
|
||||
lines.append(cur)
|
||||
cur = c
|
||||
if cur:
|
||||
lines.append(cur)
|
||||
|
||||
# 居中绘制
|
||||
lh = COVER_STYLE["font_size"] + 16
|
||||
total_h = len(lines) * lh
|
||||
start_y = (height - total_h) // 2
|
||||
for i, line in enumerate(lines):
|
||||
lw, _ = get_text_size(draw, line, font)
|
||||
x = (width - lw) // 2
|
||||
y = start_y + i * lh
|
||||
draw_text_outline(
|
||||
draw, (x, y), line, font,
|
||||
COVER_STYLE["color"],
|
||||
COVER_STYLE["outline_color"],
|
||||
COVER_STYLE["outline_width"],
|
||||
)
|
||||
|
||||
img.save(output_path, "PNG")
|
||||
return output_path
|
||||
|
||||
|
||||
def get_video_info(path: str) -> dict:
|
||||
cmd = [
|
||||
"ffprobe", "-v", "error", "-select_streams", "v:0",
|
||||
"-show_entries", "stream=width,height", "-of", "json", path,
|
||||
]
|
||||
r = subprocess.run(cmd, capture_output=True, text=True)
|
||||
s = {}
|
||||
if r.returncode == 0:
|
||||
import json as _j
|
||||
data = _j.loads(r.stdout)
|
||||
st = data.get("streams", [{}])[0]
|
||||
s["width"] = int(st.get("width", 1080))
|
||||
s["height"] = int(st.get("height", 1920))
|
||||
else:
|
||||
s["width"], s["height"] = 1080, 1920
|
||||
return s
|
||||
|
||||
|
||||
def add_cover_to_clip(clip_path: str, title: str, output_path: str, temp_dir: str) -> bool:
|
||||
"""为单个切片添加封面(前 2.5 秒毛玻璃标题)"""
|
||||
info = get_video_info(clip_path)
|
||||
w, h = info["width"], info["height"]
|
||||
cover_png = os.path.join(temp_dir, "cover.png")
|
||||
create_cover_image(title, w, h, cover_png, clip_path)
|
||||
|
||||
cover_dur = COVER_DURATION
|
||||
# 封面图转 2.5 秒视频流,叠加到正片前段
|
||||
cmd = [
|
||||
"ffmpeg", "-y",
|
||||
"-i", clip_path, "-loop", "1", "-i", cover_png,
|
||||
"-filter_complex",
|
||||
f"[1:v]scale={w}:{h},trim=duration={cover_dur},setpts=PTS-STARTPTS[cover];"
|
||||
f"[0:v][cover]overlay=0:0:enable='lte(t,{cover_dur})'[v]",
|
||||
"-map", "[v]", "-map", "0:a",
|
||||
"-c:v", "libx264", "-preset", "fast", "-crf", "22", "-b:v", "3M",
|
||||
"-c:a", "aac", "-b:a", "128k",
|
||||
output_path,
|
||||
]
|
||||
r = subprocess.run(cmd, capture_output=True, text=True)
|
||||
if r.returncode != 0:
|
||||
print(f" FFmpeg err: {r.stderr[:500]}")
|
||||
return False
|
||||
return os.path.exists(output_path)
|
||||
|
||||
|
||||
def _parse_index(name: str) -> int:
|
||||
m = re.search(r"\d+", name)
|
||||
return int(m.group()) if m else 0
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description="纳瓦尔切片:仅加封面(无字幕)")
|
||||
parser.add_argument("--clips", "-c", required=True, help="切片目录")
|
||||
parser.add_argument("--manifest", "-m", help="clips_manifest.json 路径")
|
||||
parser.add_argument("--highlights", "-l", help="highlights.json 路径(与 manifest 二选一)")
|
||||
parser.add_argument("--output", "-o", required=True, help="输出目录")
|
||||
args = parser.parse_args()
|
||||
|
||||
clips_dir = Path(args.clips)
|
||||
output_dir = Path(args.output)
|
||||
output_dir.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
# 加载标题映射
|
||||
titles = {}
|
||||
if args.manifest and Path(args.manifest).exists():
|
||||
with open(args.manifest, "r", encoding="utf-8") as f:
|
||||
data = json.load(f)
|
||||
for c in data.get("clips", []):
|
||||
titles[c["index"]] = c.get("title", "")
|
||||
elif args.highlights and Path(args.highlights).exists():
|
||||
with open(args.highlights, "r", encoding="utf-8") as f:
|
||||
data = json.load(f)
|
||||
for i, item in enumerate(data if isinstance(data, list) else data.get("clips", []), 1):
|
||||
titles[i] = item.get("title", item.get("name", ""))
|
||||
|
||||
clips = sorted(clips_dir.glob("*.mp4"))
|
||||
print("=" * 60)
|
||||
print("🎬 纳瓦尔切片 · 仅加封面(无字幕)")
|
||||
print("=" * 60)
|
||||
print(f"输入: {clips_dir}\n输出: {output_dir}\n")
|
||||
success = 0
|
||||
for i, cp in enumerate(clips):
|
||||
idx = _parse_index(cp.name) or (i + 1)
|
||||
title = titles.get(idx, "")
|
||||
if not title:
|
||||
m = re.search(r"\d+[_\s]+(.+?)(?:_enhanced)?\.mp4$", cp.name)
|
||||
title = m.group(1).strip() if m else "片段"
|
||||
print(f" [{idx}] {title}")
|
||||
td = tempfile.mkdtemp(prefix="naval_cover_")
|
||||
try:
|
||||
out = output_dir / cp.name.replace(".mp4", "_cover.mp4")
|
||||
if add_cover_to_clip(str(cp), title, str(out), td):
|
||||
success += 1
|
||||
size_mb = out.stat().st_size / (1024 * 1024)
|
||||
print(f" ✅ {out.name} ({size_mb:.1f}MB)")
|
||||
else:
|
||||
print(f" ❌ 失败")
|
||||
finally:
|
||||
import shutil
|
||||
shutil.rmtree(td, ignore_errors=True)
|
||||
print("\n" + "=" * 60)
|
||||
print(f"✅ 完成: {success}/{len(clips)}")
|
||||
print(f"📁 输出: {output_dir}")
|
||||
print("=" * 60)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -86,28 +86,35 @@ def clip_video(input_path: str, start_time: str, end_time: str, output_path: str
|
||||
output_path: 输出路径
|
||||
fast_mode: 快速模式(使用copy编码,可能不精确)
|
||||
"""
|
||||
# 使用 -t duration 避免 -to 在 ffmpeg 中的歧义(-to 可能被解释为输出时长)
|
||||
start_sec = parse_timestamp(start_time)
|
||||
end_sec = parse_timestamp(end_time)
|
||||
duration_sec = end_sec - start_sec
|
||||
|
||||
if fast_mode:
|
||||
# 快速模式:使用copy编码,速度快但可能不精确
|
||||
# 快速模式:使用 copy 编码,-t 明确指定输出时长
|
||||
cmd = [
|
||||
"ffmpeg",
|
||||
"-ss", start_time,
|
||||
"-i", input_path,
|
||||
"-to", end_time,
|
||||
"-t", str(duration_sec),
|
||||
"-c", "copy",
|
||||
"-avoid_negative_ts", "1",
|
||||
"-y",
|
||||
output_path
|
||||
]
|
||||
else:
|
||||
# 精确模式:重新编码,速度慢但精确
|
||||
# 精确模式:重新编码,-t 明确指定输出时长,体积可控
|
||||
cmd = [
|
||||
"ffmpeg",
|
||||
"-i", input_path,
|
||||
"-ss", start_time,
|
||||
"-to", end_time,
|
||||
"-i", input_path,
|
||||
"-t", str(duration_sec),
|
||||
"-c:v", "libx264",
|
||||
"-preset", "fast",
|
||||
"-crf", "23",
|
||||
"-b:v", "3M",
|
||||
"-maxrate", "4M",
|
||||
"-c:a", "aac",
|
||||
"-b:a", "128k",
|
||||
"-y",
|
||||
|
||||
45
03_卡木(木)/木果_项目模板/PPT制作/参考资料/PPT美观升级_Apple原则.md
Normal file
45
03_卡木(木)/木果_项目模板/PPT制作/参考资料/PPT美观升级_Apple原则.md
Normal file
@@ -0,0 +1,45 @@
|
||||
# PPT 美观升级 · Apple Keynote 四原则
|
||||
|
||||
> 来源:数位时代《为什么苹果发表会的 Keynote 这么好看》、设计最佳实践
|
||||
|
||||
---
|
||||
|
||||
## 一、四大设计原则(Robin Williams)
|
||||
|
||||
| 原则 | 含义 | 应用 |
|
||||
|:---|:---|:---|
|
||||
| **亲密性** | 相关项目物理位置接近,风格统一 | 同类信息放一块,形成视觉单元 |
|
||||
| **对齐** | 明确对齐线,严格遵循 | 文字/图片/元素同基准线 |
|
||||
| **对比** | 有效对比突出重点 | 大小、颜色、粗细区分层级 |
|
||||
| **重复** | 全篇一致,极简 | 字体、间距、组件样式统一 |
|
||||
|
||||
---
|
||||
|
||||
## 二、Apple 具体手法
|
||||
|
||||
- **少即是多**:一页一个主题,靠演讲者讲述
|
||||
- **大面积留白**:不填满每个角落
|
||||
- **居中或网格**:明确构图
|
||||
- **字体统一**:San Francisco / 无衬线,标题 44-56pt,正文 22-28pt
|
||||
- **视觉优先**:大图、全屏、所见即所得
|
||||
- **6×6 规则**:每页 ≤6 点,每行 ≤6 词
|
||||
|
||||
---
|
||||
|
||||
## 三、层级与字号(1280×720)
|
||||
|
||||
| 元素 | 字号 | 用途 |
|
||||
|:---|:---|:---|
|
||||
| 主标题 | 48-56px | 封面、章节 |
|
||||
| 副标题 | 28-32px | 辅助说明 |
|
||||
| 正文 | 20-24px | 要点、列表 |
|
||||
| 注释 | 16-18px | 次要信息 |
|
||||
|
||||
---
|
||||
|
||||
## 四、留白规范
|
||||
|
||||
- 四周边距 ≥ 64px
|
||||
- 卡片内边距 ≥ 32px
|
||||
- 段落间距 ≥ 24px
|
||||
- 元素组间距 ≥ 40px
|
||||
@@ -1,7 +1,8 @@
|
||||
# PPT 美观设计规范 · 卡若AI
|
||||
|
||||
> **定位**:PPT 生成 = python-pptx 能力 + **本美观规范**;生成初版后套用设计 token,提升可读性与专业感。
|
||||
> **参考**:v0 前端工作流(规格→生成→套规范→验收)、GitHub python-pptx、agentskills pptx、小学绘本 PPT 设计最佳实践。
|
||||
> **参考**:**Apple Keynote 四原则**(亲密性、对齐、对比、重复)、v0 前端、GitHub python-pptx。
|
||||
> **升级**:见 `PPT美观升级_Apple原则.md`(少即是多、大量留白、6×6 规则)。
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -3,105 +3,111 @@
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=1280, height=720">
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet">
|
||||
<style>
|
||||
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||||
body { font-family: 'Inter', -apple-system, sans-serif; -webkit-font-smoothing: antialiased; }
|
||||
body { font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'SF Pro Display', sans-serif; -webkit-font-smoothing: antialiased; }
|
||||
.slide {
|
||||
width: 1280px; height: 720px;
|
||||
display: flex; flex-direction: column;
|
||||
padding: 48px 56px;
|
||||
background: linear-gradient(165deg, #F2F2F7 0%, #E8E8ED 50%, #F5F5FA 100%);
|
||||
padding: 64px 80px;
|
||||
background: linear-gradient(160deg, #F5F5FA 0%, #EBEBF0 35%, #F0F0F5 100%);
|
||||
position: relative; overflow: hidden;
|
||||
}
|
||||
.slide::before {
|
||||
content: ''; position: absolute; top: -30%; right: -20%;
|
||||
width: 60%; height: 80%;
|
||||
background: radial-gradient(circle, rgba(120,180,220,0.12) 0%, transparent 70%);
|
||||
content: ''; position: absolute; top: -40%; right: -25%;
|
||||
width: 70%; height: 90%;
|
||||
background: radial-gradient(ellipse, rgba(0,122,255,0.08) 0%, transparent 60%);
|
||||
pointer-events: none;
|
||||
}
|
||||
.glass {
|
||||
background: rgba(255,255,255,0.65);
|
||||
backdrop-filter: blur(40px); -webkit-backdrop-filter: blur(40px);
|
||||
border: 1px solid rgba(255,255,255,0.5);
|
||||
border-radius: 24px;
|
||||
box-shadow: 0 4px 24px rgba(0,0,0,0.04), 0 0 0 1px rgba(255,255,255,0.5) inset;
|
||||
background: rgba(255,255,255,0.6);
|
||||
backdrop-filter: blur(48px); -webkit-backdrop-filter: blur(48px);
|
||||
border: 1px solid rgba(255,255,255,0.7);
|
||||
border-radius: 28px;
|
||||
box-shadow: 0 8px 32px rgba(0,0,0,0.04), 0 0 0 1px rgba(255,255,255,0.8) inset;
|
||||
}
|
||||
.glass-strong {
|
||||
background: rgba(255,255,255,0.75);
|
||||
backdrop-filter: blur(48px); -webkit-backdrop-filter: blur(48px);
|
||||
border: 1px solid rgba(255,255,255,0.6);
|
||||
border-radius: 28px;
|
||||
box-shadow: 0 8px 32px rgba(0,0,0,0.06), 0 0 0 1px rgba(255,255,255,0.6) inset;
|
||||
background: rgba(255,255,255,0.72);
|
||||
backdrop-filter: blur(56px); -webkit-backdrop-filter: blur(56px);
|
||||
border: 1px solid rgba(255,255,255,0.75);
|
||||
border-radius: 32px;
|
||||
box-shadow: 0 12px 40px rgba(0,0,0,0.06), 0 0 0 1px rgba(255,255,255,0.9) inset;
|
||||
}
|
||||
.accent { color: #007AFF; }
|
||||
.text-dark { color: #1D1D1F; }
|
||||
.text-muted { color: #6E6E73; }
|
||||
.img-wrap { border-radius: 16px; overflow: hidden; box-shadow: 0 4px 20px rgba(0,0,0,0.08); }
|
||||
.img-wrap img { width: 100%; height: 100%; object-fit: cover; }
|
||||
h1 { font-size: 44px; font-weight: 700; letter-spacing: -0.02em; }
|
||||
h2 { font-size: 26px; font-weight: 600; letter-spacing: -0.01em; }
|
||||
.text-muted { color: #8E8E93; }
|
||||
.img-wrap {
|
||||
border-radius: 20px; overflow: hidden;
|
||||
box-shadow: 0 8px 32px rgba(0,0,0,0.12), 0 0 0 1px rgba(0,0,0,0.04);
|
||||
}
|
||||
.img-wrap img { width: 100%; height: 100%; object-fit: cover; display: block; }
|
||||
h1 { font-size: 52px; font-weight: 700; letter-spacing: -0.03em; line-height: 1.15; }
|
||||
h2 { font-size: 20px; font-weight: 600; letter-spacing: 0.02em; text-transform: uppercase; color: #007AFF; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- 1. 封面 -->
|
||||
<div class="slide" id="slide-1" style="flex-direction: row; align-items: center; gap: 48px;">
|
||||
<div class="img-wrap" style="width: 360px; height: 360px; flex-shrink: 0;">
|
||||
<!-- 1. 封面:一页一主题,大留白 -->
|
||||
<div class="slide" id="slide-1" style="justify-content: center; align-items: center; text-align: center;">
|
||||
<div class="img-wrap" style="width: 280px; height: 280px; margin-bottom: 48px;">
|
||||
<img src="file:///Users/karuo/Documents/卡若Ai的文件夹/图片/karuo_profile_cover.png" alt="卡若">
|
||||
</div>
|
||||
<div class="glass-strong px-12 py-10 flex-1">
|
||||
<h1 class="text-dark mb-2">卡若</h1>
|
||||
<p class="text-muted text-xl mb-4" style="font-weight: 500;">私域运营与项目变现创业者</p>
|
||||
<p class="text-dark text-lg" style="line-height: 1.6;">五行营销 · 云阿米巴 · 个人数字管家</p>
|
||||
<h1 class="text-dark" style="margin-bottom: 16px;">卡若</h1>
|
||||
<p class="text-muted" style="font-size: 24px; font-weight: 500; letter-spacing: 0.02em;">私域运营 · 云阿米巴 · 个人数字管家</p>
|
||||
</div>
|
||||
|
||||
<!-- 2. 卡若是谁:少即是多,大字号 -->
|
||||
<div class="slide" id="slide-2" style="justify-content: center;">
|
||||
<h2 style="margin-bottom: 32px;">卡若是谁</h2>
|
||||
<div class="glass-strong" style="padding: 48px 56px; max-width: 900px;">
|
||||
<p class="text-dark" style="font-size: 26px; line-height: 1.7; font-weight: 500;">专注私域运营与项目变现的创业者</p>
|
||||
<p class="text-muted" style="font-size: 20px; line-height: 1.8; margin-top: 28px;">五行营销方法论 · 云阿米巴分润 · 卡若AI 数字管家</p>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 2. 卡若是谁 -->
|
||||
<div class="slide" id="slide-2">
|
||||
<h2 class="accent mb-5">卡若是谁</h2>
|
||||
<div class="glass p-8 flex-1 flex flex-col justify-center">
|
||||
<p class="text-dark text-lg mb-4" style="line-height: 1.8;">卡若是专注私域运营与项目变现的创业者,拥有五行营销方法论与独创的「云阿米巴」分润模式。</p>
|
||||
<p class="text-dark text-lg mb-4" style="line-height: 1.8;">核心能力:私域运营、技术公司主理、优质变现项目挖掘;擅长 Java、React、私域系统架构。</p>
|
||||
<p class="text-dark text-lg" style="line-height: 1.8;">卡若AI 是卡若的个人数字管家与智能大总管,5 负责人、14 成员、53 技能,平台无关。</p>
|
||||
|
||||
<!-- 3. 五行架构:亲密性 + 对齐 -->
|
||||
<div class="slide" id="slide-3" style="flex-direction: row; align-items: center; gap: 56px;">
|
||||
<div style="flex: 1; max-width: 520px;">
|
||||
<h2 style="margin-bottom: 40px;">五行架构</h2>
|
||||
<div class="glass" style="padding: 40px 44px;">
|
||||
<div style="display: grid; gap: 20px; font-size: 19px; line-height: 1.6; color: #1D1D1F;">
|
||||
<div><strong style="color: #007AFF;">金</strong> 卡资 · 稳了 · 金仓 金盾</div>
|
||||
<div><strong style="color: #007AFF;">水</strong> 卡人 · 搞定了 · 水溪 水泉 水桥</div>
|
||||
<div><strong style="color: #007AFF;">木</strong> 卡木 · 搞起 · 木叶 木根 木果</div>
|
||||
<div><strong style="color: #007AFF;">火</strong> 卡火 · 让我想想 · 火炬 火锤 火眼 火种</div>
|
||||
<div><strong style="color: #007AFF;">土</strong> 卡土 · 先算账 · 土基 土砖 土渠 土簿</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 3. 五行架构 -->
|
||||
<div class="slide" id="slide-3" style="flex-direction: row; gap: 40px;">
|
||||
<div class="glass p-6 flex-1">
|
||||
<h2 class="accent mb-4">五行架构</h2>
|
||||
<ul style="list-style: none; font-size: 17px; line-height: 2; color: #1D1D1F;">
|
||||
<li><strong>卡资(金)</strong> 稳了。 → 金仓、金盾</li>
|
||||
<li><strong>卡人(水)</strong> 搞定了。 → 水溪、水泉、水桥</li>
|
||||
<li><strong>卡木(木)</strong> 搞起! → 木叶、木根、木果</li>
|
||||
<li><strong>卡火(火)</strong> 让我想想… → 火炬、火锤、火眼、火种</li>
|
||||
<li><strong>卡土(土)</strong> 先算账。 → 土基、土砖、土渠、土簿</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="img-wrap" style="width: 420px; height: 380px; flex-shrink: 0;">
|
||||
<div class="img-wrap" style="width: 460px; height: 400px; flex-shrink: 0;">
|
||||
<img src="file:///Users/karuo/Documents/卡若Ai的文件夹/图片/karuo_wuxing.png" alt="五行">
|
||||
</div>
|
||||
</div>
|
||||
<!-- 4. 云阿米巴 -->
|
||||
<div class="slide" id="slide-4" style="flex-direction: row; gap: 40px;">
|
||||
<div class="img-wrap" style="width: 400px; height: 360px; flex-shrink: 0;">
|
||||
|
||||
<!-- 4. 云阿米巴:对比突出关键点 -->
|
||||
<div class="slide" id="slide-4" style="flex-direction: row; align-items: center; gap: 56px;">
|
||||
<div class="img-wrap" style="width: 440px; height: 380px; flex-shrink: 0;">
|
||||
<img src="file:///Users/karuo/Documents/卡若Ai的文件夹/图片/karuo_yun_amiba.png" alt="云阿米巴">
|
||||
</div>
|
||||
<div class="glass p-6 flex-1">
|
||||
<h2 class="accent mb-4">云阿米巴模式</h2>
|
||||
<ul style="list-style: none; font-size: 17px; line-height: 2; color: #1D1D1F;">
|
||||
<li>① 分不属于对方的钱</li>
|
||||
<li>② 按创造价值分钱</li>
|
||||
<li>③ 用稳定流量 + 便捷私域体系绑定合作方</li>
|
||||
<li>拒绝分股份,现金激励更有效</li>
|
||||
</ul>
|
||||
<div style="flex: 1; max-width: 580px;">
|
||||
<h2 style="margin-bottom: 40px;">云阿米巴</h2>
|
||||
<div class="glass-strong" style="padding: 40px 48px;">
|
||||
<div style="font-size: 22px; line-height: 2; color: #1D1D1F;">
|
||||
<p style="margin-bottom: 16px;">分不属于对方的钱</p>
|
||||
<p style="margin-bottom: 16px;">按创造价值分钱</p>
|
||||
<p style="margin-bottom: 16px;">流量 + 私域体系绑定合作方</p>
|
||||
<p class="text-muted" style="font-size: 18px; margin-top: 24px;">现金激励 · 不分股份</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 5. 资源与联系 -->
|
||||
<div class="slide" id="slide-5">
|
||||
<h2 class="accent mb-5">资源与联系</h2>
|
||||
<div class="glass p-8 flex-1 flex flex-col justify-center">
|
||||
<p class="text-dark text-lg mb-4" style="line-height: 1.8;"><strong>流量资源</strong>:创业者矩阵账号,日播放量 >10000,厦门本地创业者为核心受众。</p>
|
||||
<p class="text-dark text-lg mb-4" style="line-height: 1.8;"><strong>团队</strong>:IP 团队 + 研发团队 + 运营团队「私域银行」。</p>
|
||||
<p class="text-dark text-lg" style="line-height: 1.8;"><strong>联系</strong>:电话 15880802661 · 微信 28533368</p>
|
||||
|
||||
<!-- 5. 联系:极简收尾 -->
|
||||
<div class="slide" id="slide-5" style="justify-content: center; align-items: center; text-align: center;">
|
||||
<h2 style="margin-bottom: 48px;">联系</h2>
|
||||
<div class="glass-strong" style="padding: 48px 80px;">
|
||||
<p class="text-dark" style="font-size: 28px; font-weight: 600; margin-bottom: 16px;">15880802661</p>
|
||||
<p class="text-muted" style="font-size: 22px;">微信 28533368</p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
@@ -3,103 +3,87 @@
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=1280, height=720">
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet">
|
||||
<style>
|
||||
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||||
body { font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif; -webkit-font-smoothing: antialiased; }
|
||||
body { font-family: 'Inter', -apple-system, sans-serif; -webkit-font-smoothing: antialiased; }
|
||||
.slide {
|
||||
width: 1280px; height: 720px;
|
||||
display: flex; flex-direction: column;
|
||||
padding: 48px 56px;
|
||||
background: linear-gradient(165deg, #F2F2F7 0%, #E8E8ED 50%, #F5F5FA 100%);
|
||||
padding: 64px 80px;
|
||||
background: linear-gradient(160deg, #F5F5FA 0%, #EBEBF0 35%, #F0F0F5 100%);
|
||||
position: relative; overflow: hidden;
|
||||
}
|
||||
.slide::before {
|
||||
content: '';
|
||||
position: absolute; top: -30%; right: -20%;
|
||||
width: 60%; height: 80%;
|
||||
background: radial-gradient(circle, rgba(120,180,220,0.12) 0%, transparent 70%);
|
||||
content: ''; position: absolute; top: -40%; right: -25%;
|
||||
width: 70%; height: 90%;
|
||||
background: radial-gradient(ellipse, rgba(0,122,255,0.08) 0%, transparent 60%);
|
||||
pointer-events: none;
|
||||
}
|
||||
.glass {
|
||||
background: rgba(255,255,255,0.65);
|
||||
backdrop-filter: blur(40px);
|
||||
-webkit-backdrop-filter: blur(40px);
|
||||
border: 1px solid rgba(255,255,255,0.5);
|
||||
border-radius: 24px;
|
||||
box-shadow: 0 4px 24px rgba(0,0,0,0.04), 0 0 0 1px rgba(255,255,255,0.5) inset;
|
||||
background: rgba(255,255,255,0.6);
|
||||
backdrop-filter: blur(48px); -webkit-backdrop-filter: blur(48px);
|
||||
border: 1px solid rgba(255,255,255,0.7);
|
||||
border-radius: 28px;
|
||||
box-shadow: 0 8px 32px rgba(0,0,0,0.04), 0 0 0 1px rgba(255,255,255,0.8) inset;
|
||||
}
|
||||
.glass-strong {
|
||||
background: rgba(255,255,255,0.75);
|
||||
backdrop-filter: blur(48px);
|
||||
-webkit-backdrop-filter: blur(48px);
|
||||
border: 1px solid rgba(255,255,255,0.6);
|
||||
border-radius: 28px;
|
||||
box-shadow: 0 8px 32px rgba(0,0,0,0.06), 0 0 0 1px rgba(255,255,255,0.6) inset;
|
||||
background: rgba(255,255,255,0.72);
|
||||
backdrop-filter: blur(56px); -webkit-backdrop-filter: blur(56px);
|
||||
border: 1px solid rgba(255,255,255,0.75);
|
||||
border-radius: 32px;
|
||||
box-shadow: 0 12px 40px rgba(0,0,0,0.06), 0 0 0 1px rgba(255,255,255,0.9) inset;
|
||||
}
|
||||
.accent { color: #007AFF; }
|
||||
.text-dark { color: #1D1D1F; }
|
||||
.text-muted { color: #6E6E73; }
|
||||
h1 { font-size: 48px; font-weight: 700; letter-spacing: -0.02em; }
|
||||
h2 { font-size: 28px; font-weight: 600; letter-spacing: -0.01em; }
|
||||
.text-muted { color: #8E8E93; }
|
||||
h1 { font-size: 52px; font-weight: 700; letter-spacing: -0.03em; }
|
||||
h2 { font-size: 20px; font-weight: 600; letter-spacing: 0.02em; text-transform: uppercase; color: #007AFF; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- 1. 封面 -->
|
||||
<div class="slide" id="slide-1" style="justify-content: center; align-items: center;">
|
||||
<div class="glass-strong px-20 py-14 text-center">
|
||||
<h1 class="text-dark mb-3">卡若复盘</h1>
|
||||
<p class="text-muted text-2xl" style="font-weight: 500;">2026-02-23</p>
|
||||
<div class="glass-strong" style="padding: 56px 72px; text-align: center;">
|
||||
<h1 class="text-dark" style="margin-bottom: 20px;">卡若复盘</h1>
|
||||
<p class="text-muted" style="font-size: 26px; font-weight: 500;">2026-02-23</p>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 2. 目标 -->
|
||||
<div class="slide" id="slide-2">
|
||||
<h2 class="accent mb-6">🎯 目标·结果·达成率</h2>
|
||||
<div class="glass p-8 flex-1 flex flex-col justify-center">
|
||||
<ul style="list-style: none; font-size: 20px; line-height: 1.8; color: #1D1D1F;">
|
||||
<li style="margin-bottom: 12px;">① PPT制作 Skill 创建与美观规范更新:目标完成,<strong>达成率 100%</strong></li>
|
||||
<li style="margin-bottom: 12px;">② 天恩和乖乖绘本 PPT:生成并优化(黄底、边框、图片说明),<strong>达成率 100%</strong></li>
|
||||
<li>③ 7 张图片生成「我的狗狗乖乖」PPT + 第一页修改,<strong>达成率 100%</strong></li>
|
||||
</ul>
|
||||
<div class="slide" id="slide-2" style="justify-content: center;">
|
||||
<h2 style="margin-bottom: 40px;">目标 · 结果 · 达成率</h2>
|
||||
<div class="glass-strong" style="padding: 48px 56px; max-width: 860px;">
|
||||
<div style="font-size: 22px; line-height: 2; color: #1D1D1F;">
|
||||
<p>PPT Skill 创建 · 达成率 100%</p>
|
||||
<p>天恩乖乖绘本 · 达成率 100%</p>
|
||||
<p>我的狗狗乖乖 PPT · 达成率 100%</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 3. 过程 -->
|
||||
<div class="slide" id="slide-3">
|
||||
<h2 class="accent mb-6">📌 过程</h2>
|
||||
<div class="glass p-8 flex-1 flex flex-col justify-center">
|
||||
<ol style="font-size: 18px; line-height: 1.9; color: #1D1D1F; padding-left: 1.2em;">
|
||||
<li style="margin-bottom: 10px;">创建 PPT制作 Skill,归属木果;融合 agentskills pptx、python-pptx,注册 SKILL_REGISTRY。</li>
|
||||
<li style="margin-bottom: 10px;">新增《PPT美观设计规范》,借鉴 v0 式流程;打包基因胶囊。</li>
|
||||
<li style="margin-bottom: 10px;">编写天恩乖乖绘本脚本,生成黄底、图片边框、每图配说明的 PPT。</li>
|
||||
<li style="margin-bottom: 10px;">7 张参考图生成「我的狗狗乖乖」PPT;修改第一页(二年四班思浩吉、单圆女孩)。</li>
|
||||
<li>按 v0/React 毛玻璃风格生成复盘 PPT。</li>
|
||||
</ol>
|
||||
<div class="slide" id="slide-3" style="justify-content: center;">
|
||||
<h2 style="margin-bottom: 40px;">过程</h2>
|
||||
<div class="glass" style="padding: 44px 56px; max-width: 900px;">
|
||||
<div style="font-size: 20px; line-height: 1.9; color: #1D1D1F;">
|
||||
<p style="margin-bottom: 16px;">① 创建 PPT Skill · 融合 agentskills · 注册</p>
|
||||
<p style="margin-bottom: 16px;">② 美观规范 · v0 式流程 · 基因胶囊</p>
|
||||
<p style="margin-bottom: 16px;">③ 天恩乖乖绘本 · 7 张图 PPT · 第一页修改</p>
|
||||
<p>④ 毛玻璃风格复盘 PPT</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 4. 反思 -->
|
||||
<div class="slide" id="slide-4">
|
||||
<h2 class="accent mb-6">💡 反思</h2>
|
||||
<div class="glass p-8 flex-1 flex flex-col justify-center">
|
||||
<ul style="list-style: none; font-size: 18px; line-height: 1.9; color: #1D1D1F;">
|
||||
<li style="margin-bottom: 14px;">① 做得好的:PPT Skill 与美观规范可复用;v0 式流程迁移到 PPT 工作流有效。</li>
|
||||
<li style="margin-bottom: 14px;">② 可改进:第一页图片修改依赖 Pillow 裁剪,若有原素材可更精准。</li>
|
||||
<li>③ 绘本风 + 毛玻璃风已验证,可沉淀为模板。</li>
|
||||
</ul>
|
||||
<div class="slide" id="slide-4" style="justify-content: center;">
|
||||
<h2 style="margin-bottom: 40px;">反思</h2>
|
||||
<div class="glass" style="padding: 44px 56px; max-width: 860px;">
|
||||
<div style="font-size: 20px; line-height: 1.9; color: #1D1D1F;">
|
||||
<p style="margin-bottom: 20px;">做得好的:Skill 可复用 · v0 流程有效</p>
|
||||
<p style="margin-bottom: 20px;">可改进:Pillow 裁剪 → 原素材更精准</p>
|
||||
<p>绘本 + 毛玻璃 可沉淀为模板</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 5. 总结+下一步 -->
|
||||
<div class="slide" id="slide-5">
|
||||
<h2 class="accent mb-4">📝 总结</h2>
|
||||
<div class="glass p-6 mb-5">
|
||||
<p style="font-size: 18px; line-height: 1.7; color: #1D1D1F;">PPT 制作能力已纳入卡若AI,绘本风与复盘风模板可复用;规格→生成→套规范→验收 流程闭环。</p>
|
||||
</div>
|
||||
<h2 class="accent mb-4" style="font-size: 24px;">▶ 下一步执行</h2>
|
||||
<div class="glass p-6 flex-1">
|
||||
<ul style="list-style: none; font-size: 18px; line-height: 1.8; color: #1D1D1F;">
|
||||
<li style="margin-bottom: 8px;">① 后续绘本/汇报类 PPT 可直接调用 PPT制作 Skill。</li>
|
||||
<li style="margin-bottom: 8px;">② 复盘 PPT 模板可固化为脚本,支持 v0/React 毛玻璃 → 截图 → 导出 PPT。</li>
|
||||
<li>③ 未完成:无。</li>
|
||||
</ul>
|
||||
<div class="slide" id="slide-5" style="justify-content: center;">
|
||||
<h2 style="margin-bottom: 40px;">总结 · 下一步</h2>
|
||||
<div class="glass-strong" style="padding: 48px 56px; max-width: 860px;">
|
||||
<p class="text-dark" style="font-size: 22px; line-height: 1.7; margin-bottom: 32px;">PPT 能力已纳入卡若AI · 规格→生成→套规范→验收</p>
|
||||
<p class="text-muted" style="font-size: 18px;">下一步:绘本/汇报调用 Skill · 模板固化 · 无待办</p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
@@ -109,3 +109,4 @@
|
||||
| 2026-02-23 15:05:27 | 🔄 卡若AI 同步 2026-02-23 15:05 | 更新:卡木、运营中枢工作台 | 排除 >20MB: 8 个 |
|
||||
| 2026-02-23 15:14:09 | 🔄 卡若AI 同步 2026-02-23 15:14 | 更新:卡木、运营中枢工作台 | 排除 >20MB: 8 个 |
|
||||
| 2026-02-23 18:42:25 | 🔄 卡若AI 同步 2026-02-23 18:42 | 更新:总索引与入口、卡木、运营中枢参考资料、运营中枢工作台、运营中枢 | 排除 >20MB: 9 个 |
|
||||
| 2026-02-23 19:13:07 | 🔄 卡若AI 同步 2026-02-23 19:13 | 更新:卡木、火炬、火种知识模型、运营中枢工作台、运营中枢 | 排除 >20MB: 9 个 |
|
||||
|
||||
@@ -112,3 +112,4 @@
|
||||
| 2026-02-23 15:05:27 | 成功 | 成功 | 🔄 卡若AI 同步 2026-02-23 15:05 | 更新:卡木、运营中枢工作台 | 排除 >20MB: 8 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |
|
||||
| 2026-02-23 15:14:09 | 成功 | 成功 | 🔄 卡若AI 同步 2026-02-23 15:14 | 更新:卡木、运营中枢工作台 | 排除 >20MB: 8 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |
|
||||
| 2026-02-23 18:42:25 | 成功 | 成功 | 🔄 卡若AI 同步 2026-02-23 18:42 | 更新:总索引与入口、卡木、运营中枢参考资料、运营中枢工作台、运营中枢 | 排除 >20MB: 9 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |
|
||||
| 2026-02-23 19:13:07 | 成功 | 成功 | 🔄 卡若AI 同步 2026-02-23 19:13 | 更新:卡木、火炬、火种知识模型、运营中枢工作台、运营中枢 | 排除 >20MB: 9 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |
|
||||
|
||||
Reference in New Issue
Block a user