fible 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- fible-0.1.0/.env.example +2 -0
- fible-0.1.0/.gitignore +6 -0
- fible-0.1.0/PKG-INFO +276 -0
- fible-0.1.0/README.md +261 -0
- fible-0.1.0/fible/__init__.py +1 -0
- fible-0.1.0/fible/__main__.py +4 -0
- fible-0.1.0/fible/cli.py +218 -0
- fible-0.1.0/fible/config.py +84 -0
- fible-0.1.0/fible/pipeline/__init__.py +0 -0
- fible-0.1.0/fible/pipeline/composer.py +188 -0
- fible-0.1.0/fible/pipeline/matcher.py +95 -0
- fible-0.1.0/fible/pipeline/segmenter.py +86 -0
- fible-0.1.0/fible/pipeline/tts.py +59 -0
- fible-0.1.0/pyproject.toml +28 -0
- fible-0.1.0/test_story.txt +9 -0
- fible-0.1.0/uv.lock +1635 -0
- fible-0.1.0/xiaomi_llm.txt +9 -0
fible-0.1.0/.env.example
ADDED
fible-0.1.0/.gitignore
ADDED
fible-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: fible
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: 一句话生成视频 — AI 文案 + 配音 + 素材 + 合成的视频创作 CLI
|
|
5
|
+
Author: mx
|
|
6
|
+
License: MIT
|
|
7
|
+
Requires-Python: >=3.10
|
|
8
|
+
Requires-Dist: edge-tts>=6.1.0
|
|
9
|
+
Requires-Dist: moviepy>=2.0.0
|
|
10
|
+
Requires-Dist: openai>=1.0.0
|
|
11
|
+
Requires-Dist: python-dotenv>=1.0.0
|
|
12
|
+
Requires-Dist: requests>=2.31.0
|
|
13
|
+
Requires-Dist: rich>=13.0.0
|
|
14
|
+
Description-Content-Type: text/markdown
|
|
15
|
+
|
|
16
|
+
# AI 视频创作 CLI
|
|
17
|
+
|
|
18
|
+
一段文案 → 一个带配音和字幕的视频。全链路本地化,免费开源。
|
|
19
|
+
|
|
20
|
+
## 管线流程
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
文案.txt → DeepSeek V4 Pro 分镜 → edge-tts 配音 → Pexels 素材匹配 → FFmpeg 合成 → 输出.mp4
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## 环境要求
|
|
27
|
+
|
|
28
|
+
- Python 3.10+
|
|
29
|
+
- [uv](https://docs.astral.sh/uv/)(Python 包管理器,自动管理虚拟环境)
|
|
30
|
+
- FFmpeg(macOS: `brew install ffmpeg`)
|
|
31
|
+
- 两个 API Key:
|
|
32
|
+
- [DeepSeek API Key](https://platform.deepseek.com/) — 用于文案分镜
|
|
33
|
+
- [Pexels API Key](https://www.pexels.com/api/) — 用于搜索视频素材(免费注册)
|
|
34
|
+
|
|
35
|
+
## 安装
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
# 1. 安装 uv(如已安装可跳过)
|
|
39
|
+
curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
40
|
+
source $HOME/.local/bin/env
|
|
41
|
+
|
|
42
|
+
# 2. 进入项目目录
|
|
43
|
+
cd video-creator
|
|
44
|
+
|
|
45
|
+
# 3. 一键同步依赖 + 创建虚拟环境
|
|
46
|
+
uv sync
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## 配置
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
# 复制配置模板
|
|
53
|
+
cp .env.example .env
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
编辑 `.env` 文件,填入你的 API Key:
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
DEEPSEEK_API_KEY=sk-xxxxxxxxxxxxxxxx
|
|
60
|
+
PEXELS_API_KEY=xxxxxxxxxxxxxxxx
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## 使用
|
|
64
|
+
|
|
65
|
+
### 基本用法
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
# 从文案文件生成视频
|
|
69
|
+
uv run python cli.py -i 文案.txt
|
|
70
|
+
|
|
71
|
+
# 指定输出文件名和音色
|
|
72
|
+
uv run python cli.py -i 文案.txt -o 我的视频.mp4 -v zh-CN-YunyangNeural
|
|
73
|
+
|
|
74
|
+
# 仅配音+字幕,不使用视频素材
|
|
75
|
+
uv run python cli.py -i 文案.txt --no-material
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### 查看可用音色
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
uv run python cli.py --list-voices
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
输出示例:
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
zh-CN-XiaoxiaoNeural — 晓晓(女,温柔)
|
|
88
|
+
zh-CN-YunxiNeural — 云希(男,温暖)
|
|
89
|
+
zh-CN-YunjianNeural — 云健(男,沉稳)
|
|
90
|
+
zh-CN-XiaoyiNeural — 晓伊(女,活泼)
|
|
91
|
+
zh-CN-YunyangNeural — 云扬(男,新闻感)
|
|
92
|
+
zh-CN-XiaochenNeural — 晓辰(女,自然)
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
不指定音色时默认使用 `YunyangNeural`(云扬,适合知识类内容)。
|
|
96
|
+
|
|
97
|
+
### 运行示例
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
# 使用内置测试文案
|
|
101
|
+
uv run python cli.py -i test_story.txt -o output/test.mp4
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
执行过程输出:
|
|
105
|
+
|
|
106
|
+
```
|
|
107
|
+
AI 视频创作
|
|
108
|
+
输入: test_story.txt
|
|
109
|
+
输出: output/test.mp4
|
|
110
|
+
音色: zh-CN-YunyangNeural
|
|
111
|
+
|
|
112
|
+
▸ Step 1/4: AI 分镜分析
|
|
113
|
+
┌──────┬────────────────┬──────┬────────────┐
|
|
114
|
+
│ 序号 │ 旁白摘要 │ 时长 │ 关键词 │
|
|
115
|
+
├──────┼────────────────┼──────┼────────────┤
|
|
116
|
+
│ 1 │ 人工智能正以... │ 10s │ AI, daily. │
|
|
117
|
+
│ 2 │ 在医疗领域... │ 9s │ medical,.. │
|
|
118
|
+
│ 3 │ 然而技术进... │ 10s │ privacy,.. │
|
|
119
|
+
│ 4 │ 未来随着技... │ 8s │ future, AI │
|
|
120
|
+
└──────┴────────────────┴──────┴────────────┘
|
|
121
|
+
|
|
122
|
+
▸ Step 2/4: 生成配音
|
|
123
|
+
✓ 完成 4 段配音
|
|
124
|
+
|
|
125
|
+
▸ Step 3/4: 匹配素材
|
|
126
|
+
搜索并下载素材...
|
|
127
|
+
分镜 1: material_01.mp4
|
|
128
|
+
分镜 2: material_02.mp4
|
|
129
|
+
分镜 3: material_03.mp4
|
|
130
|
+
分镜 4: material_04.mp4
|
|
131
|
+
|
|
132
|
+
▸ Step 4/4: 合成视频
|
|
133
|
+
分镜 1: 渲染完成 (10.2s)
|
|
134
|
+
分镜 2: 渲染完成 (9.5s)
|
|
135
|
+
分镜 3: 渲染完成 (10.0s)
|
|
136
|
+
分镜 4: 渲染完成 (8.3s)
|
|
137
|
+
|
|
138
|
+
成品输出: /path/to/output/test.mp4
|
|
139
|
+
|
|
140
|
+
✓ 视频创作完成!
|
|
141
|
+
文件: /path/to/output/test.mp4
|
|
142
|
+
耗时: 45.3s
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## 产出质量
|
|
146
|
+
|
|
147
|
+
- 分辨率:1920×1080(1080p)
|
|
148
|
+
- 帧率:30fps
|
|
149
|
+
- 编码:H.264 + AAC
|
|
150
|
+
- 字幕:硬字幕,白字黑边,居中显示
|
|
151
|
+
|
|
152
|
+
## 项目结构
|
|
153
|
+
|
|
154
|
+
```
|
|
155
|
+
video-creator/
|
|
156
|
+
├── cli.py # 命令行入口
|
|
157
|
+
├── config.py # 配置管理(API Key、输出路径)
|
|
158
|
+
├── pyproject.toml # 项目元数据与依赖声明
|
|
159
|
+
├── uv.lock # 依赖锁定文件
|
|
160
|
+
├── pipeline/
|
|
161
|
+
│ ├── __init__.py
|
|
162
|
+
│ ├── segmenter.py # DeepSeek V4 Pro 文案分镜
|
|
163
|
+
│ ├── tts.py # edge-tts 语音合成
|
|
164
|
+
│ ├── matcher.py # Pexels 素材搜索与下载
|
|
165
|
+
│ └── composer.py # FFmpeg 视频合成
|
|
166
|
+
├── output/ # 生成文件存放目录
|
|
167
|
+
├── .env.example # API Key 配置模板
|
|
168
|
+
└── test_story.txt # 测试文案
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
## 模块说明
|
|
172
|
+
|
|
173
|
+
### segmenter.py — AI 分镜
|
|
174
|
+
|
|
175
|
+
调用 DeepSeek API 将输入文案拆分为分镜脚本。
|
|
176
|
+
|
|
177
|
+
- **模型:** `deepseek-chat`
|
|
178
|
+
- **输入:** 原始文案文本
|
|
179
|
+
- **输出:** 结构化 JSON,包含每个分镜的旁白、画面描述、中英文关键词、预估时长
|
|
180
|
+
|
|
181
|
+
DeepSeek 的系统提示词会引导模型:
|
|
182
|
+
- 将文案拆分为 8-15 秒/个的分镜
|
|
183
|
+
- 提供具体有画面感的视觉描述
|
|
184
|
+
- 生成英文关键词用于 Pexels 素材搜索
|
|
185
|
+
- 估算每个分镜的时长(约 4 字/秒)
|
|
186
|
+
|
|
187
|
+
### tts.py — 语音合成
|
|
188
|
+
|
|
189
|
+
使用微软 edge-tts 将旁白文本转为语音。
|
|
190
|
+
|
|
191
|
+
- **方案:** edge-tts(免费,无调用限制)
|
|
192
|
+
- **音色:** 6 种中文神经网络音色可选
|
|
193
|
+
- **格式:** MP3
|
|
194
|
+
- **输出:** 自动探测音频实际时长,回填到分镜数据中
|
|
195
|
+
|
|
196
|
+
### matcher.py — 素材匹配
|
|
197
|
+
|
|
198
|
+
通过 Pexels API 搜索并下载视频素材。
|
|
199
|
+
|
|
200
|
+
- **API:** Pexels Videos Search(免费,每月 200 次请求)
|
|
201
|
+
- **搜索策略:** 按英文关键词逐个搜索,取前 5 个结果
|
|
202
|
+
- **筛选逻辑:**
|
|
203
|
+
1. 过滤 720p 以下低分辨率素材
|
|
204
|
+
2. 按"时长匹配度(70%)+ 创作者可信度(30%)"评分
|
|
205
|
+
3. 选最高分的素材片段下载
|
|
206
|
+
- **下载格式:** 原始分辨率 MP4
|
|
207
|
+
|
|
208
|
+
### composer.py — 视频合成
|
|
209
|
+
|
|
210
|
+
使用 FFmpeg 将素材、配音、字幕合成为最终视频。
|
|
211
|
+
|
|
212
|
+
- **处理步骤:**
|
|
213
|
+
1. 素材裁剪到分镜时长 → 缩放居中为 1920×1080
|
|
214
|
+
2. 叠加配音音频(自动截取对应时长)
|
|
215
|
+
3. 添加硬字幕(drawtext 滤镜,白字黑边)
|
|
216
|
+
4. 所有分镜拼接为完整视频
|
|
217
|
+
- **字幕处理:** 长文本自动换行,最多显示 2-3 行,逐行叠加
|
|
218
|
+
- **中文字体:** 使用 macOS 系统字体 `STHeiti Medium`
|
|
219
|
+
|
|
220
|
+
## 故障排查
|
|
221
|
+
|
|
222
|
+
### 分镜阶段报错
|
|
223
|
+
|
|
224
|
+
```
|
|
225
|
+
ValueError: DeepSeek 返回的分镜脚本无法解析为 JSON
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
原因:DeepSeek 返回格式异常。重试即可,模型偶有输出不稳定。
|
|
229
|
+
|
|
230
|
+
### 配音阶段无声音或报错
|
|
231
|
+
|
|
232
|
+
```bash
|
|
233
|
+
# 手动测试 edge-tts 是否正常
|
|
234
|
+
uv run python -c "
|
|
235
|
+
import asyncio, edge_tts
|
|
236
|
+
async def test():
|
|
237
|
+
c = edge_tts.Communicate('测试语音', 'zh-CN-YunyangNeural')
|
|
238
|
+
await c.save('test.mp3')
|
|
239
|
+
print('OK')
|
|
240
|
+
asyncio.run(test())
|
|
241
|
+
"
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
如果失败,检查网络连接(edge-tts 需访问微软服务)。
|
|
245
|
+
|
|
246
|
+
### 素材搜索返回空
|
|
247
|
+
|
|
248
|
+
- 确认 Pexels API Key 正确配置在 `.env` 中
|
|
249
|
+
- Pexels 免费账户每月限额 200 次请求,超出会返回 429
|
|
250
|
+
- 某些中文概念的英文关键词可能匹配度低,可尝试使用 `--no-material` 跳过素材
|
|
251
|
+
|
|
252
|
+
### 合成阶段中文乱码
|
|
253
|
+
|
|
254
|
+
确认系统中存在中文字体:
|
|
255
|
+
```bash
|
|
256
|
+
ls /System/Library/Fonts/STHeiti\ Medium.ttc
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
Linux 系统需修改 `composer.py` 中的 `FONT_PATH`。
|
|
260
|
+
|
|
261
|
+
### FFmpeg not found
|
|
262
|
+
|
|
263
|
+
```bash
|
|
264
|
+
# macOS
|
|
265
|
+
brew install ffmpeg
|
|
266
|
+
|
|
267
|
+
# Ubuntu/Debian
|
|
268
|
+
sudo apt install ffmpeg
|
|
269
|
+
|
|
270
|
+
# Windows
|
|
271
|
+
# 下载 https://ffmpeg.org/download.html,解压后加入 PATH
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
## 许可证
|
|
275
|
+
|
|
276
|
+
MIT
|
fible-0.1.0/README.md
ADDED
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
# AI 视频创作 CLI
|
|
2
|
+
|
|
3
|
+
一段文案 → 一个带配音和字幕的视频。全链路本地化,免费开源。
|
|
4
|
+
|
|
5
|
+
## 管线流程
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
文案.txt → DeepSeek V4 Pro 分镜 → edge-tts 配音 → Pexels 素材匹配 → FFmpeg 合成 → 输出.mp4
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## 环境要求
|
|
12
|
+
|
|
13
|
+
- Python 3.10+
|
|
14
|
+
- [uv](https://docs.astral.sh/uv/)(Python 包管理器,自动管理虚拟环境)
|
|
15
|
+
- FFmpeg(macOS: `brew install ffmpeg`)
|
|
16
|
+
- 两个 API Key:
|
|
17
|
+
- [DeepSeek API Key](https://platform.deepseek.com/) — 用于文案分镜
|
|
18
|
+
- [Pexels API Key](https://www.pexels.com/api/) — 用于搜索视频素材(免费注册)
|
|
19
|
+
|
|
20
|
+
## 安装
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
# 1. 安装 uv(如已安装可跳过)
|
|
24
|
+
curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
25
|
+
source $HOME/.local/bin/env
|
|
26
|
+
|
|
27
|
+
# 2. 进入项目目录
|
|
28
|
+
cd video-creator
|
|
29
|
+
|
|
30
|
+
# 3. 一键同步依赖 + 创建虚拟环境
|
|
31
|
+
uv sync
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## 配置
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
# 复制配置模板
|
|
38
|
+
cp .env.example .env
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
编辑 `.env` 文件,填入你的 API Key:
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
DEEPSEEK_API_KEY=sk-xxxxxxxxxxxxxxxx
|
|
45
|
+
PEXELS_API_KEY=xxxxxxxxxxxxxxxx
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## 使用
|
|
49
|
+
|
|
50
|
+
### 基本用法
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
# 从文案文件生成视频
|
|
54
|
+
uv run python cli.py -i 文案.txt
|
|
55
|
+
|
|
56
|
+
# 指定输出文件名和音色
|
|
57
|
+
uv run python cli.py -i 文案.txt -o 我的视频.mp4 -v zh-CN-YunyangNeural
|
|
58
|
+
|
|
59
|
+
# 仅配音+字幕,不使用视频素材
|
|
60
|
+
uv run python cli.py -i 文案.txt --no-material
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### 查看可用音色
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
uv run python cli.py --list-voices
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
输出示例:
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
zh-CN-XiaoxiaoNeural — 晓晓(女,温柔)
|
|
73
|
+
zh-CN-YunxiNeural — 云希(男,温暖)
|
|
74
|
+
zh-CN-YunjianNeural — 云健(男,沉稳)
|
|
75
|
+
zh-CN-XiaoyiNeural — 晓伊(女,活泼)
|
|
76
|
+
zh-CN-YunyangNeural — 云扬(男,新闻感)
|
|
77
|
+
zh-CN-XiaochenNeural — 晓辰(女,自然)
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
不指定音色时默认使用 `YunyangNeural`(云扬,适合知识类内容)。
|
|
81
|
+
|
|
82
|
+
### 运行示例
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
# 使用内置测试文案
|
|
86
|
+
uv run python cli.py -i test_story.txt -o output/test.mp4
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
执行过程输出:
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
AI 视频创作
|
|
93
|
+
输入: test_story.txt
|
|
94
|
+
输出: output/test.mp4
|
|
95
|
+
音色: zh-CN-YunyangNeural
|
|
96
|
+
|
|
97
|
+
▸ Step 1/4: AI 分镜分析
|
|
98
|
+
┌──────┬────────────────┬──────┬────────────┐
|
|
99
|
+
│ 序号 │ 旁白摘要 │ 时长 │ 关键词 │
|
|
100
|
+
├──────┼────────────────┼──────┼────────────┤
|
|
101
|
+
│ 1 │ 人工智能正以... │ 10s │ AI, daily. │
|
|
102
|
+
│ 2 │ 在医疗领域... │ 9s │ medical,.. │
|
|
103
|
+
│ 3 │ 然而技术进... │ 10s │ privacy,.. │
|
|
104
|
+
│ 4 │ 未来随着技... │ 8s │ future, AI │
|
|
105
|
+
└──────┴────────────────┴──────┴────────────┘
|
|
106
|
+
|
|
107
|
+
▸ Step 2/4: 生成配音
|
|
108
|
+
✓ 完成 4 段配音
|
|
109
|
+
|
|
110
|
+
▸ Step 3/4: 匹配素材
|
|
111
|
+
搜索并下载素材...
|
|
112
|
+
分镜 1: material_01.mp4
|
|
113
|
+
分镜 2: material_02.mp4
|
|
114
|
+
分镜 3: material_03.mp4
|
|
115
|
+
分镜 4: material_04.mp4
|
|
116
|
+
|
|
117
|
+
▸ Step 4/4: 合成视频
|
|
118
|
+
分镜 1: 渲染完成 (10.2s)
|
|
119
|
+
分镜 2: 渲染完成 (9.5s)
|
|
120
|
+
分镜 3: 渲染完成 (10.0s)
|
|
121
|
+
分镜 4: 渲染完成 (8.3s)
|
|
122
|
+
|
|
123
|
+
成品输出: /path/to/output/test.mp4
|
|
124
|
+
|
|
125
|
+
✓ 视频创作完成!
|
|
126
|
+
文件: /path/to/output/test.mp4
|
|
127
|
+
耗时: 45.3s
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## 产出质量
|
|
131
|
+
|
|
132
|
+
- 分辨率:1920×1080(1080p)
|
|
133
|
+
- 帧率:30fps
|
|
134
|
+
- 编码:H.264 + AAC
|
|
135
|
+
- 字幕:硬字幕,白字黑边,居中显示
|
|
136
|
+
|
|
137
|
+
## 项目结构
|
|
138
|
+
|
|
139
|
+
```
|
|
140
|
+
video-creator/
|
|
141
|
+
├── cli.py # 命令行入口
|
|
142
|
+
├── config.py # 配置管理(API Key、输出路径)
|
|
143
|
+
├── pyproject.toml # 项目元数据与依赖声明
|
|
144
|
+
├── uv.lock # 依赖锁定文件
|
|
145
|
+
├── pipeline/
|
|
146
|
+
│ ├── __init__.py
|
|
147
|
+
│ ├── segmenter.py # DeepSeek V4 Pro 文案分镜
|
|
148
|
+
│ ├── tts.py # edge-tts 语音合成
|
|
149
|
+
│ ├── matcher.py # Pexels 素材搜索与下载
|
|
150
|
+
│ └── composer.py # FFmpeg 视频合成
|
|
151
|
+
├── output/ # 生成文件存放目录
|
|
152
|
+
├── .env.example # API Key 配置模板
|
|
153
|
+
└── test_story.txt # 测试文案
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## 模块说明
|
|
157
|
+
|
|
158
|
+
### segmenter.py — AI 分镜
|
|
159
|
+
|
|
160
|
+
调用 DeepSeek API 将输入文案拆分为分镜脚本。
|
|
161
|
+
|
|
162
|
+
- **模型:** `deepseek-chat`
|
|
163
|
+
- **输入:** 原始文案文本
|
|
164
|
+
- **输出:** 结构化 JSON,包含每个分镜的旁白、画面描述、中英文关键词、预估时长
|
|
165
|
+
|
|
166
|
+
DeepSeek 的系统提示词会引导模型:
|
|
167
|
+
- 将文案拆分为 8-15 秒/个的分镜
|
|
168
|
+
- 提供具体有画面感的视觉描述
|
|
169
|
+
- 生成英文关键词用于 Pexels 素材搜索
|
|
170
|
+
- 估算每个分镜的时长(约 4 字/秒)
|
|
171
|
+
|
|
172
|
+
### tts.py — 语音合成
|
|
173
|
+
|
|
174
|
+
使用微软 edge-tts 将旁白文本转为语音。
|
|
175
|
+
|
|
176
|
+
- **方案:** edge-tts(免费,无调用限制)
|
|
177
|
+
- **音色:** 6 种中文神经网络音色可选
|
|
178
|
+
- **格式:** MP3
|
|
179
|
+
- **输出:** 自动探测音频实际时长,回填到分镜数据中
|
|
180
|
+
|
|
181
|
+
### matcher.py — 素材匹配
|
|
182
|
+
|
|
183
|
+
通过 Pexels API 搜索并下载视频素材。
|
|
184
|
+
|
|
185
|
+
- **API:** Pexels Videos Search(免费,每月 200 次请求)
|
|
186
|
+
- **搜索策略:** 按英文关键词逐个搜索,取前 5 个结果
|
|
187
|
+
- **筛选逻辑:**
|
|
188
|
+
1. 过滤 720p 以下低分辨率素材
|
|
189
|
+
2. 按"时长匹配度(70%)+ 创作者可信度(30%)"评分
|
|
190
|
+
3. 选最高分的素材片段下载
|
|
191
|
+
- **下载格式:** 原始分辨率 MP4
|
|
192
|
+
|
|
193
|
+
### composer.py — 视频合成
|
|
194
|
+
|
|
195
|
+
使用 FFmpeg 将素材、配音、字幕合成为最终视频。
|
|
196
|
+
|
|
197
|
+
- **处理步骤:**
|
|
198
|
+
1. 素材裁剪到分镜时长 → 缩放居中为 1920×1080
|
|
199
|
+
2. 叠加配音音频(自动截取对应时长)
|
|
200
|
+
3. 添加硬字幕(drawtext 滤镜,白字黑边)
|
|
201
|
+
4. 所有分镜拼接为完整视频
|
|
202
|
+
- **字幕处理:** 长文本自动换行,最多显示 2-3 行,逐行叠加
|
|
203
|
+
- **中文字体:** 使用 macOS 系统字体 `STHeiti Medium`
|
|
204
|
+
|
|
205
|
+
## 故障排查
|
|
206
|
+
|
|
207
|
+
### 分镜阶段报错
|
|
208
|
+
|
|
209
|
+
```
|
|
210
|
+
ValueError: DeepSeek 返回的分镜脚本无法解析为 JSON
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
原因:DeepSeek 返回格式异常。重试即可,模型偶有输出不稳定。
|
|
214
|
+
|
|
215
|
+
### 配音阶段无声音或报错
|
|
216
|
+
|
|
217
|
+
```bash
|
|
218
|
+
# 手动测试 edge-tts 是否正常
|
|
219
|
+
uv run python -c "
|
|
220
|
+
import asyncio, edge_tts
|
|
221
|
+
async def test():
|
|
222
|
+
c = edge_tts.Communicate('测试语音', 'zh-CN-YunyangNeural')
|
|
223
|
+
await c.save('test.mp3')
|
|
224
|
+
print('OK')
|
|
225
|
+
asyncio.run(test())
|
|
226
|
+
"
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
如果失败,检查网络连接(edge-tts 需访问微软服务)。
|
|
230
|
+
|
|
231
|
+
### 素材搜索返回空
|
|
232
|
+
|
|
233
|
+
- 确认 Pexels API Key 正确配置在 `.env` 中
|
|
234
|
+
- Pexels 免费账户每月限额 200 次请求,超出会返回 429
|
|
235
|
+
- 某些中文概念的英文关键词可能匹配度低,可尝试使用 `--no-material` 跳过素材
|
|
236
|
+
|
|
237
|
+
### 合成阶段中文乱码
|
|
238
|
+
|
|
239
|
+
确认系统中存在中文字体:
|
|
240
|
+
```bash
|
|
241
|
+
ls /System/Library/Fonts/STHeiti\ Medium.ttc
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
Linux 系统需修改 `composer.py` 中的 `FONT_PATH`。
|
|
245
|
+
|
|
246
|
+
### FFmpeg not found
|
|
247
|
+
|
|
248
|
+
```bash
|
|
249
|
+
# macOS
|
|
250
|
+
brew install ffmpeg
|
|
251
|
+
|
|
252
|
+
# Ubuntu/Debian
|
|
253
|
+
sudo apt install ffmpeg
|
|
254
|
+
|
|
255
|
+
# Windows
|
|
256
|
+
# 下载 https://ffmpeg.org/download.html,解压后加入 PATH
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
## 许可证
|
|
260
|
+
|
|
261
|
+
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|