File size: 6,838 Bytes
13ff327
abe5a08
 
13ff327
abe5a08
13ff327
abe5a08
13ff327
abe5a08
13ff327
 
abe5a08
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
---
title: PDF to Video Converter
emoji: 🎬
colorFrom: blue
colorTo: purple
sdk: gradio
sdk_version: 4.19.2
app_file: app.py
pinned: true
---

# 📄 PDF to Video Converter 🎬

PDFファイルをスライドショー動画に変換するAPIです。指定されたURLからPDFをダウンロードし、各ページを画像化して、1ページあたり指定秒数のスライドショー動画を生成します。

## 🌟 機能

### ✅ 主要機能
- **PDF URLからのダウンロード**: HTTPリクエストで指定されたURLからPDFを取得
- **PDF→画像変換**: pdf2imageを使用して各ページを高品質な画像に変換
- **スライドショー動画生成**: 各画像を指定秒数(デフォルト5秒)表示する動画を作成
- **Hugging Faceアップロード**: 生成した動画をデータセットリポジトリに自動保存
- **URL返却**: アップロードされた動画のアクセス可能なURLを返却

### 🎨 ユーザーインターフェース
- **Gradio UI**: 直感的なWebインターフェース
- **FastAPI**: RESTful APIエンドポイント
- **リアルタイム進捗表示**: 処理状況を確認可能
- **動画プレビュー**: 生成された動画をその場で確認

## 🔌 API仕様

### エンドポイント: `POST /api/pdf-to-video`

#### リクエスト
```json
{
  "pdf_url": "https://example.com/sample.pdf",
  "duration_per_page": 5,
  "dpi": 150
}
```

**パラメータ:**
- `pdf_url` (string, 必須): PDFファイルのURL
- `duration_per_page` (integer, オプション): 1ページあたりの表示秒数(デフォルト: 5)
- `dpi` (integer, オプション): 画像解像度(デフォルト: 150)

#### レスポンス
```json
{
  "status": "success",
  "video_url": "https://huggingface.co/datasets/username/repo/resolve/main/videos/video_20250107_123456_abc123.mp4",
  "message": "動画の生成とアップロードに成功しました",
  "total_pages": 10,
  "video_duration": 50.0
}
```

**フィールド:**
- `status` (string): 処理結果("success" または "error")
- `video_url` (string): 生成された動画のURL
- `message` (string): 処理結果メッセージ
- `total_pages` (integer): PDFの総ページ数
- `video_duration` (float): 動画の総再生時間(秒)

### エンドポイント: `GET /health`

ヘルスチェック用エンドポイント

#### レスポンス
```json
{
  "status": "healthy",
  "service": "PDF to Video API",
  "hf_configured": true
}
```

## 🛠️ 技術スタック

- **Gradio 4.19.2**: WebUI/SDK
- **FastAPI**: REST APIフレームワーク
- **pdf2image**: PDF→画像変換
- **OpenCV (cv2)**: 動画生成エンジン
- **huggingface_hub**: データセットアップロード
- **Pillow**: 画像処理
- **requests**: HTTP通信

## ⚙️ 環境変数

以下の環境変数を設定する必要があります:

| 変数名 | 必須 | デフォルト値 | 説明 |
|--------|------|--------------|------|
| `HF_TOKEN` | ✅ | - | Hugging Face認証トークン |
| `HF_REPO_ID` | ❌ | `tomo2chin2/video-storage` | データセットリポジトリID |

### HF_TOKENの取得方法

1. [Hugging Face](https://huggingface.co/)にログイン
2. Settings → Access Tokens に移動
3. "New token" をクリック
4. Write権限を付与してトークンを生成
5. 生成されたトークンをコピー
6. Space設定の "Repository secrets" に追加

## 🚀 使用方法

### Web UIから使用

1. Space URLにアクセス
2. PDF URLを入力欄に貼り付け
3. 表示秒数とDPIを調整(任意)
4. 「🎬 動画生成」ボタンをクリック
5. 生成された動画URLをコピー

### APIから使用

#### curlの例

```bash
curl -X POST "https://your-space.hf.space/api/pdf-to-video" \
  -H "Content-Type: application/json" \
  -d '{
    "pdf_url": "https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf",
    "duration_per_page": 5,
    "dpi": 150
  }'
```

#### Pythonの例

```python
import requests

response = requests.post(
    "https://your-space.hf.space/api/pdf-to-video",
    json={
        "pdf_url": "https://example.com/sample.pdf",
        "duration_per_page": 5,
        "dpi": 150
    }
)

result = response.json()
print(f"動画URL: {result['video_url']}")
```

#### JavaScriptの例

```javascript
fetch('https://your-space.hf.space/api/pdf-to-video', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    pdf_url: 'https://example.com/sample.pdf',
    duration_per_page: 5,
    dpi: 150
  })
})
.then(response => response.json())
.then(data => console.log('動画URL:', data.video_url));
```

## 📊 処理フロー

```
1. PDF URLダウンロード

2. PDF→画像変換(pdf2image)

3. 画像サイズ統一(Pillow)

4. 動画生成(OpenCV)
   - 各ページを指定秒数表示
   - 30fps

5. Hugging Faceアップロード

6. URL返却
```

## 🧪 テスト用サンプルPDF

以下のURLでテスト可能です:

- **W3C ダミーPDF**: `https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf`
- **小サイズPDF**: 処理時間が短く、動作確認に最適

## ⚠️ 制限事項

1. **PDFサイズ**: 大きなPDF(20ページ以上)は処理に時間がかかります
2. **タイムアウト**: Hugging Face Spacesのタイムアウト制限(〜60秒)に注意
3. **同時リクエスト**: 大量の同時リクエストには対応していません
4. **ファイル形式**: PDFのみ対応(画像ファイルは非対応)

## 🔧 トラブルシューティング

### エラー: "HuggingFace API が初期化されていません"
→ `HF_TOKEN` 環境変数が設定されているか確認してください

### エラー: "PDFのダウンロードに失敗しました"
→ PDF URLが正しいか、アクセス可能か確認してください

### エラー: "PDFの画像変換に失敗しました"
→ PDFが破損していないか確認してください

### 動画が生成されない
→ ログを確認し、どの段階でエラーが発生しているか特定してください

## 📁 ファイル構成

```
majin/v4_spinoff/HUG/
├── app.py                  # メインアプリケーション
├── requirements.txt        # Python依存パッケージ
├── packages.txt            # システムパッケージ
├── README.md               # このファイル
└── 実装ステップ.md         # 詳細な実装手順
```

## 🤝 貢献

プルリクエストやイシューの報告を歓迎します。

## 📜 ライセンス

MIT License

## 📞 連絡先

問題や質問がある場合は、Issueを作成してください。

---

**最終更新**: 2025-10-07