File size: 10,616 Bytes
4ea223c
 
 
 
 
 
6a45158
cfe6c4b
 
 
 
 
f376cb2
cfe6c4b
 
 
f376cb2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
00c0222
 
 
 
 
 
 
 
f376cb2
 
 
00c0222
f376cb2
cfe6c4b
 
 
f376cb2
cfe6c4b
f376cb2
cfe6c4b
 
f376cb2
 
00c0222
 
 
 
 
f376cb2
cfe6c4b
 
 
f376cb2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cfe6c4b
 
 
 
 
 
 
 
 
 
 
f376cb2
 
cfe6c4b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f376cb2
 
 
cfe6c4b
 
 
 
f376cb2
 
cfe6c4b
 
 
f376cb2
 
 
 
 
 
 
 
 
 
cfe6c4b
f376cb2
 
 
cfe6c4b
00c0222
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f376cb2
 
 
 
 
 
 
 
 
 
 
cfe6c4b
 
 
f376cb2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cfe6c4b
f376cb2
 
 
 
 
cfe6c4b
f376cb2
 
 
 
cfe6c4b
f376cb2
cfe6c4b
f376cb2
cfe6c4b
f376cb2
 
 
 
cfe6c4b
f376cb2
 
 
 
cfe6c4b
00c0222
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f376cb2
 
 
 
cfe6c4b
f376cb2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cfe6c4b
 
 
f376cb2
 
 
 
 
 
00c0222
f376cb2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cfe6c4b
 
 
 
 
518b62c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
---
title: PDF2podcast 1 Script
emoji: 🔥
colorFrom: pink
colorTo: indigo
sdk: gradio
sdk_version: 5.24.0
app_file: app.py
pinned: false
short_description: 原tbdavid2019/PDF2podcast拆出的劇本生成(1)
---

# PDF2Podcast 腳本生成器 (重構版)

PDF2Podcast 是一個強大的文件轉換工具,能夠將 PDF、TXT 和 EPUB 檔案轉換成生動的對話腳本。此工具特別適合創建 podcast、講座、教學內容或摘要,透過大型語言模型 (LLM) 將靜態文字轉換為引人入勝的對話或演講稿。

## 🚀 最新更新 (2025-10-02)

### 重大架構重構
- **模組化設計**:將原本複雜的單一檔案拆分為多個專業模組
  - `prompts.py`:現代化提示詞管理,採用簡潔高效的設計
  - `quality_control.py`:對話品質檢查和連貫性驗證
  - `content_planner.py`:智能內容規劃和主題導向分段
- **簡化提示詞**:摒棄複雜的多段式提示詞,採用現代 AI 系統最佳實踐

### 核心功能優化
- **解決文稿斷裂問題**  - 大幅提升 `max_tokens` 至 65,536 (支援 Gemini Flash 2.5)
  - 智能截斷檢測,自動啟用分批生成備用機制
  - 品質檢查針對完整文稿進行,而非逐批檢查
- **可調整參數**  - 最大輸出 Token 數可調整 (1,024 - 131,072)
  - 最大輸入文本長度可調整 (50,000 - 2,000,000 字符)
  - 適配不同模型的限制 (Gemini: 65536, GPT-4: 4096, Claude: 8192)

### 全新摘要功能 📝
- **Podcast Summary 生成**:專為 podcast 上架準備
  - **博客式摘要**:適合搜索引擎收錄的 Markdown 格式文章
  - **極簡摘要**:200 字以內的節目介紹,適合平台描述
- **一鍵生成**:從腳本直接生成多種格式的摘要內容

### Discord 分享功能 🔗 (NEW!)
- **一鍵分享到 Discord**:將生成的腳本和摘要直接分享到 Discord 頻道
- **自動文件上傳**  - 腳本文件:`podcast_script_YYYYMMDD_HHMMSS.txt`
  - 摘要文件:`podcast_summary_YYYYMMDD_HHMMSS.txt`
- **Webhook 支援**:透過 Discord Webhook URL 實現無縫整合
- **智能驗證**:URL 格式檢查和錯誤處理

### 介面優化
- **簡化設計**:隱藏複雜的多段式提示詞欄位
- **專注核心**:保留模板選擇和自定義提示詞功能
- **三輸出區域**:腳本生成 + 摘要生成 + Discord 分享並行操作

## 功能特點

- **多種檔案格式支援**:可處理 PDF、TXT 和 EPUB 檔案
- **現代化模板系統**  - Podcast 對話(兩位主持人 David 和 Cordelia)
  - 單人播客獨白
  - 科學材料發現摘要(教授與學生對話)
  - 講座腳本(單一演講者)
  - 一般摘要和簡短摘要
  - **新增**:博客式摘要和極簡摘要
