HTML PPT Designer v5.2 / 智能演示文稿设计器
版本: 5.2 架构: LLM 智能设计优先 + 本地模板 fallback + 原文配图提取 + Unsplash 配图 + 真翻页引擎 + 6 种动画 + 视频播客模式 + 内嵌字幕 + 国产 TTS + 纯色设计 + 默认图标装饰 + 控制面板自动隐藏 更新日期: 2026-02-13
🔧 环境变量配置(首次使用必读)
在使用本 Skill 的配图和 AI 功能前,需要配置相应的 API Key。
必需配置
| 功能 | 环境变量 | 申请地址 | 免费额度 |
|---|---|---|---|
| Unsplash 配图 | UNSPLASH_ACCESS_KEY | https://unsplash.com/developers | 50次/小时 |
| AI 生成插图 | ZENMUX_API_KEY | https://zenmux.ai | 按用量计费 |
可选配置(视频导出)
| 功能 | 环境变量 | 申请地址 | 费用 |
|---|---|---|---|
| OpenAI TTS | OPENAI_API_KEY | https://platform.openai.com | ~$0.015/分钟 |
| 火山引擎 TTS | VOLCENGINE_ACCESS_KEY + VOLCENGINE_SECRET_KEY | https://console.volcengine.com | 按用量计费 |
| 智谱 AI TTS | ZHIPUAI_API_KEY | https://open.bigmodel.cn | 按用量计费 |
| Gemini 转录 | GEMINI_API_KEY | https://aistudio.google.com | ~$0.001/分钟 |
配置方法
方法一:临时设置(当前终端会话)
export UNSPLASH_ACCESS_KEY="your-unsplash-access-key"
export ZENMUX_API_KEY="your-zenmux-api-key"
方法二:永久设置(添加到 shell 配置文件)
# 编辑 ~/.zshrc 或 ~/.bashrc
echo 'export UNSPLASH_ACCESS_KEY="your-unsplash-access-key"' >> ~/.zshrc
echo 'export ZENMUX_API_KEY="your-zenmux-api-key"' >> ~/.zshrc
# 重新加载配置
source ~/.zshrc
Unsplash API 申请步骤
- 访问 https://unsplash.com/developers
- 注册/登录 Unsplash 账号
- 点击「New Application」创建新应用
- 填写应用信息(用途可填:PPT 配图)
- 创建后获取 Access Key
- 设置环境变量:
export UNSPLASH_ACCESS_KEY="your-key"
ZENMUX API 申请步骤
- 访问 https://zenmux.ai
- 注册账号并登录
- 在控制台获取 API Key
- 设置环境变量:
export ZENMUX_API_KEY="your-key"
🆕 v4.0 核心架构升级
设计理念转变
旧架构(v3.x):预设 16 种固定模板 → 用户选择 → 填充内容 新架构(v4.0):LLM 分析内容 → 智能生成设计 → 动态创建 CSS
LLM 优先设计流程
用户内容
↓
LLM 分析(内容类型、情感基调、主题色彩、目标受众)
↓
LLM 生成:
├── 色彩方案(主色/辅助色/背景色/文字色)
├── 排版风格(字体组合/字号层级/间距系统)
├── 布局结构(封面/内容页/金句页/结尾页 各自的设计)
├── 视觉元素(装饰图形/分隔线/卡片样式)
└── 动效选择(推荐适合的翻页动画)
↓
生成完整 HTML(内嵌自定义 CSS)
↓
[失败时] → fallback 到本地预设模板
本地模板的新定位
| 场景 | 使用方式 |
|---|---|
| 正常使用 | LLM 动态生成设计,不使用本地模板 |
| 网络问题 | LLM 无法响应时,fallback 到 16 种预设模板 |
| 用户指定 | 用户明确要求某种预设风格时使用 |
| 快速预览 | 需要快速生成时可选使用 |
🎨 LLM 智能设计系统
设计分析维度
LLM 在生成设计前会分析以下维度:
| 维度 | 分析内容 | 影响设计 |
|---|---|---|
| 内容类型 | 演讲/教程/报告/故事/数据/产品 | 整体风格方向 |
| 情感基调 | 严肃/活泼/专业/温暖/科技/艺术 | 色彩和字体选择 |
| 主题领域 | 科技/商业/教育/生活/艺术 | 配色和装饰元素 |
| 目标受众 | 高管/大众/学生/专业人士 | 信息密度和复杂度 |
| 使用场景 | 演讲/分享/汇报/营销 | 视觉冲击力程度 |
动态生成的设计元素
1. 色彩方案
/* LLM 根据内容生成 */
--primary: #XXXXXX; /* 主色 - 品牌感/情感基调 */
--primary-light: #XXXXXX; /* 主色浅版 - hover/强调 */
--secondary: #XXXXXX; /* 辅助色 - 对比/层次 */
--accent: #XXXXXX; /* 点缀色 - 吸引注意 */
--bg-page: #XXXXXX; /* 页面背景 */
--bg-card: #XXXXXX; /* 卡片背景 */
--text-heading: #XXXXXX; /* 标题文字 */
--text-body: #XXXXXX; /* 正文文字 */
--text-muted: #XXXXXX; /* 弱化文字 */
2. 字体系统
/* LLM 推荐字体组合 */
--font-heading: 'Font Name', fallback; /* 标题字体 */
--font-body: 'Font Name', fallback; /* 正文字体 */
--font-accent: 'Font Name', fallback; /* 强调字体(如数字、引用) */
/* 字号层级 */
--text-hero: XXpx; /* 封面大标题 */
--text-h1: XXpx; /* 页面标题 */
--text-h2: XXpx; /* 段落标题 */
--text-body: XXpx; /* 正文 */
--text-small: XXpx; /* 辅助文字 */
3. 布局参数
/* 间距系统 */
--spacing-xs: Xpx;
--spacing-sm: Xpx;
--spacing-md: Xpx;
--spacing-lg: Xpx;
--spacing-xl: Xpx;
/* 圆角 */
--radius: Xpx; /* 卡片圆角 */
--radius-sm: Xpx; /* 小元素圆角 */
/* 阴影 */
--shadow: ...; /* 卡片阴影 */
4. 页面类型设计
每种页面类型都有独立的设计方案:
| 页面类型 | LLM 设计要点 |
|---|---|
| 封面页 | 标题位置、副标题样式、装饰元素、背景处理 |
| 内容页 | 标题样式、正文排版、图文布局、信息层次 |
| 金句页 | 引号样式、文字大小、背景氛围、强调方式 |
| 结尾页 | 结束语设计、联系方式、行动号召 |
📋 完整工作流程
用户输入内容/URL/音视频
↓
[阶段零] 输入处理
├── 纯文本 → 直接进入阶段一
├── 网页 URL → fetch_webpage.py 提取正文 + **下载原始图片** → 进入阶段一
├── YouTube URL → transcribe_audio.py 下载+转录 → 进入阶段一
├── 小宇宙 URL → transcribe_audio.py 下载+转录 → 进入阶段一
└── 音频直链/文件 → transcribe_audio.py 转录 → 进入阶段一
↓
[阶段一] 内容解析
├── 提取标题、副标题、核心观点
├── 分析内容类型和情感基调
└── 拆分幻灯片页面
↓
[阶段二] 设计策略选择(AskUserQuestion)
│
├── D1 LLM 智能设计 ⭐ 推荐
│ └── LLM 根据内容自动生成最佳设计
│
├── D2 指定风格参考
│ └── 用户指定参考风格,LLM 在此基础上定制
│
└── D3 使用预设模板
└── 直接使用 16 种本地模板之一
↓
[阶段三] 输出模式选择(AskUserQuestion)★ 新增
│
├── M1 仅 HTML PPT(默认)
│ └── 标准页数,适合演讲/汇报
│
└── M2 视频播客模式 ⭐ 视频导出推荐
│
├── 内容增强策略:
│ ├── 每个主题拆分为 2-3 个子页面(避免单页停留过久)
│ ├── 增加数据卡片、关键数字、进度条
│ ├── 每页包含:标题 + 核心观点 + 数据/图表 + 引用
│ └── 页数增加 50-100%,内容密度提升
│
└── 配图方案推荐:
├── P1 Unsplash 氛围照片(封面/金句页)
├── P4 Excalidraw 技术图表(数据/流程页)
└── N2 信息图表(数据展示页)
↓
[阶段四] 详细配置(AskUserQuestion)
│
├── 4.1 页数密度(根据模式调整)
│ ├── M1 标准版:10-12 页
│ └── M2 增强版:18-25 页(自动拆分)
│
├── 4.2 配图方案
│ ├── P1 Unsplash 高质量照片
│ ├── P2 AI 生成插图
│ ├── P4 Excalidraw 技术图表 ⭐ 视频播客推荐
│ ├── N1 Iconify 图标方案
│ ├── N2 信息图表方案 ⭐ 视频播客推荐
│ └── N4 纯文字排版
│
└── 4.3 翻页动画
└── Fade / Cinematic / Zoom / Slide / Flip / Cut
↓
[阶段五] 内容增强(M2 视频播客模式专属)
│
├── 拆分长内容为多页
│ └── 原本 1 页 → 拆分为「概念页 + 数据页 + 案例页」
│
├── 添加视觉元素
│ ├── 数据卡片(大数字 + 说明)
│ ├── 时间线/流程图
│ ├── 对比表格
│ └── 引用框/金句框
│
└── 丰富讲解文字
└── 每页生成独立的 data-narration
↓
[阶段六] 配图获取
├── Unsplash 照片搜索
├── AI 生成插图(可选)
├── Excalidraw 技术图表
└── 或纯图标/几何装饰
↓
[阶段七] HTML 生成
├── LLM 生成完整 CSS 样式
├── 内嵌到 HTML 中
├── 添加翻页引擎
└── 生成最终文件(含 data-narration)
↓
[阶段八] 输出与预览
↓
[阶段九] 视频导出(可选,M2 模式强烈推荐)
├── 确认讲解文字(可编辑)
├── 选择配音服务(Edge TTS / OpenAI TTS)
├── 选择语音风格(云健/晓晓/其他)
├── 字幕配置
│ ├── 是否启用内嵌字幕(默认启用)
│ ├── 字幕样式:白字黑背景圆角
│ ├── 字体:PingFang SC(苹果平方)
│ └── 按句子分割,逐句显示,与音频同步
├── 音频驱动截图(每页时长 = 音频时长)
└── 输出 MP4 文件(含内嵌字幕)
🎬 视频播客模式详解
为什么需要视频播客模式?
问题:普通 PPT 转视频时,单页停留 30-50 秒,画面太单调
解决:
- 内容拆分:原本 1 页 → 拆分为 2-3 页
- 视觉丰富:增加数据卡片、图表、引用框
- 节奏感:每页 10-20 秒,翻页更频繁
内容拆分策略
| 原内容类型 | 拆分方案 | 示例 |
|---|---|---|
| 概念介绍 | 概念页 + 案例页 + 总结页 | 「AI 原生代理公司」拆分为 3 页 |
| 数据展示 | 数据概览 + 详细数据 + 趋势分析 | 「市场数据」拆分为 3 页 |
| 方法步骤 | 概述页 + 每步骤独立页 | 「三步法」拆分为 4 页 |
| 对比分析 | 对比概览 + A 方案 + B 方案 + 结论 | 「方案对比」拆分为 4 页 |
视觉元素模板
数据卡片
┌─────────────────────────────────────┐
│ ████████████ $2.5万亿 │
│ ████████████ 每年政府欺诈损失 │
│ ████████████ │
│ 仅医保每年损失数百亿美元 │
└─────────────────────────────────────┘
进度条/时间线
┌─────●───────────────────────────────┐
│ 阶段1 → 阶段2 → 阶段3 │
│ ✓ 进行中 待完成 │
└─────────────────────────────────────┘
引用框
┌─────────────────────────────────────┐
│ "AI 原生公司现在可以比以往 │
│ 更快、更便宜、更有野心地构建。" │
│ — YC RFS │
└─────────────────────────────────────┘
视频模式字号规范(v5.1 新增)
问题:普通 HTML PPT 字号在视频导出后过小,大量留白,用户看不清。
解决方案:视频模式使用 1.5x 字号,减少边距,提高信息密度。
| 元素 | 普通模式 | 视频模式 | 说明 |
|---|---|---|---|
| 封面大标题 | 72px | 108px | 确保视频封面冲击力 |
| 页面标题 | 42px | 64px | 清晰可读 |
| 正文 | 20px | 32px | 视频舒适阅读 |
| 引用文字 | 36px | 52px | 金句突出 |
| 页边距 | 80-120px | 40-60px | 减少留白 |
| 行高 | 1.8 | 2.0 | 视频舒适间距 |
CSS 变量覆盖:
/* 视频模式专用 */
.video-mode {
--text-hero: 108px;
--text-h1: 64px;
--text-h2: 48px;
--text-body: 32px;
--text-small: 24px;
--spacing-page: 48px;
--line-height: 2.0;
}
视频播客模式 AskUserQuestion 模板
{
"questions": [
{
"question": "请选择输出模式(决定内容密度和页数)",
"header": "输出模式",
"multiSelect": false,
"options": [
{
"label": "M1 仅 HTML PPT",
"description": "标准页数(10-12页),适合演讲、汇报、现场展示"
},
{
"label": "M2 视频播客模式 ⭐ 推荐",
"description": "增强页数(18-25页),内容拆分更细,每页10-20秒,适合视频导出"
}
]
}
]
}
🎬 视频导出系统(v3.2 内嵌字幕)
功能概述
将 HTML PPT 幻灯片转换为带配音和字幕的 MP4 视频,支持:
- 音频驱动时长:每页展示时间 = 该页音频实际时长,100% 同步
- 内嵌字幕:白字黑背景圆角样式,按句子分割逐句显示
- 字幕同步:每句字幕时长按字数比例分配,与音频完美同步
- 自动截图:使用 Playwright 高清捕获每页幻灯片
- 智能配音:Edge TTS(免费)或 OpenAI TTS(高质量)
- 多语言支持:中文 / 英文语音
v3.2 核心改进
旧流程(v3.0):
每页 1 张截图 + 完整字幕 → 字幕不随音频滚动
新流程(v3.2):
讲解文字按句子分割 → 每句生成 1 张截图 → 字幕时长按字数分配 → 100% 同步滚动
字幕特性
| 特性 | 说明 |
|---|---|
| 样式 | 白色文字 + 半透明黑色背景 + 12px 圆角 |
| 字体 | PingFang SC(苹果平方),28px |
| 位置 | 底部居中,距离底部 60px |
| 同步方式 | 按句子分割,每句时长 = (该句字数 / 总字数) × 页面音频时长 |
| 最小显示 | 每句至少 1.5 秒 |
依赖安装
# 系统依赖
brew install ffmpeg
# Python 依赖
pip install playwright edge-tts
# 安装浏览器(首次使用)
playwright install chromium
# 如需使用 OpenAI TTS
pip install openai
脚本使用
# 基本用法 - Edge TTS(免费),默认启用字幕
python3 scripts/ppt_to_video.py presentation.html -o output.mp4
# 禁用字幕
python3 scripts/ppt_to_video.py presentation.html --no-subtitle -o output.mp4
# 使用 OpenAI TTS(需配置 OPENAI_API_KEY)
python3 scripts/ppt_to_video.py presentation.html --tts openai -o output.mp4
# 使用火山引擎 TTS(国产推荐)
python3 scripts/ppt_to_video.py presentation.html \
--tts volcengine --voice zh_female_tianmeixiaoyuan -o output.mp4
# 使用智谱 AI TTS
python3 scripts/ppt_to_video.py presentation.html --tts zhipu -o output.mp4
# 使用 Fish Speech(本地部署)
python3 scripts/ppt_to_video.py presentation.html --tts fish -o output.mp4
# 指定语音
python3 scripts/ppt_to_video.py presentation.html \
--voice zh-CN-YunxiNeural -o output.mp4
# 自定义字幕样式
python3 scripts/ppt_to_video.py presentation.html \
--subtitle-fontsize 32 --subtitle-radius 16 -o output.mp4
# 自定义分辨率和帧率
python3 scripts/ppt_to_video.py presentation.html \
--resolution 1280x720 --fps 24 -o output.mp4
# 列出可用语音
python3 scripts/ppt_to_video.py --list-voices
python3 scripts/ppt_to_video.py --list-voices --tts volcengine
# 列出所有 TTS 服务
python3 scripts/ppt_to_video.py --list-services
字幕相关参数
| 参数 | 默认值 | 说明 |
|---|---|---|
--no-subtitle | - | 禁用内嵌字幕 |
--subtitle-font | PingFang SC, Noto Sans SC | 字幕字体 |
--subtitle-fontsize | 28 | 字幕字号(像素) |
--subtitle-radius | 12 | 字幕背景圆角(像素) |
TTS 服务对比
| 服务 | 费用 | 音质 | 速度 | 推荐场景 |
|---|---|---|---|---|
| Edge TTS | 免费 | 良好 | 快 | 日常使用 ⭐ 推荐 |
| OpenAI TTS | ~$0.015/分钟 | 优秀 | 快 | 商业/高质量需求 |
| 火山引擎 | 按量付费 | 优秀 | 快 | 中文专业场景 |
| 智谱 AI | 按量付费 | 优秀 | 快 | 中文专业场景 |
| Fish Speech | 免费 | 良好 | 中 | 本地部署/隐私需求 |
环境变量配置
# OpenAI TTS
export OPENAI_API_KEY="sk-..."
# 火山引擎 TTS(字节跳动)
export VOLCENGINE_ACCESS_KEY="your-access-key"
export VOLCENGINE_SECRET_KEY="your-secret-key"
export VOLCENGINE_APP_ID="your-app-id"
# 智谱 AI TTS
export ZHIPUAI_API_KEY="your-api-key"
# Fish Speech(本地服务)
export FISH_SPEECH_URL="http://localhost:8080"
可用中文语音
Edge TTS(16 种)
| 语音 ID | 描述 |
|---|---|
zh-CN-YunjianNeural | 云健 - 男声,新闻播报 ⭐ 默认 |
zh-CN-XiaoxiaoNeural | 晓晓 - 女声,自然亲切 |
zh-CN-YunxiNeural | 云希 - 男声,年轻活力 |
zh-CN-XiaoyiNeural | 晓伊 - 女声,温柔 |
zh-CN-YunfengNeural | 云枫 - 男声,沉稳 |
zh-CN-YunyangNeural | 云扬 - 男声,专业客服 |
zh-CN-XiaochenNeural | 晓辰 - 女声,新闻 |
zh-CN-XiaohanNeural | 晓涵 - 女声,温暖 |
火山引擎 TTS(8 种)
| 语音 ID | 描述 |
|---|---|
zh_female_tianmeixiaoyuan | 甜美小媛 - 女声,甜美亲切 ⭐ 推荐 |
zh_female_shuangkuaisisi | 爽快思思 - 女声,爽朗 |
zh_female_wanwan | 湾湾 - 女声,台湾腔 |
zh_female_chenshu | 成熟姐姐 - 女声,知性 |
zh_male_chunhou | 醇厚男声 - 男声,稳重 |
zh_male_narration | 解说男声 - 男声,专业 |
zh_male_qingxinnansheng | 清新男声 - 男声,年轻 |
zh_male_huangzhong | 黄钟 - 男声,播音 |
工作流程图(v3.2)
HTML PPT 文件
↓
┌─────────────────────────────────────┐
│ 1. 提取讲解文字 │
│ - 读取 data-narration 属性 │
│ - 或提取页面文本内容 │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ 2. 生成所有音频 │
│ - Edge TTS / OpenAI TTS │
│ - 每页一条音频 │
│ - 使用 ffprobe 获取实际时长 │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ 3. 字幕分割(v3.2 新增) │
│ - 按句号分割讲解文字 │
│ - 按字数比例分配每句时长 │
│ - 确保每句至少 1.5 秒 │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ 4. 带字幕截图(v3.2 新增) │
│ - 每句生成一张截图 │
│ - CSS 渲染字幕到画面上 │
│ - 等待外部图片加载完成 │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ 5. 合成视频 │
│ - 图片序列 → H.264 视频 │
│ - 拼接音频轨道 │
│ - 视频/音频/字幕 100% 同步 │
│ - 输出 MP4 文件 │
└─────────────────────────────────────┘
在幻灯片中自定义
可在 HTML 的 .slide 元素上添加 data-* 属性:
<!-- 自定义讲解文字 -->
<div class="slide" data-narration="这是自定义的讲解文字,会覆盖自动生成的内容">
...
</div>
<!-- 自定义展示时长(毫秒) -->
<div class="slide" data-duration="8000">
...
</div>
🔧 LLM 设计生成 Prompt 模板
设计分析 Prompt
你是一位国际顶级演示文稿设计师。请分析以下内容,并生成最适合的视觉设计方案。
【内容信息】
标题:{title}
类型:{content_type}
情感基调:{emotion}
目标受众:{audience}
主题领域:{domain}
【页面概览】
{slides_overview}
请提供:
1. 设计理念(100字内)
2. 色彩方案(8个颜色值)
3. 字体推荐(中英文各1-2个)
4. 布局特点描述
5. 推荐的翻页动画
CSS 生成 Prompt
基于以下设计规格,生成完整的 CSS 样式:
【设计规格】
{design_spec}
【要求】
1. 使用 CSS 变量定义所有颜色
2. 包含以下页面类型样式:
- .slide-cover(封面页)
- .slide-content(内容页)
- .slide-quote(金句页)
- .slide-ending(结尾页)
3. 包含控制面板样式
4. 包含响应式设计(768px/1024px 断点)
5. 使用 Google Fonts(提供 import 语句)
6. 输出完整可用的 CSS 代码
📦 LLM 设计 JSON 格式规范
完整格式示例
{
"concept": "温暖科技感 - 结合科技主题的冷峻与人文关怀的温度",
"colors": {
"primary": "#2563EB",
"primary_light": "#3B82F6",
"secondary": "#64748B",
"accent": "#F59E0B",
"bg_page": "#0F172A",
"bg_card": "#1E293B",
"bg_section": "#334155",
"text_heading": "#F1F5F9",
"text_body": "#CBD5E1",
"text_muted": "#94A3B8",
"border": "rgba(148, 163, 184, 0.2)"
},
"fonts": {
"heading": "'Inter', 'Noto Sans SC', sans-serif",
"body": "'Inter', 'Noto Sans SC', sans-serif",
"google_fonts_url": "https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Noto+Sans+SC:wght@400;500;700&display=swap"
},
"spacing": {
"xs": "4px",
"sm": "8px",
"md": "16px",
"lg": "32px",
"xl": "64px"
},
"radius": "8px",
"transition": "cinematic",
"layouts": {
"cover": ".slide-cover { background: var(--bg-page); border-bottom: 4px solid var(--primary); }",
"content": ".slide-content .content-grid { gap: 48px; }",
"quote": ".slide-quote .quote-text { font-size: 36px; }",
"ending": ".slide-ending { background: var(--bg-page); border-top: 4px solid var(--accent); }"
}
}
字段说明
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
concept | string | 否 | 设计理念描述,用于日志输出 |
colors | object | 是 | 色彩方案,所有颜色使用 hex 或 rgba |
fonts | object | 是 | 字体设置 |
spacing | object | 否 | 间距系统 |
radius | string | 否 | 圆角大小 |
transition | string | 否 | 默认翻页动画 |
layouts | object | 否 | 各页面类型的自定义 CSS |
最小可用格式
{
"colors": {
"primary": "#1A1A1A",
"bg_page": "#FFFFFF",
"bg_card": "#FFFFFF",
"text_heading": "#1A1A1A",
"text_body": "#333333"
},
"fonts": {
"heading": "'Noto Serif SC', serif",
"body": "'Noto Sans SC', sans-serif",
"google_fonts_url": "https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@400;500;700&family=Noto+Serif+SC:wght@400;600;700&display=swap"
},
"transition": "fade"
}
🆕 v3.2 更新概要
0. 音频/视频语音转录(NEW)
- 支持 YouTube、小宇宙播客、直接音频链接、本地音频文件 作为输入
- 三种转录模式:local(MLX-Whisper 本地免费)/ api(OpenAI)/ gemini(最快最便宜)
- 自动下载音频 → 预处理 → 转录 → 整理文字 → 生成 PPT 大纲
- Apple Silicon Mac 本地运行 Whisper,零成本
- 脚本:
scripts/transcribe_audio.py
1. 16+ 风格系统(4 大类别)
- Classic/Professional:TED 演讲、Apple Keynote、标准 PPT、Gamma、Consulting
- Editorial/Publishing:Editorial 杂志、Swiss 国际、Newspaper 报纸
- Design/Art:Bauhaus、Kinfolk、Muji、Brutalist
- Tech/Future:Neo-Tokyo、Dark Mode、红黑白科技
- Education/Creative:卡通 2.5D、Education 教育
2. Unsplash API 配图
- 集成 Unsplash API,高质量免费照片
- 根据幻灯片内容自动搜索匹配照片
- 支持按风格、颜色、方向筛选
- 自动生成摄影师署名(Unsplash 要求)
3. 6 种真正不同的翻页动画
- Fade:纯透明度淡入淡出
- Slide:水平滑动(translateX)
- Cinematic:缩放+模糊+透明度(电影感)
- Cut:瞬间切换(无过渡)
- Flip:3D 翻转(rotateY)
- Zoom:中心缩放聚焦
4. 配图来源双选
- Unsplash:真实摄影照片(Editorial Photo / Kinfolk 风格等)
- ZMark AI:AI 生成插图(卡通 2.5D / 红黑白科技 / 3D 渲染等)
📋 完整工作流程
用户输入内容/URL/音视频链接/本地文件
↓
[阶段零] 输入类型检测与预处理
├── 纯文本 → 直接进入阶段一
├── 网页 URL → fetch_webpage.py 提取正文 → 进入阶段一
├── YouTube URL → transcribe_audio.py 下载+转录 → 进入阶段一
├── 小宇宙 URL → transcribe_audio.py 下载+转录 → 进入阶段一
├── 音频直链/文件 → transcribe_audio.py 转录 → 进入阶段一
└── 转录模式选择(AskUserQuestion)
├── local 本地 MLX-Whisper(免费,推荐 Apple Silicon)
├── api OpenAI Whisper API($0.006/分钟,快速)
└── gemini Gemini Flash API(~$0.001/分钟,最快)
↓
[阶段一] 内容解析与大纲生成
├── 提取标题、副标题
├── 识别内容类型(演讲/教程/报告/故事/数据展示)
├── 拆分幻灯片页面
└── 生成预览大纲(展示给用户确认)
↓
[阶段二] 风格选择(直接展示 + 用户输入)
│
├── 第一步:在文本中展示完整风格列表(17种)
│ └── 表格形式,包含编号(A1-E2)、名称、特征、适用场景
│
└── 第二步:AskUserQuestion 让用户选择
├── [智能推荐风格] ⭐ 推荐
├── A1 TED 演讲
├── D2 Dark Mode
└── Other — 输入其他风格编号或名称
↓
[阶段三] 详细配置(AskUserQuestion - 多选一次完成)
│
├── 3.1 页数密度
│ ├── S1 精简版(5-8 页)- 快速概览、电梯演讲
│ ├── S2 标准版(10-12 页)- 常规演示 ⭐ 默认
│ └── S3 详细版(15-20 页)- 完整叙事、深度分享
│
├── 3.2 配图方案(★ 最重要,必须询问)
│ │
│ ├── 需要配图
│ │ ├── P1 Unsplash 高质量照片 ⭐ 推荐
│ │ │ └── 自动搜索匹配内容,含摄影师署名
│ │ ├── P2 AI 生成插图
│ │ │ └── 根据 PPT 风格自动生成匹配插图
│ │ ├── P3 混合方案
│ │ │ └── 封面/金句用照片,内容页用图标
│ │ └── P4 Excalidraw 技术图表 ⭐ 技术PPT推荐
│ │ └── 自动生成架构图/流程图/系统图,输出为SVG
│ │
│ └── 不需要配图(纯文字/图示方案)
│ ├── N1 Iconify 图标方案 ⭐ 推荐
│ │ └── 每页配主题图标,视觉丰富度足够
│ ├── N2 信息图表方案
│ │ └── 流程图/时间线/关系图自动生成
│ ├── N3 几何装饰方案
│ │ └── 色块/线条/形状装饰,现代感强
│ └── N4 纯文字排版
│ └── 极简风格,完全依赖排版和字体
│
└── 3.3 翻页动画(可选,有默认值)
├── Fade(淡入淡出)⭐ 默认
├── Cinematic(电影感)- 适合 TED/叙事风格
├── Zoom(缩放聚焦)- 适合科技/数据风格
├── Slide(水平滑动)- 适合教育/教程风格
├── Flip(3D 翻转)- 适合创意/艺术风格
└── Cut(瞬间切换)- 适合 Brutalist/高节奏
↓
[阶段四] 配图获取/生成(⭐ v5.2 智能优先级)
│
├── 优先级 1:原文配图 ⭐ 零成本、最佳匹配
│ └── 网页抓取时已自动下载到 ~/Desktop/ppt_images/
│ └── 直接使用,无需额外请求
│
├── 优先级 2:Unsplash 照片
│ └── 原文无图时使用,fetch_unsplash.py 自动搜索
│
├── 优先级 3:AI 生成插图
│ └── generate_images.py,需要 ZENMUX_API_KEY
│
├── 优先级 4:Excalidraw 技术图表
│ └── 技术内容自动生成架构图/流程图
│
└── 优先级 5:Iconify 图标
└── 始终作为辅助视觉元素
│ ├── 自动识别技术内容页面(架构/流程/系统)
│ ├── 调用 excalidraw skill 生成 .excalidraw JSON
│ ├── 使用 excalidraw_to_svg.py 转换为 SVG
│ └── SVG 直接嵌入 HTML(或 base64 data URI)
├── 图标方案 → Iconify 自动匹配主题图标
└── 返回视觉资源映射表
↓
[阶段五] HTML 生成
├── 加载对应风格模板(templates/)
├── 插入视觉资源(图片/图标/图表)
├── 添加前端交互控制
│ ├── 6 种翻页动画
│ ├── 自动播放(慢/中/快)
│ └── 导航点 + 键盘 + 触摸
└── 生成完整 HTML 文件
↓
[阶段六] 输出与预览
├── 保存到桌面(~/Desktop/)
├── 展示大纲摘要
└── 询问修改意见(可重新选择风格/配图/页数)
↓
[阶段七] 视频导出(可选,AskUserQuestion 询问)
│
├── V1 导出为视频 ⭐ 推荐(分享/发布场景)
│ ├── 选择配音服务
│ │ ├── Edge TTS(免费,16种中文语音)
│ │ └── OpenAI TTS($0.015/分钟,高质量)
│ ├── 选择语音风格
│ │ ├── 云健(男声,新闻播报)⭐ 默认
│ │ ├── 晓晓(女声,自然亲切)
│ │ └── 其他语音...
│ ├── 自动生成/编辑讲解文字
│ ├── ppt_to_video.py 转换
│ └── 输出 MP4(同目录)
│
└── V2 跳过(仅保留 HTML)
🔧 AskUserQuestion 完整配置模板
阶段二:风格选择(直接展示 + 用户输入)
重要:先在文本中展示完整风格列表,然后让用户直接输入选择。
第一步:展示完整风格列表
在回复文本中直接展示所有 17 种风格:
┌─────────────────────────────────────────────────────────────────────┐
│ 🎨 完整风格列表 (17种) — 请输入编号或名称选择 │
├─────────────────────────────────────────────────────────────────────┤
│ Classic/Professional 经典专业 │
│ ├── A1 TED 演讲 ⭐ 叙事演讲 深色背景+大图overlay │
│ ├── A2 Apple Keynote ⭐ 产品发布 极简白底+超大留白 │
│ ├── A3 Typical PPT 商务汇报 深蓝+浅灰标准模板 │
│ ├── A4 Gamma 创业路演 现代卡片+圆角 │
│ └── A5 Consulting 战略咨询 深蓝+金+数据驱动 │
├─────────────────────────────────────────────────────────────────────┤
│ Editorial/Publishing 编辑出版 │
│ ├── B1 Editorial 品牌故事 杂志排版+衬线字体 │
│ ├── B2 Swiss 设计作品 严格网格+红色色带 │
│ └── B3 Newspaper 新闻资讯 报纸版式+多栏文字 │
├─────────────────────────────────────────────────────────────────────┤
│ Design/Art 设计艺术 │
│ ├── C1 Bauhaus 艺术教育 几何色块+红黄蓝三原色 │
│ ├── C2 Kinfolk 生活方式 莫兰迪色调+胶片质感 │
│ ├── C3 Muji 极简品牌 白灰为主+超细线条 │
│ └── C4 Brutalist 先锋设计 粗犷大字+高对比 │
├─────────────────────────────────────────────────────────────────────┤
│ Tech/Future 科技未来 │
│ ├── D1 Neo-Tokyo ⭐ 科技产品 霓虹粉+青+暗黑底+故障艺术 │
│ ├── D2 Dark Mode ⭐ 开发工具 深灰底+冷蓝强调+简洁边框 │
│ └── D3 红黑白科技 国产科技 严格三色+电路风 │
├─────────────────────────────────────────────────────────────────────┤
│ Education/Creative 教育创意 │
│ ├── E1 卡通 2.5D 儿童教育 扁平阴影+多彩圆润 │
│ └── E2 Education ⭐ 在线课程 色彩编码+互动感 │
└─────────────────────────────────────────────────────────────────────┘
💡 根据您的内容类型「{content_type}」,推荐:{recommended_style}
第二步:用户选择(AskUserQuestion + Other 输入)
{
"questions": [{
"question": "请选择视觉风格(可输入编号如 A1/D2 或完整名称)",
"header": "风格选择",
"multiSelect": false,
"options": [
{"label": "[推荐风格] ⭐ 推荐", "description": "[推荐理由]"},
{"label": "A1 TED 演讲", "description": "深色背景+大图overlay,叙事演讲"},
{"label": "D2 Dark Mode", "description": "深灰底+冷蓝强调色,开发者工具"},
{"label": "Other — 输入其他风格", "description": "输入编号(A1-E2)或名称,如:A3、C2 Kinfolk、Neo-Tokyo"}
]
}]
}
用户可能输入的格式:
- 编号:
A1、D2、E1 - 名称:
TED 演讲、Dark Mode、卡通 2.5D - 英文名:
Neo-Tokyo、Editorial、Bauhaus
风格智能推荐映射
┌─────────────────────────────────────────────────────────────────────┐
│ 🎨 完整风格列表 (17种) │
├─────────────────────────────────────────────────────────────────────┤
│ Classic/Professional 经典专业 │
│ ├── A1 TED 演讲 ⭐ 叙事演讲 深色背景+大图overlay │
│ ├── A2 Apple Keynote ⭐ 产品发布 极简白底+超大留白 │
│ ├── A3 Typical PPT 商务汇报 深蓝+浅灰标准模板 │
│ ├── A4 Gamma 创业路演 现代卡片+圆角 │
│ └── A5 Consulting 战略咨询 深蓝+金+数据驱动 │
├─────────────────────────────────────────────────────────────────────┤
│ Editorial/Publishing 编辑出版 │
│ ├── B1 Editorial 品牌故事 杂志排版+衬线字体 │
│ ├── B2 Swiss 设计作品 严格网格+红色色带 │
│ └── B3 Newspaper 新闻资讯 报纸版式+多栏文字 │
├─────────────────────────────────────────────────────────────────────┤
│ Design/Art 设计艺术 │
│ ├── C1 Bauhaus 艺术教育 几何色块+红黄蓝三原色 │
│ ├── C2 Kinfolk 生活方式 莫兰迪色调+胶片质感 │
│ ├── C3 Muji 极简品牌 白灰为主+超细线条 │
│ └── C4 Brutalist 先锋设计 粗犷大字+高对比 │
├─────────────────────────────────────────────────────────────────────┤
│ Tech/Future 科技未来 │
│ ├── D1 Neo-Tokyo ⭐ 科技产品 霓虹粉+青+暗黑底+故障艺术 │
│ ├── D2 Dark Mode ⭐ 开发工具 深灰底+冷蓝强调+简洁边框 │
│ └── D3 红黑白科技 国产科技 严格三色+电路风 │
├─────────────────────────────────────────────────────────────────────┤
│ Education/Creative 教育创意 │
│ ├── E1 卡通 2.5D 儿童教育 扁平阴影+多彩圆润 │
│ └── E2 Education ⭐ 在线课程 色彩编码+互动感 │
└─────────────────────────────────────────────────────────────────────┘
阶段三:详细配置
{
"questions": [
{
"question": "希望生成多少页的演示文稿?",
"header": "页数密度",
"multiSelect": false,
"options": [
{"label": "精简版 (5-8 页)", "description": "核心观点提炼,适合快速分享"},
{"label": "标准版 (10-12 页)", "description": "完整叙事,适合演讲汇报"},
{"label": "详细版 (15-20 页)", "description": "深度解读,适合完整展示"}
]
},
{
"question": "是否需要配图?(重要)",
"header": "配图方案",
"multiSelect": false,
"options": [
{"label": "Unsplash 高质量照片", "description": "自动搜索匹配内容的专业照片"},
{"label": "AI 生成插图", "description": "根据风格自动生成匹配插图"},
{"label": "Excalidraw 技术图表", "description": "自动生成架构图/流程图/系统图,技术PPT推荐"},
{"label": "Iconify 图标方案", "description": "每页配主题图标,无需等待"},
{"label": "纯文字排版", "description": "极简风格,完全依赖排版"}
]
},
{
"question": "翻页动画偏好?",
"header": "动画效果",
"multiSelect": false,
"options": [
{"label": "Fade 淡入淡出", "description": "简洁优雅,适合大多数场景"},
{"label": "Cinematic 电影感", "description": "缩放+模糊,叙事感强"},
{"label": "Zoom 缩放聚焦", "description": "视觉冲击力强"},
{"label": "Slide 水平滑动", "description": "经典翻页感"}
]
}
]
}
🎯 内容类型 → 风格推荐映射
| 内容类型 | 推荐风格 | 备选风格 | 推荐配图 |
|---|---|---|---|
| 演讲/叙事 | A1 TED 演讲 | D1 Neo-Tokyo, B1 Editorial | P1 Unsplash |
| 产品发布 | A2 Apple Keynote | A4 Gamma | P1 Unsplash |
| 商务汇报 | A3 Typical PPT | A5 Consulting | N1 图标 |
| 数据报告 | A5 Consulting | B3 Newspaper | N2 信息图表 |
| 科技主题 | D1 Neo-Tokyo | D2 Dark Mode, D3 红黑白科技 | P4 Excalidraw |
| 开发者/工具 | D2 Dark Mode | D1 Neo-Tokyo | P4 Excalidraw |
| 架构设计 | A5 Consulting | D2 Dark Mode | P4 Excalidraw |
| 教育/教程 | E2 Education | E1 卡通 2.5D | P1/P2 |
| 品牌故事 | B1 Editorial | C2 Kinfolk | |
| 生活方式 | C2 Kinfolk | C3 Muji | |
| 艺术创意 | C1 Bauhaus | C4 Brutalist | |
| 新闻资讯 | B3 Newspaper | B2 Swiss | |
| 极简主义 | C3 Muji | A2 Apple Keynote |
🖼️ 配图方案详细说明
需要配图
| 方案 | 来源 | 适用风格 | 特点 |
|---|---|---|---|
| P1 Unsplash | 真实摄影 | A1/A2/B1/B2/B3/C2 | 高质量免费、需署名 |
| P2 AI 生成 | ZMark AI | D1/D3/E1/C1/C4 | 风格匹配度高、生成时间较长 |
| P3 混合方案 | 两者结合 | 全部 | 灵活性最高 |
| P4 Excalidraw | 自动生成 SVG | D1/D2/D3/A5/E2 | 技术图表、架构图、流程图 |
Excalidraw 技术图表方案 (P4)
适用场景:技术演示、架构汇报、系统设计、开发文档
工作流程:
技术内容页面
↓
LLM 识别图表类型(架构图/流程图/时序图/ER图等)
↓
调用 excalidraw skill 生成 .excalidraw JSON
↓
使用 excalidraw_to_svg.py 转换为 SVG
↓
SVG 直接嵌入 HTML(<svg> 标签)或 base64 data URI
支持的图表类型:
| 图表类型 | 触发关键词 | 元素组合 |
|---|---|---|
| 系统架构图 | 架构、系统、微服务 | 矩形+箭头+数据库图标 |
| 数据流程图 | 流程、数据流、管道 | 矩形+箭头+处理节点 |
| 时序图 | 时序、交互、调用 | 矩形+虚线箭头 |
| ER 图 | 实体、关系、数据库 | 矩形+菱形+连接线 |
| 网络拓扑 | 网络、拓扑、节点 | 椭圆+矩形+连线 |
| 组件图 | 组件、模块、依赖 | 矩形+依赖箭头 |
脚本用法:
# 基本转换
python3 scripts/excalidraw_to_svg.py input.excalidraw -o output.svg
# 输出为 base64 data URI(适合直接嵌入 HTML)
python3 scripts/excalidraw_to_svg.py input.excalidraw --base64
# 输出为 HTML img 标签
python3 scripts/excalidraw_to_svg.py input.excalidraw --embed
# 暗色主题
python3 scripts/excalidraw_to_svg.py input.excalidraw --theme dark -o output.svg
HTML 嵌入方式:
<!-- 方式1:直接嵌入 SVG(推荐,可缩放) -->
<div class="diagram-container">
<svg viewBox="0 0 800 600">
<!-- SVG 内容 -->
</svg>
</div>
<!-- 方式2:base64 data URI -->
<img src="data:image/svg+xml;base64,..." alt="系统架构图">
<!-- 方式3:外部文件引用 -->
<img src="diagrams/architecture.svg" alt="系统架构图">
自动识别规则:
LLM 会根据页面内容自动判断是否需要生成技术图表:
| 内容特征 | 图表类型 |
|---|---|
| 包含"架构"、"组件"、"服务" | 系统架构图 |
| 包含"流程"、"步骤"、"→" | 流程图 |
| 包含"数据库"、"表"、"字段" | ER 图 |
| 包含"API"、"请求"、"响应" | 时序图 |
| 包含"模块"、"依赖"、"import" | 组件依赖图 |
不需要配图
| 方案 | 实现方式 | 适用风格 | 特点 |
|---|---|---|---|
| N1 图标方案 | Iconify 图标库 | 全部 | 生成快速、视觉丰富 |
| N2 信息图表 | 自动生成流程图/时间线 | A3/A5/E2 | 适合数据和流程 |
| N3 几何装饰 | CSS 色块/线条 | C1/C3/C4 | 现代感强 |
| N4 纯文字+图标 | 排版+字体+轻量图标 | A2/C3/Muji | 极简但不单调 |
重要(v5.1):即使选择 N4 纯文字方案,也应默认添加轻量级 Iconify 图标装饰,避免页面过于单调。图标应:
- 放置在标题旁作为视觉锚点
- 用于列表项前的装饰
- 选择与内容主题相关的图标
- 保持克制,每页 1-3 个图标即可
Iconify 图标自动匹配规则
| 页面类型 | 搜索关键词示例 |
|---|---|
| 封面页 | rocket, star, lightbulb |
| 概念介绍 | brain, idea, puzzle |
| 数据展示 | chart, graph, analytics |
| 流程步骤 | arrow-right, flow, process |
| 问题/挑战 | warning, alert, question |
| 解决方案 | check, shield, tool |
| 金句页 | quote, message, speech |
| 结尾页 | heart, thumbs-up, celebrate |
🎨 风格系统(16+ 种)
风格快速选择表
| 编号 | 风格名称 | 配色特征 | 适用场景 |
|---|---|---|---|
| Classic/Professional | |||
| A1 | TED 演讲 | 大图+精简文字、深色 overlay | 叙事、演讲 |
| A2 | Apple Keynote | 极简白底、大标题、留白>60% | 产品发布 |
| A3 | Typical PPT | 深蓝+浅灰、标准模板 | 商务汇报 |
| A4 | Gamma | 现代卡片、圆角、柔和阴影 | 创业路演 |
| A5 | Consulting | 深蓝+金、等距投影、数据驱动 | 战略咨询 |
| Editorial/Publishing | |||
| B1 | Editorial | 杂志排版、衬线字体、分栏 | 品牌故事 |
| B2 | Swiss Style | 网格系统、无衬线、不对称 | 设计作品 |
| B3 | Newspaper | 报纸版式、黑白灰+单点缀 | 新闻资讯 |
| Design/Art | |||
| C1 | Bauhaus | 几何色块、红黄蓝三原色 | 艺术教育 |
| C2 | Kinfolk | 温暖米色/棕/橄榄、胶片质感 | 生活方式 |
| C3 | Muji | 白灰为主、超细线条、日式简约 | 极简品牌 |
| C4 | Brutalist | 原始粗犷、大字体、高对比 | 先锋设计 |
| Tech/Future | |||
| D1 | Neo-Tokyo | 霓虹紫/粉、暗黑底、故障艺术 | 科技产品 |
| D2 | Dark Mode | 深灰底、冷蓝强调色、简洁边框 | 开发者工具 |
| D3 | 红黑白科技 | #E63946红+纯黑+纯白 | 国产科技 |
| Education/Creative | |||
| E1 | 卡通 2.5D | 扁平+阴影、多彩、圆润图标 | 儿童教育 |
| E2 | Education | 色彩编码、互动元素暗示 | 在线课程 |
🎨 风格 CSS 变量完整定义
A1 - TED 演讲风格
:root {
--primary: #E62B1E;
--primary-light: #FF4136;
--secondary: #2C2C2C;
--accent: #FFFFFF;
--bg-page: #1A1A1A;
--bg-card: #2C2C2C;
--bg-section: #333333;
--text-heading: #FFFFFF;
--text-body: #E0E0E0;
--text-muted: #999999;
--border: #444444;
}
特征:深色背景、大尺寸全屏图片、overlay 半透明黑色叠加文字、字号巨大(Hero 80px+)、单页信息密度极低(1 个核心观点)
A2 - Apple Keynote 风格
:root {
--primary: #1D1D1F;
--primary-light: #424245;
--secondary: #6E6E73;
--accent: #0071E3;
--bg-page: #FFFFFF;
--bg-card: #FFFFFF;
--bg-section: #F5F5F7;
--text-heading: #1D1D1F;
--text-body: #424245;
--text-muted: #86868B;
--border: #D2D2D7;
}
特征:极简白底、San Francisco 字体气质、留白 >60%、产品图居中、超大标题(56px+)、几乎无边框
A3 - Typical PPT 风格
:root {
--primary: #2B579A;
--primary-light: #4472C4;
--secondary: #5B9BD5;
--accent: #FFC000;
--bg-page: #F0F4FA;
--bg-card: #FFFFFF;
--bg-section: #E8EEF7;
--text-heading: #1F3864;
--text-body: #404040;
--text-muted: #808080;
--border: #D6DCE4;
}
特征:深蓝(#2B579A)+浅灰背景、标准标题+副标题+正文层次、项目符号列表、页眉页脚、标准布局
A4 - Gamma 风格
:root {
--primary: #0EA5E9;
--primary-light: #38BDF8;
--secondary: #00CEC9;
--accent: #F59E0B;
--bg-page: #FAFEFF;
--bg-card: #FFFFFF;
--bg-section: #F0F9FF;
--text-heading: #2D3436;
--text-body: #545454;
--text-muted: #A0A0A0;
--border: #ECECEC;
--card-radius: 16px;
--card-shadow: 0 2px 12px rgba(14,165,233,0.08);
}
特征:现代卡片式布局、圆角 16px、柔和投影、天蓝色(#0EA5E9)强调、适度留白、创业路演感
A5 - Consulting 风格
:root {
--primary: #1E3A5F;
--primary-light: #2D5F8A;
--secondary: #4A90A4;
--accent: #D4A843;
--accent-warm: #C17F24;
--bg-page: #FAFBFC;
--bg-card: #FFFFFF;
--bg-section: #F0F4F8;
--text-heading: #0F2137;
--text-body: #3A4F66;
--text-muted: #7A8FA3;
--border: #E2E8F0;
}
特征:深蓝+金、数据卡片密集、等距投影图表、框架模型图、多列并排、KPI 大数字
B1 - Editorial 杂志风格
:root {
--primary: #1A1A1A;
--primary-light: #333333;
--secondary: #666666;
--accent: #C0392B;
--bg-page: #FEFEFE;
--bg-card: #FFFFFF;
--bg-section: #F5F5F0;
--text-heading: #1A1A1A;
--text-body: #333333;
--text-muted: #888888;
--border: #E0E0E0;
--font-heading: 'Playfair Display', 'Noto Serif SC', Georgia, serif;
--font-body: 'Source Sans Pro', 'Noto Sans SC', sans-serif;
}
特征:衬线标题+无衬线正文、分栏排版、大面积留白、pull-quote 大引用、黑白摄影配图、首字下沉
B2 - Swiss Style 风格
:root {
--primary: #D0021B;
--primary-light: #E63946;
--secondary: #2C2C2C;
--accent: #D0021B;
--bg-page: #FFFFFF;
--bg-card: #FFFFFF;
--bg-section: #F2F2F2;
--text-heading: #2C2C2C;
--text-body: #404040;
--text-muted: #808080;
--border: #CCCCCC;
--font-heading: 'Helvetica Neue', 'Arial', sans-serif;
}
特征:严格网格系统、Helvetica 无衬线、红色色带分割、不对称布局、信息层次分明
B3 - Newspaper 风格
:root {
--primary: #1A1A1A;
--primary-light: #333333;
--secondary: #555555;
--accent: #B22222;
--bg-page: #F5F1EB;
--bg-card: #FFFDF7;
--bg-section: #F0ECE3;
--text-heading: #1A1A1A;
--text-body: #333333;
--text-muted: #777777;
--border: #D4CFC5;
--font-heading: 'Playfair Display', 'Times New Roman', serif;
}
特征:报纸版式、多栏文字、报头大标题、分割线、黑白灰+单色点缀、引用框
C1 - Bauhaus 风格
:root {
--primary: #E63B2E;
--primary-light: #FF5A4F;
--secondary: #2B4FA2;
--accent: #F5C300;
--bg-page: #FFFFFF;
--bg-card: #FFFFFF;
--bg-section: #F7F7F7;
--text-heading: #1A1A1A;
--text-body: #333333;
--text-muted: #888888;
--border: #E0E0E0;
}
特征:几何色块(红黄蓝三原色)、粗线条网格、不规则色块拼接、理性构成
C2 - Kinfolk 风格
:root {
--primary: #9B7B5E;
--primary-light: #B8A08A;
--secondary: #8FA387;
--accent: #D4AAA0;
--bg-page: #FAF7F2;
--bg-card: #FFFCF7;
--bg-section: #F3EDE5;
--text-heading: #5A4A3A;
--text-body: #6B5E52;
--text-muted: #A09585;
--border: #E5DDD3;
}
特征:莫兰迪色调、自然光影质感、胶片颗粒感、温暖米色/棕色/橄榄、大量呼吸留白
C3 - Muji 风格
:root {
--primary: #5C5C5C;
--primary-light: #7A7A7A;
--secondary: #8B7355;
--accent: #B8A08A;
--bg-page: #F7F5F0;
--bg-card: #FFFFFF;
--bg-section: #F0EDE8;
--text-heading: #3A3A3A;
--text-body: #5C5C5C;
--text-muted: #999999;
--border: #E5E0D8;
}
特征:白灰为主、超细线条(0.5px)、日式简约、自然材质纹理暗示、极致留白
C4 - Brutalist 风格
:root {
--primary: #000000;
--primary-light: #333333;
--secondary: #555555;
--accent: #FF3D00;
--bg-page: #FFFFFF;
--bg-card: #FFFFFF;
--bg-section: #F0F0F0;
--text-heading: #000000;
--text-body: #333333;
--text-muted: #777777;
--border: #000000;
}
特征:大字铺满、粗边框(3px+)、高对比黑白、原始粗犷、有意的"不完美"感
D1 - Neo-Tokyo 风格
:root {
--primary: #FF2D6B;
--primary-light: #FF5A8A;
--secondary: #00B4D8;
--accent: #39FF14;
--bg-page: #0A0A0F;
--bg-card: #141420;
--bg-section: #1A1A2E;
--text-heading: #FFFFFF;
--text-body: #C0C0D0;
--text-muted: #6A6A80;
--border: rgba(255,255,255,0.08);
}
特征:深黑底(#0A0A0F)+霓虹粉(#FF2D6B)/青(#00B4D8)/绿(#39FF14)、故障艺术纹理、日式排版
D2 - Dark Mode 风格
:root {
--primary: #3B82F6;
--primary-light: #60A5FA;
--secondary: #64748B;
--accent: #06B6D4;
--bg-page: #0F172A;
--bg-card: #1E293B;
--bg-section: #1E293B;
--text-heading: #F1F5F9;
--text-body: #94A3B8;
--text-muted: #475569;
--border: rgba(148,163,184,0.15);
}
特征:深灰底(#0F172A)、冷蓝(#3B82F6)强调色、简洁边框、代码风排版、终端感
D3 - 红黑白科技风格
:root {
--primary: #E63946;
--primary-light: #FF5A65;
--secondary: #1A1A1A;
--accent: #E63946;
--bg-page: #FFFFFF;
--bg-card: #FFFFFF;
--bg-section: #F5F5F5;
--text-heading: #000000;
--text-body: #1A1A1A;
--text-muted: #808080;
--border: #E0E0E0;
}
特征:严格红黑白三色、几何连接线(电路风)、等距视角图形、高对比
E1 - 卡通 2.5D 风格
:root {
--primary: #4A90E2;
--primary-light: #6BB5FF;
--secondary: #10B981;
--accent: #F39C12;
--accent-warm: #FFD93D;
--bg-page: #F0F7FF;
--bg-card: #FFFFFF;
--bg-section: #E8F4FD;
--text-heading: #2C3E50;
--text-body: #4A5568;
--text-muted: #A0AEC0;
--border: #D6E8F7;
}
特征:扁平+柔和阴影、蓝+绿+橙多彩和谐、圆润图标、Q 版角色、等距 2.5D 视角
E2 - Education 风格
:root {
--primary: #2563EB;
--primary-light: #3B82F6;
--secondary: #10B981;
--accent: #F59E0B;
--highlight: #EF4444;
--bg-page: #FFF7ED;
--bg-card: #FFFFFF;
--bg-section: #FEF3C7;
--text-heading: #1E293B;
--text-body: #4B5563;
--text-muted: #9CA3AF;
--border: #FDE68A;
}
特征:色彩编码知识点(蓝=概念、绿=案例、橙=重点、红=注意)、互动元素暗示、清晰层次
🖼 配图系统
⭐ v5.2 原文配图提取(零成本方案)
核心理念:优先使用原文自带图片,降低成本,提高内容相关性。
工作流程:
网页 URL 输入
↓
fetch_webpage.py --download-images
↓
├── 智能提取页面图片
│ ├── 过滤:图标、广告、头像、logo
│ ├── 过滤:尺寸过小(<200x150px)
│ ├── 过滤:文件过小(<10KB)
│ └── 优先:article 区域内、有 alt 属性、大尺寸
↓
├── 下载到本地
│ └── ~/Desktop/ppt_images/image_xxx.jpg
↓
└── 生成映射关系
└── {local_path, url, alt, context, priority}
脚本使用:
# 抓取网页并下载图片
python3 scripts/fetch_webpage.py "https://example.com/article" \
--download-images \
--image-dir ~/Desktop/ppt_images/ \
-o content.json --pretty
# 输出示例
{
"title": "文章标题",
"slides": [...],
"images": {
"images": [
{
"local_path": "/Users/xxx/Desktop/ppt_images/image_abc123.jpg",
"filename": "image_abc123.jpg",
"url": "https://example.com/photo.jpg",
"alt": "文章配图描述",
"context": "图片周围的文字上下文",
"priority": 15
}
],
"total_found": 8,
"total_downloaded": 5,
"output_dir": "/Users/xxx/Desktop/ppt_images/"
}
}
图片优先级评分:
| 条件 | 加分 |
|---|---|
| 在 article 区域内 | +10 |
| 有 alt 属性 | +5 |
| 宽度 ≥600px 或高度 ≥400px | +3 |
| 有上下文描述 | +2 |
配图选择策略(v5.2 优化):
1. 原文配图(零成本)
└── 如果原文有合适图片 → 直接使用
└── 优点:内容相关性强、无 API 成本
2. Unsplash(低成本)
└── 原文无图或图片不足 → 搜索 Unsplash
└── 优点:高质量、免费(50次/小时)
3. AI 生成(有成本)
└── 需要特定风格图片 → AI 生成
└── 缺点:需要 API Key、有费用
4. 图标补充(零成本)
└── 始终使用 Iconify 图标丰富视觉
└── 优点:快速、免费、视觉丰富
配图来源选项
| 编号 | 风格 | 来源 | 特征 |
|---|---|---|---|
| I1 | 无配图 | - | 纯文字排版 |
| I2 | Editorial Photo | Unsplash | 编辑风格照片、高品质摄影 |
| I3 | Kinfolk 暖调 | Unsplash | 温暖胶片质感、生活方式 |
| I4 | 红黑白科技 | ZMark AI | 高对比科技风插图 |
| I5 | 卡通 2.5D | ZMark AI | 扁平卡通、等距视角 |
| I6 | 3D 渲染 | ZMark AI | 立体渲染插图 |
| I7 | 抽象艺术 | ZMark AI | 艺术插画 |
Unsplash API 集成
环境变量: UNSPLASH_ACCESS_KEY(必需)
脚本: scripts/fetch_unsplash.py
# 搜索照片
python3 scripts/fetch_unsplash.py search "business technology" --orientation landscape --count 5
# 批量为幻灯片获取配图
python3 scripts/fetch_unsplash.py batch slides.json --style editorial -o images.json
Unsplash 使用规则:
- 必须在图片附近显示摄影师署名
- 署名格式:
Photo by [Name] on Unsplash(含链接) - 添加 UTM 参数:
?utm_source=ppt_designer&utm_medium=referral
风格-搜索关键词映射:
| 配图风格 | Unsplash 搜索修饰词 |
|---|---|
| I2 Editorial Photo | editorial magazine artistic |
| I3 Kinfolk | lifestyle warm film grain cozy |
| TED 演讲配图 | dramatic dark cinematic |
| Apple Keynote 配图 | minimal clean white product |
| Consulting 配图 | corporate business professional |
| Newspaper 配图 | documentary journalism photojournalism |
页面类型配图规则
| 页面类型 | 是否配图 | 策略 |
|---|---|---|
| 封面页 | 必须 | 全屏/半屏大图 |
| 金句页 | 必须 | 氛围背景图 |
| 结尾页 | 必须 | 前瞻性氛围图 |
| 内容页(长) | 推荐 | 图文混排 |
| 内容页(短) | 可选 | 小图点缀 |
| 数据页 | 不配图 | 图表即视觉 |
AI 配图提示词系统(ZMark)
保留 v2.4 的 9 种 AI 风格提示词模板(详见 scripts/generate_images.py)。
🎬 翻页动画系统(6 种真正不同的动画)
动画效果定义
每种动画有完全不同的 CSS transition/animation,视觉效果截然不同。
1. Fade(淡入淡出)
.transition-fade .slide-leaving {
animation: fadeOut 0.6s ease forwards;
}
.transition-fade .slide-entering {
animation: fadeIn 0.6s ease forwards;
}
@keyframes fadeOut { from { opacity: 1; } to { opacity: 0; } }
@keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }
2. Slide(水平滑动)
.transition-slide .slide-leaving {
animation: slideOutLeft 0.5s ease forwards;
}
.transition-slide .slide-entering {
animation: slideInRight 0.5s ease forwards;
}
@keyframes slideOutLeft {
from { transform: translateX(0); opacity: 1; }
to { transform: translateX(-100%); opacity: 0; }
}
@keyframes slideInRight {
from { transform: translateX(100%); opacity: 0; }
to { transform: translateX(0); opacity: 1; }
}
3. Cinematic(电影感:缩放+模糊+透明度)
.transition-cinematic .slide-leaving {
animation: cinematicOut 0.8s ease forwards;
}
.transition-cinematic .slide-entering {
animation: cinematicIn 0.8s ease forwards;
}
@keyframes cinematicOut {
from { transform: scale(1); opacity: 1; filter: blur(0); }
to { transform: scale(1.15); opacity: 0; filter: blur(8px); }
}
@keyframes cinematicIn {
from { transform: scale(0.8); opacity: 0; filter: blur(8px); }
to { transform: scale(1); opacity: 1; filter: blur(0); }
}
4. Cut(瞬间切换)
.transition-cut .slide-leaving {
display: none;
}
.transition-cut .slide-entering {
opacity: 1;
}
5. Flip(3D 翻转)
.transition-flip .slides-viewport {
perspective: 1200px;
}
.transition-flip .slide-leaving {
animation: flipOut 0.6s ease forwards;
transform-style: preserve-3d;
backface-visibility: hidden;
}
.transition-flip .slide-entering {
animation: flipIn 0.6s ease forwards;
transform-style: preserve-3d;
backface-visibility: hidden;
}
@keyframes flipOut {
from { transform: rotateY(0deg); opacity: 1; }
to { transform: rotateY(-90deg); opacity: 0; }
}
@keyframes flipIn {
from { transform: rotateY(90deg); opacity: 0; }
to { transform: rotateY(0deg); opacity: 1; }
}
6. Zoom(中心缩放聚焦)
.transition-zoom .slide-leaving {
animation: zoomOut 0.5s ease forwards;
}
.transition-zoom .slide-entering {
animation: zoomIn 0.5s ease forwards;
}
@keyframes zoomOut {
from { transform: scale(1); opacity: 1; }
to { transform: scale(0.3); opacity: 0; }
}
@keyframes zoomIn {
from { transform: scale(2); opacity: 0; }
to { transform: scale(1); opacity: 1; }
}
翻页引擎 JavaScript
class SlideEngine {
constructor() {
this.slides = document.querySelectorAll('.slide');
this.current = 0;
this.total = this.slides.length;
this.transitioning = false;
this.transitionStyle = localStorage.getItem('ppt-transition') || 'fade';
this.init();
}
init() {
this.slides.forEach((s, i) => {
s.style.display = i === 0 ? '' : 'none';
s.classList.toggle('slide-active', i === 0);
});
this.updateNav();
this.bindKeys();
this.bindTouch();
}
async goTo(index) {
if (index < 0 || index >= this.total || index === this.current || this.transitioning) return;
this.transitioning = true;
const leaving = this.slides[this.current];
const entering = this.slides[index];
const viewport = document.querySelector('.slides-viewport');
// Apply transition class
viewport.className = `slides-viewport transition-${this.transitionStyle}`;
entering.style.display = '';
leaving.classList.add('slide-leaving');
entering.classList.add('slide-entering');
// Wait for animation
const duration = this.getDuration();
await new Promise(r => setTimeout(r, duration));
leaving.style.display = 'none';
leaving.classList.remove('slide-active', 'slide-leaving');
entering.classList.remove('slide-entering');
entering.classList.add('slide-active');
this.current = index;
this.transitioning = false;
this.updateNav();
}
getDuration() {
const durations = { fade: 600, slide: 500, cinematic: 800, cut: 50, flip: 600, zoom: 500 };
return durations[this.transitionStyle] || 600;
}
next() { this.goTo(this.current + 1); }
prev() { this.goTo(this.current - 1); }
setTransition(style) {
this.transitionStyle = style;
localStorage.setItem('ppt-transition', style);
document.querySelectorAll('.style-btn').forEach(btn => {
btn.classList.toggle('active', btn.dataset.style === style);
});
}
bindKeys() {
document.addEventListener('keydown', e => {
if (e.key === 'ArrowRight' || e.key === 'ArrowDown' || e.key === ' ') { e.preventDefault(); this.next(); }
if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') { e.preventDefault(); this.prev(); }
});
}
bindTouch() {
let startX = 0;
document.addEventListener('touchstart', e => { startX = e.touches[0].clientX; });
document.addEventListener('touchend', e => {
const diff = e.changedTouches[0].clientX - startX;
if (Math.abs(diff) > 50) { diff > 0 ? this.prev() : this.next(); }
});
}
updateNav() {
document.querySelectorAll('.nav-dot').forEach((dot, i) => {
dot.classList.toggle('active', i === this.current);
});
const counter = document.querySelector('.slide-counter');
if (counter) counter.textContent = `${this.current + 1} / ${this.total}`;
}
}
// Auto-play controller
class AutoPlayController {
constructor(engine, interval = 5000) {
this.engine = engine;
this.interval = interval;
this.timer = null;
this.isPlaying = false;
}
toggle() { this.isPlaying ? this.stop() : this.start(); }
start() {
if (this.isPlaying) return;
this.isPlaying = true;
this.updateBtn();
this.timer = setInterval(() => {
if (this.engine.current < this.engine.total - 1) this.engine.next();
else this.stop();
}, this.interval);
}
stop() {
this.isPlaying = false;
if (this.timer) { clearInterval(this.timer); this.timer = null; }
this.updateBtn();
}
setSpeed(ms) {
this.interval = ms;
if (this.isPlaying) { this.stop(); this.start(); }
}
updateBtn() {
const btn = document.querySelector('.autoplay-toggle');
if (btn) {
btn.innerHTML = this.isPlaying
? '<span class="iconify" data-icon="ph:pause-circle-bold"></span>'
: '<span class="iconify" data-icon="ph:play-circle-bold"></span>';
}
}
}
控制面板 HTML(v5.1 增强版)
功能特性:
- 自动播放按钮(播放/暂停切换)
- 速度控制(慢/中/快)
- 6 种动画切换按钮
- 页码显示
- 自动隐藏:播放后 3 秒自动隐藏,鼠标移动/悬停时显示
- 键盘提示:首次显示快捷键提示
<div class="control-panel" id="controlPanel">
<!-- 自动播放 -->
<button class="autoplay-toggle" onclick="autoPlay.toggle()" aria-label="自动播放" title="空格键切换">
<span class="iconify" data-icon="ph:play-circle-bold"></span>
</button>
<!-- 速度控制 -->
<div class="speed-control">
<button onclick="autoPlay.setSpeed(8000)" title="8秒/页">慢</button>
<button onclick="autoPlay.setSpeed(5000)" class="active" title="5秒/页">中</button>
<button onclick="autoPlay.setSpeed(3000)" title="3秒/页">快</button>
</div>
<!-- 分隔线 -->
<span class="divider"></span>
<!-- 6 种动画切换 -->
<div class="style-control">
<button class="style-btn active" data-style="fade" onclick="engine.setTransition('fade')" title="淡入淡出">Fade</button>
<button class="style-btn" data-style="slide" onclick="engine.setTransition('slide')" title="水平滑动">Slide</button>
<button class="style-btn" data-style="cinematic" onclick="engine.setTransition('cinematic')" title="电影感缩放">Cinema</button>
<button class="style-btn" data-style="zoom" onclick="engine.setTransition('zoom')" title="中心缩放">Zoom</button>
<button class="style-btn" data-style="flip" onclick="engine.setTransition('flip')" title="3D翻转">Flip</button>
<button class="style-btn" data-style="cut" onclick="engine.setTransition('cut')" title="瞬间切换">Cut</button>
</div>
<!-- 分隔线 -->
<span class="divider"></span>
<!-- 页码 -->
<span class="slide-counter">1 / N</span>
<!-- 全屏按钮 -->
<button class="fullscreen-btn" onclick="toggleFullscreen()" aria-label="全屏">
<span class="iconify" data-icon="ph:corners-out"></span>
</button>
</div>
<!-- 控制面板自动隐藏 CSS -->
<style>
.control-panel {
position: fixed;
bottom: 24px;
left: 50%;
transform: translateX(-50%);
display: flex;
align-items: center;
gap: 16px;
padding: 12px 20px;
background: rgba(255, 255, 255, 0.95);
backdrop-filter: blur(8px);
border: 1px solid var(--border);
border-radius: 8px;
z-index: 1000;
transition: opacity 0.3s, transform 0.3s;
}
.control-panel.hidden {
opacity: 0;
transform: translateX(-50%) translateY(20px);
pointer-events: none;
}
.control-panel:hover {
opacity: 1 !important;
transform: translateX(-50%) translateY(0) !important;
}
.divider {
width: 1px;
height: 20px;
background: var(--border);
}
.speed-control button,
.style-btn,
.autoplay-toggle,
.fullscreen-btn {
background: none;
border: 1px solid var(--border);
padding: 6px 12px;
cursor: pointer;
font-size: 13px;
color: var(--text-muted);
border-radius: 4px;
transition: all 0.2s;
}
.speed-control button.active,
.style-btn.active {
background: var(--primary);
color: white;
border-color: var(--primary);
}
.speed-control button:hover,
.style-btn:hover {
border-color: var(--primary);
color: var(--primary);
}
</style>
<script>
// 控制面板自动隐藏
let hideTimer;
const controlPanel = document.getElementById('controlPanel');
function showControlPanel() {
controlPanel.classList.remove('hidden');
clearTimeout(hideTimer);
if (autoPlay.isPlaying) {
hideTimer = setTimeout(() => {
controlPanel.classList.add('hidden');
}, 3000);
}
}
// 鼠标移动时显示控制面板
document.addEventListener('mousemove', showControlPanel);
// 播放状态变化时处理隐藏
const originalToggle = autoPlay.toggle.bind(autoPlay);
autoPlay.toggle = function() {
originalToggle();
if (this.isPlaying) {
hideTimer = setTimeout(() => {
controlPanel.classList.add('hidden');
}, 3000);
} else {
controlPanel.classList.remove('hidden');
}
};
// 全屏功能
function toggleFullscreen() {
if (!document.fullscreenElement) {
document.documentElement.requestFullscreen();
} else {
document.exitFullscreen();
}
}
</script>
📏 页数密度选项
| 编号 | 页数 | 密度 | 适用 |
|---|---|---|---|
| S1 | 5-8 页 | 精简版 | 快速概览、电梯演讲 |
| S2 | 10-12 页 | 标准版 | 常规演示、汇报 |
| S3 | 15-20 页 | 详细版 | 完整叙事、深度分享 |
核心设计宣言
你不是一个"能写 HTML 的程序员"。你是一位在国际顶级设计奖项(D&AD、红点、IF)评审团工作过的视觉叙事总监。你的每一张 Slide 都是一件独立的平面作品。
反 AI 审美铁律:
- 禁止千篇一律的圆角卡片堆叠——那是 Bootstrap 模板,不是演示
- 禁止毫无根据的 glow/blur 装饰——没有意义的光效是噪音
- 禁止图标当视觉主角——图标是导航辅助,不是设计语言
- 禁止使用渐变色——渐变蓝、渐变紫、任何颜色渐变都是廉价设计;使用纯色+层次代替
- 禁止发光效果(glow)——边框用实线,不用 box-shadow 发光
- 禁止蓝+紫色彩组合——蓝色和紫色绝不能同时出现在同一配色方案中;科技感用蓝+青/绿,创意感用橙/粉/黄
v5.1 新增设计规则: 7. 默认添加图标装饰——即使用户未明确要求配图,也应使用 Iconify 图标丰富视觉层次 8. 内容完整展示——默认展示完整内容,不精简;除非用户主动要求精简版 9. 视频模式字号放大——视频导出时字号 1.5x,减少留白,确保可读性
设计自觉:
- 每一次配色必须有出处(杂志、展览、品牌案例),不是凭感觉
- 每一处留白都是有意图的"静默表达",不是偷懒
- 每一个动效必须服务于叙事节奏,不是炫技
- 版式的张力来自"不对称的平衡",不是居中对齐一切
🎙 音频/视频转录系统
支持的输入源
| 来源 | URL 模式 | 下载方式 |
|---|---|---|
| YouTube | youtube.com/*, youtu.be/* | yt-dlp |
| 小宇宙播客 | xiaoyuzhoufm.com/episode/* | yt-dlp / HTML 解析 fallback |
| 直接音频链接 | *.mp3, *.m4a, *.wav 等 | curl/requests |
| 本地文件 | /path/to/audio.mp3 | 直接使用 |
| 其他视频站 | 任意 URL | yt-dlp 通用尝试 |
三种转录模式
| 模式 | 引擎 | 费用 | 速度(1h 音频) | 适用场景 |
|---|---|---|---|---|
| local(默认) | MLX-Whisper | $0 | ~25 min | 日常使用,Apple Silicon Mac |
| api | OpenAI Whisper API | $0.36 | ~3 min | 赶时间,长音频 |
| gemini | Gemini Flash | ~$0.06 | ~2 min | 最快最便宜,可同时生成摘要 |
脚本用法
# 基本用法 - YouTube 视频,本地 Whisper 转录
python3 scripts/transcribe_audio.py "https://youtu.be/xxx"
# 小宇宙播客,使用 Gemini 快速转录并生成摘要
python3 scripts/transcribe_audio.py "https://www.xiaoyuzhoufm.com/episode/xxx" \
--mode gemini --summary
# 本地音频文件,输出到文件
python3 scripts/transcribe_audio.py "/path/to/podcast.mp3" \
--mode local --output transcript.md
# 英语内容,OpenAI API 转录
python3 scripts/transcribe_audio.py "https://youtu.be/xxx" \
--mode api --language en
# 生成 SRT 字幕格式
python3 scripts/transcribe_audio.py "https://youtu.be/xxx" --format srt -o subtitles.srt
参数说明
| 参数 | 默认值 | 说明 |
|---|---|---|
url | (必填) | 音视频 URL 或本地文件路径 |
--mode | local | 转录模式: local / api / gemini |
--format | markdown | 输出格式: markdown / srt / txt / json |
--language | zh | 音频语言: zh / en / auto |
--model-size | turbo | 本地模型: turbo(推荐)/ large(最准)/ small(最快) |
--summary | false | Gemini 模式下同时生成摘要 |
--output / -o | stdout | 输出文件路径 |
依赖安装
# 必装
brew install ffmpeg # 音频格式转换
brew install yt-dlp # 下载 YouTube/播客
# 本地模式
pip install mlx-whisper # Apple Silicon 本地 Whisper
# API 模式需设置环境变量
export OPENAI_API_KEY="sk-..." # OpenAI Whisper API
export GEMINI_API_KEY="..." # Gemini Flash API
本地模型选择
| 模型 | ID | 速度 | 质量 | 适用 |
|---|---|---|---|---|
| turbo(默认) | whisper-large-v3-turbo | 快 | 优 | 日常播客 |
| large | whisper-large-v3-mlx | 慢 | 最优 | 追求最高质量 |
| small | whisper-small-mlx | 最快 | 够用 | 快速预览/低内存 |
与 PPT 生成的集成
音频/视频转录后的文字会自动进入阶段一的内容解析流程:
transcribe_audio.py 输出 markdown 文本
↓
Claude 整理文字(修正错别字、分段、去口水词)
↓
提取标题和核心观点作为 PPT 大纲
↓
进入正常 PPT 生成流程(风格选择 → 配图 → HTML)
错误处理
| 场景 | 自动处理 |
|---|---|
| yt-dlp 未安装 | 自动 brew install yt-dlp |
| mlx-whisper 未安装 | 自动 pip install mlx-whisper |
| 本地转录内存不足 | 自动降级到 small 模型 |
| API 文件超 25MB | 自动 ffmpeg 分片后合并 |
| API Key 未配置 | 提示用户设置,或切换到 local |
| 小宇宙 yt-dlp 失败 | Fallback 到 HTML 页面解析提取音频链接 |
附录:图标库系统(Icon Library)
Iconify 图标库(推荐)
<script src="https://code.iconify.design/3/3.1.1/iconify.min.js"></script>
<span class="iconify" data-icon="ph:star-bold" style="font-size: 24px; color: var(--accent);"></span>
附录:图表库系统(ECharts)
<script src="https://cdn.jsdelivr.net/npm/echarts@5.4.3/dist/echarts.min.js"></script>
📊 质量验收标准
设计质量
- 色彩不超过 3 种主色 + 2 种中性色
- 所有文本对比度 >= 4.5:1(正文)/ 3:1(大标题)
- 封面页必须有配图(除 I1 无配图模式)
- 金句页必须有氛围配图
- 配图与内容强相关
- Unsplash 图片含摄影师署名
- 每张 Slide 内容不超过 6 个信息点(标准模式)
技术质量
- HTML 语义化标签正确使用
- 响应式在 768px/1024px/1280px 断点表现正常
- 动画仅使用 transform/opacity/filter(GPU 友好)
- 6 种翻页动画视觉效果各不相同
- 自动播放功能正常
-
prefers-reduced-motion支持
交互质量
- 键盘 ← → 翻页
- 触摸滑动翻页
- 点击导航点跳转
- 自动播放开关
- 动画风格切换(Fade/Slide/Cinematic/Cut/Flip/Zoom)
- 速度控制(慢/中/快)
Skill 状态: v5.2 已实现 版本: 5.2 最后更新: 2026-02-13
📝 变更日志
v5.2 (2026-02-13) - 原文配图提取(零成本方案)
- 新增图片提取功能:fetch_webpage.py 自动下载网页中的配图
- 智能图片过滤:排除图标、广告、logo、小尺寸图片
- 优先级排序:article 区域图片 > 有 alt 属性 > 大尺寸
- 配图策略优化:原文配图 > Unsplash > AI 生成 > 图标
- 零成本优势:原文配图无需 API 调用,内容相关性最佳
- 命令行参数:
--download-images、--image-dir
v5.1 (2026-02-13) - 控制面板增强与视觉优化
- 控制面板自动隐藏:播放后 3 秒自动隐藏,鼠标移动时显示
- 动画选择按钮:控制面板内置 6 种动画切换(Fade/Slide/Cinematic/Zoom/Flip/Cut)
- 全屏按钮:新增全屏切换功能
- 默认图标装饰:即使 N4 纯文字模式,也默认添加 Iconify 图标丰富视觉
- 内容完整展示:默认展示完整内容,不精简
- 视频模式字号规范:视频导出使用 1.5x 字号,减少留白,确保可读性
- 设计规则新增:第 7-9 条明确图标使用、内容完整性、视频字号要求
v5.0 (2026-02-13) - 禁止蓝紫组合
- 禁止蓝+紫色彩组合:蓝色和紫色绝不能同时出现在同一配色方案中
- 风格配色调整:
- A4 Gamma:紫色(#6C5CE7) → 天蓝色(#0EA5E9)
- E1 卡通 2.5D:蓝+紫 → 蓝+绿+橙(#4A90E2+#10B981+#F39C12)
- 设计宣言新增第6条:明确禁止蓝紫组合,科技感用蓝+青/绿,创意感用橙/粉/黄
v4.9 (2026-02-13) - 纯色设计原则
- 禁止渐变色:移除所有「渐变蓝」「渐变紫」设计,改用纯色方案
- 禁止发光效果:边框使用实线,不使用 box-shadow 发光
- 风格更新:
- A3 Typical PPT:蓝白渐变 → 深蓝+浅灰纯色
- A4 Gamma:渐变强调色 → 天蓝色(#0EA5E9)
- D1 Neo-Tokyo:霓虹粉+青+绿(无紫色)
- D2 Dark Mode:蓝紫渐变 → 冷蓝(#3B82F6)纯色
- 设计宣言新增:明确禁止渐变色和发光效果
v4.8 (2026-02-13) - API Key 安全修复
- 移除硬编码 API Key:删除 fetch_unsplash.py 和 generate_images.py 中的硬编码 API Key
- 新增环境变量配置指南:完整的 API Key 申请和配置说明
- API Key 检查功能:未配置时显示友好的错误提示和申请步骤
- 必需配置:UNSPLASH_ACCESS_KEY(Unsplash 配图)、ZENMUX_API_KEY(AI 生成插图)
- 可选配置:OPENAI_API_KEY、VOLCENGINE_*、ZHIPUAI_API_KEY、GEMINI_API_KEY
v4.7 (2026-02-12) - 国产 TTS 服务
- 新增国产 TTS 服务:
- 火山引擎 TTS(字节跳动):8 种中文语音
- 智谱 AI TTS:支持中文语音合成
- Fish Speech:开源本地部署方案
- TTS 服务对比:免费/付费、音质、推荐场景
- 环境变量配置:VOLCENGINE_*, ZHIPUAI_API_KEY, FISH_SPEECH_URL
- 命令行更新:
--list-services列出所有 TTS 服务 - 依赖安装:zhipuai, volcengine-python-sdk(可选)
v4.6 (2026-02-12) - 内嵌字幕功能
- 内嵌字幕系统:视频导出时自动添加字幕
- 字幕样式:白字黑背景圆角,使用 PingFang SC 字体,底部居中
- 字幕同步:按句子分割讲解文字,逐句显示
- 时长分配:每句字幕时长 = (该句字数 / 总字数) × 页面音频时长
- 截图优化:每句字幕生成独立截图,确保字幕与音频 100% 同步
- 图片加载等待:自动等待外部图片加载完成后再截图
- 命令行参数:
--no-subtitle禁用字幕,--subtitle-fontsize、--subtitle-radius自定义样式
v4.5 (2026-02-12) - 风格选择优化
- 直接展示风格列表:在文本中以表格形式展示全部 17 种风格,一目了然
- 简化选择流程:用户可直接输入编号(A1-E2)或名称选择,无需分两步
- Other 选项支持:AskUserQuestion 提供 Other 选项,支持自由输入
- 智能推荐保留:仍根据内容类型推荐最佳风格,放在选项第一位
v4.4 (2026-02-11) - 风格选择优化
- 两阶段风格选择流程:
- 第一步:展示推荐风格 + 3 个大类(Classic/Professional、Editorial/Design、Tech/Education)
- 第二步:选择大类后展开该类别下的所有具体风格
- 完整风格速查表:在文本中以表格形式展示全部 17 种风格,方便用户浏览
- 优化 AskUserQuestion 使用:每个问题最多 4 个选项,符合工具限制
- 智能推荐优先:根据内容类型自动推荐最佳风格,同时保留探索其他风格的入口
v4.3 (2026-02-09) - 视频播客模式
- 新增输出模式选择:M1 仅 HTML PPT / M2 视频播客模式
- 视频播客模式内容增强:
- 每个主题拆分为 2-3 个子页面(避免单页停留过久)
- 增加数据卡片、关键数字、进度条等视觉元素
- 页数增加 50-100%,内容密度提升
- 内容拆分策略:概念页 + 数据页 + 案例页
- 推荐配图方案:Excalidraw 技术图表 + 信息图表
- 优化工作流:9 个阶段,步骤清晰
v4.2 (2026-02-09) - 视频导出 v3.0 音频驱动
- 音频驱动时长:每页展示时间 = 该页音频实际时长,视频/音频 100% 同步
- 流程重构:先生成音频 → 获取时长 → 按时长截图 → 合成视频
- ffprobe 时长检测:使用 ffprobe 替代 mutagen,更可靠
- 移除 --duration 参数:时长完全由讲解文字决定
- 默认语音改为云健:zh-CN-YunjianNeural(新闻播报男声)
v4.1 (2026-02-09) - 视频导出功能
- 新增视频导出系统:将 HTML PPT 转换为带配音的 MP4 视频
- Playwright 截图:高清捕获每页幻灯片(2x 分辨率)
- 双 TTS 服务:Edge TTS(免费,16种中文语音)/ OpenAI TTS(高质量)
- 智能时长对齐:根据配音长度自动调整每页展示时间
- 新增脚本:
scripts/ppt_to_video.py - 新增工作流阶段:阶段七 - 视频导出选项
- 支持自定义讲解:
data-narration和data-durationHTML 属性
v4.0 (2026-02-08) - 架构升级
- LLM 智能设计优先:Claude 直接生成 CSS 设计,不再依赖固定模板
- 本地模板作为 fallback:16 种预设模板降级为备选方案
- 新增 LLMDesignGenerator:Python 类处理 LLM 生成的设计规范
- 新增 LLMHTMLGenerator:使用 LLM 设计生成完整 HTML
- 设计 JSON 格式规范:标准化的设计描述格式
- 自动播放隐藏功能:点击播放后控制面板自动消失
- 动画切换按钮:所有模板支持 4 种动画切换
v3.2 (2026-02-08)
- 优化工作流程,确保完整配置询问
- 新增配图方案细分(图标/信息图表/几何装饰)
- 添加 AskUserQuestion 标准 JSON 模板
- 添加内容类型→风格推荐映射表
v3.1 (2026-02-08)
- 新增音频/视频转录功能
- 16 种风格模板完整实现
- Unsplash API 集成
- 6 种翻页动画