Spaces:
Paused
Paused
| 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 | |