- **Discord 整合功能**  - 一鍵分享腳本和摘要到 Discord 頻道
  - 支援 Discord Webhook URL
  - 自動文件上傳和格式化
  - 智能錯誤處理和狀態提示
- **智能品質控制**:自動檢測對話品質和連貫性
- **彈性 API 整合**:支援 OpenAI API 及其他相容的 API 端點
- **模型選擇**:可從連接的 API 獲取並選擇可用的語言模型
- **繁體中文輸出**:預設生成繁體中文腳本
- **現代化介面**:基於 Gradio 的直觀操作界面

## 技術架構

### 核心模組
```
PDF2podcast-1-script/
├── app.py                 # 主應用程式 (Gradio 介面)
├── prompts.py            # 現代化提示詞管理
├── quality_control.py    # 品質檢查系統
├── content_planner.py    # 內容規劃器
├── requirements.txt      # 依賴清單
└── README.md            # 專案說明
```

### 提示詞設計原則
- **簡潔高效**:摒棄複雜的多段式設計
- **現代化**:採用最新 AI 系統最佳實踐
- **可擴展**:易於添加新模板和自定義內容
- **向後兼容**:保持與舊版本的相容性

## 安裝指南

### 前置需求
- Python 3.7 或更高版本
- pip 套件管理器

### 安裝步驟

1. 複製此專案到本地:
   ```bash
   git clone https://github.com/tbdavid2019/PDF2podcast-1-script.git
   cd PDF2podcast-1-script
   ```

2. 安裝所需依賴:
   ```bash
   pip install -r requirements.txt
   ```

3. 設定 API 金鑰(可選):
   ```bash
   cp .env.example .env
   # 編輯 .env 檔案,添加您的 API 金鑰
   ```

## 使用方法

### 基本操作流程

1. **啟動應用程式**```bash
   python app.py
   ```

2. **設定 API 參數**   - 輸入 API Base URL(預設為 Gemini API)
   - 輸入您的 LLM API 金鑰
   - 點擊「獲取模型列表」按鈕

3. **上傳文件**:支援 PDF、TXT 或 EPUB 格式

4. **選擇模板**:從下拉選單選擇適合的提示詞模板

5. **調整參數**   - 最大輸出 Token 數 (建議 Gemini: 65536)
   - 最大輸入文本長度
   - 分批生成部分數量 (通常設為 1)

6. **生成腳本**:點擊「生成腳本」按鈕

7. **生成摘要**   - 選擇摘要類型(博客式 / 極簡)
   - 點擊「生成摘要」按鈕

8. **Discord 分享** (可選):
   - 填寫 Discord Webhook URL
   - 點擊「Share to Discord」按鈕
   - 自動將腳本和摘要以文件形式發送到 Discord 頻道

### Discord Webhook 設定

#### 獲取 Webhook URL
1. 在 Discord 中,前往您要發送文件的頻道
2. 點擊頻道設置 → 整合 → Webhook
3. 創建新的 Webhook 或複製現有的 URL
4. URL 格式:`https://discord.com/api/webhooks/[ID]/[TOKEN]`

#### 使用方式
- **文件格式**:自動生成帶時間戳的 `.txt` 文件
- **發送內容**  - 腳本文件:包含完整的對話腳本
  - 摘要文件:包含生成的摘要內容(如果有)
- **Discord 消息**:包含專業格式的通知消息

#### 範例 Webhook URL
```
https://discord.com/api/webhooks/1423428306505830423/efDwfztnktEwTqa_US0wX4qZPvY0P0Z1Z01_rmGmaKhYg9teYgccPUsxW796_YUv5Fia
```

### 進階功能

#### 自定義提示詞
- 在「自定義提示詞」欄位添加特殊要求
- 系統會自動將其整合到主要提示詞中

#### 模型適配建議
- **Gemini Flash 2.5**: max_tokens = 65536 (推薦)
- **GPT-4**: max_tokens = 4096
- **Claude**: max_tokens = 8192
- **其他模型**: 請參考官方文檔

## 提示詞模板說明

### 主要模板

#### Podcast 模板 (推薦)
生成兩位主持人(David 和 Cordelia)之間的對話:
- 開場:「歡迎收聽 David888 Podcast,我是 David...」
- 風格:類似 All-In-Podcast,輕鬆專業
- 長度:50-200 輪對話,根據內容自動調整

#### 單人播客模板
生成單一主持人的播客獨白:
- 風格親切專業,適合深度講解
- 內容豐富且易懂

#### 摘要模板 (新增)
- **博客式摘要**:適合 SEO 的 Markdown 格式文章
- **極簡摘要**:200 字以內的節目介紹

### 科學專用模板
- **SciAgents 材料發現**:專門介紹 AI 材料發現成果
- **講座模板**:費曼風格的教學內容

## 品質控制系統

### 自動檢測功能
- **截斷檢測**:智能識別內容是否被提前截斷
- **連貫性檢查**:驗證對話的邏輯一致性
- **格式驗證**:確保 speaker-1/speaker-2 格式正確
- **品質評分**:提供整體品質評估 (0-100分)

### 備用機制
- 當單次生成被截斷時,自動啟用分批生成
- 智能內容規劃,確保主題連貫性
- 全局品質檢查,而非逐批檢查

## 故障排除

### 常見問題

#### 文稿被截斷
- **解決方案**:提高 max_tokens 設定至模型支援上限
- **Gemini Flash 2.5**: 可設定至 65536
- **自動備用**:系統會自動偵測並啟用分批生成

#### API 連接問題
- 檢查 API 金鑰是否正確
- 確認 API Base URL 格式
- 查看錯誤日誌獲取詳細資訊

#### Discord 分享失敗
- **常見原因及解決方案**  1. **Webhook URL 格式錯誤**
     - 確認 URL 以 `https://discord.com/api/webhooks/` 開頭
     - 檢查是否包含完整的 ID 和 Token
  2. **權限問題**
     - 確認 Webhook 在目標頻道有發送訊息權限
     - 檢查 Discord 伺服器設定
  3. **文件大小限制**
     - Discord 免費版限制 8MB,Nitro 用戶為 50MB
     - 如果文件過大,考慮分段生成較短內容
  4. **網路連線問題**
     - 檢查網路連線穩定性
     - 嘗試重新發送

#### 品質評分偏低
- 檢查原始內容品質
- 考慮調整提示詞模板
- 嘗試不同的 temperature 設定

## 技術規格

### 支援的模型
- **推薦**: Gemini Flash 2.5 (65536 tokens)
- **相容**: OpenAI GPT 系列、Claude、其他 OpenAI API 相容模型

### 效能規格
- **最大輸入**: 2,000,000 字符
- **最大輸出**: 131,072 tokens (視模型而定)
- **處理速度**: 視模型 API 回應時間而定
- **記憶體需求**: 約 500MB (含依賴)

### 依賴套件
主要依賴套件:
- gradio:Web 介面框架
- pymupdf:PDF 文件處理
- ebooklib:EPUB 文件處理
- beautifulsoup4:HTML 內容解析
- requests:API 通訊
- python-dotenv:環境變數管理

完整依賴列表請參見 `requirements.txt` 檔案。

## 版本歷史

### v2.0.0 (2025-10-02) - 重構版
- 🎯 **重大重構**:模組化架構,分離關注點
- 🚀 **解決斷裂**:提升 token 限制,修復文稿截斷問題  
- 📝 **新增摘要**:Podcast 上架專用的摘要生成功能
- 🔗 **Discord 整合**:一鍵分享腳本和摘要到 Discord 頻道
- 🎨 **介面優化**:簡化複雜設定,專注核心功能
- ⚙️ **參數化**:可調整輸出 token 限制,適配不同模型
- 🔧 **品質提升**:智能品質檢查和截斷偵測

### v1.x - 初始版本
- 基本的 PDF/EPUB 轉 Podcast 功能
- 複雜的多段式提示詞設計
- 固定的 token 限制

## 貢獻指南

歡迎提交 Issues 和 Pull Requests!

### 開發環境設置
1. Fork 此專案
2. 創建功能分支:`git checkout -b feature/新功能`
3. 提交變更:`git commit -am '添加新功能'`
4. 推送分支:`git push origin feature/新功能`
5. 創建 Pull Request

### 程式碼規範
- 使用 Python PEP 8 風格
- 添加適當的註釋和文檔字符串
- 確保向後相容性

## 授權條款

[在此添加授權資訊]

## 聯絡資訊

- GitHub: https://github.com/tbdavid2019/PDF2podcast-1-script
- Issues: https://github.com/tbdavid2019/PDF2podcast-1-script/issues

## 注意事項

- 處理大型檔案可能需要較長時間
- API 使用可能會產生費用,請查閱您使用的 API 提供商的計費政策
- 生成的內容質量取決於所選模型和提供的提示詞
- 建議在生產環境使用前進行充分測試