From fd0545f22c770726f20356d41228a34f5eb45e03 Mon Sep 17 00:00:00 2001 From: Ikko Ashimine Date: Sun, 18 Jan 2026 23:44:10 +0900 Subject: [PATCH 01/15] docs: add Japanese README --- README-EN.md | 2 +- README-JA.md | 537 +++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 2 +- 3 files changed, 539 insertions(+), 2 deletions(-) create mode 100644 README-JA.md diff --git a/README-EN.md b/README-EN.md index 4c1733d..ecdffca 100644 --- a/README-EN.md +++ b/README-EN.md @@ -10,7 +10,7 @@ [Features](#features) • [Quick Start](#quick-start) • [Deployment](#deployment) -[简体中文](README.md) | [English](README-EN.md) +[简体中文](README.md) | [English](README-EN.md) | [日本語](README-JA.md) diff --git a/README-JA.md b/README-JA.md new file mode 100644 index 0000000..b75ba1c --- /dev/null +++ b/README-JA.md @@ -0,0 +1,537 @@ +# 🎬 Huobao Drama - AIショートドラマ制作プラットフォーム + +
+ +**Go + Vue3 ベースのフルスタックAIショートドラマ自動化プラットフォーム** + +[![Go Version](https://img.shields.io/badge/Go-1.23+-00ADD8?style=flat&logo=go)](https://golang.org) +[![Vue Version](https://img.shields.io/badge/Vue-3.x-4FC08D?style=flat&logo=vue.js)](https://vuejs.org) +[![License](https://img.shields.io/badge/License-CC%20BY--NC--SA%204.0-lightgrey.svg)](https://creativecommons.org/licenses/by-nc-sa/4.0/) + +[機能](#機能) • [クイックスタート](#クイックスタート) • [デプロイ](#デプロイ) + +[简体中文](README.md) | [English](README-EN.md) | [日本語](README-JA.md) + +
+ +--- + +## 📖 概要 + +Huobao Dramaは、脚本生成、キャラクターデザイン、絵コンテ作成から動画合成までの全ワークフローを自動化するAI駆動のショートドラマ制作プラットフォームです。 + +### 🎯 主要機能 + +- **🤖 AI駆動**: 大規模言語モデルを使用して脚本を解析し、キャラクター、シーン、絵コンテ情報を抽出 +- **🎨 インテリジェント創作**: AIによるキャラクターポートレートとシーン背景の生成 +- **📹 動画生成**: テキストから動画、画像から動画モデルによる絵コンテ動画の自動生成 +- **🔄 完全なワークフロー**: アイデアから完成動画までのエンドツーエンド制作ワークフロー + +### 🛠️ 技術アーキテクチャ + +**DDD(ドメイン駆動設計)** に基づく明確なレイヤー構造: + +``` +├── APIレイヤー (Gin HTTP) +├── アプリケーションサービスレイヤー (ビジネスロジック) +├── ドメインレイヤー (ドメインモデル) +└── インフラストラクチャレイヤー (データベース、外部サービス) +``` + +### 🎥 デモ動画 + +AIショートドラマ生成を体験: + +
+ +**サンプル作品 1** + + + +**サンプル作品 2** + + + +[動画1を見る](https://ffile.chatfire.site/cf/public/20260114094337396.mp4) | [動画2を見る](https://ffile.chatfire.site/cf/public/fcede75e8aeafe22031dbf78f86285b8.mp4) + +
+ +--- + +## ✨ 機能 + +### 🎭 キャラクター管理 +- ✅ AI生成キャラクターポートレート +- ✅ バッチキャラクター生成 +- ✅ キャラクター画像のアップロードと管理 + +### 🎬 絵コンテ制作 +- ✅ 自動絵コンテスクリプト生成 +- ✅ シーン説明とショットデザイン +- ✅ 絵コンテ画像生成(テキストから画像) +- ✅ フレームタイプ選択(先頭フレーム/キーフレーム/末尾フレーム/パネル) + +### 🎥 動画生成 +- ✅ 画像から動画の自動生成 +- ✅ 動画合成と編集 +- ✅ トランジション効果 + +### 📦 アセット管理 +- ✅ 統合アセットライブラリ管理 +- ✅ ローカルストレージサポート +- ✅ アセットのインポート/エクスポート +- ✅ タスク進捗トラッキング + +--- + +## 🚀 クイックスタート + +### 📋 前提条件 + +| ソフトウェア | バージョン | 説明 | +|-------------|----------|------| +| **Go** | 1.23+ | バックエンドランタイム | +| **Node.js** | 18+ | フロントエンドビルド環境 | +| **npm** | 9+ | パッケージマネージャー | +| **FFmpeg** | 4.0+ | 動画処理(**必須**) | +| **SQLite** | 3.x | データベース(内蔵) | + +#### FFmpegのインストール + +**macOS:** +```bash +brew install ffmpeg +``` + +**Ubuntu/Debian:** +```bash +sudo apt update +sudo apt install ffmpeg +``` + +**Windows:** +[FFmpeg公式サイト](https://ffmpeg.org/download.html)からダウンロードし、環境変数を設定 + +インストール確認: +```bash +ffmpeg -version +``` + +### ⚙️ 設定 + +設定ファイルをコピーして編集: + +```bash +cp configs/config.example.yaml configs/config.yaml +vim configs/config.yaml +``` + +設定ファイル形式(`configs/config.yaml`): + +```yaml +app: + name: "Huobao Drama API" + version: "1.0.0" + debug: true # 開発環境ではtrue、本番環境ではfalseに設定 + +server: + port: 5678 + host: "0.0.0.0" + cors_origins: + - "http://localhost:3012" + read_timeout: 600 + write_timeout: 600 + +database: + type: "sqlite" + path: "./data/drama_generator.db" + max_idle: 10 + max_open: 100 + +storage: + type: "local" + local_path: "./data/storage" + base_url: "http://localhost:5678/static" + +ai: + default_text_provider: "openai" + default_image_provider: "openai" + default_video_provider: "doubao" +``` + +**主要設定項目:** +- `app.debug`: デバッグモードスイッチ(開発環境ではtrueを推奨) +- `server.port`: サービスポート +- `server.cors_origins`: フロントエンドの許可CORSオリジン +- `database.path`: SQLiteデータベースファイルパス +- `storage.local_path`: ローカルファイルストレージパス +- `storage.base_url`: 静的リソースアクセスURL +- `ai.default_*_provider`: AIサービスプロバイダー設定(APIキーはWeb UIで設定) + +### 📥 インストール + +```bash +# プロジェクトをクローン +git clone https://github.com/chatfire-AI/huobao-drama.git +cd huobao-drama + +# Go依存関係をインストール +go mod download + +# フロントエンド依存関係をインストール +cd web +npm install +cd .. +``` + +### 🎯 プロジェクトの起動 + +#### 方法1: 開発モード(推奨) + +**フロントエンドとバックエンドを分離、ホットリロード対応** + +```bash +# ターミナル1: バックエンドサービスを起動 +go run main.go + +# ターミナル2: フロントエンド開発サーバーを起動 +cd web +npm run dev +``` + +- フロントエンド: `http://localhost:3012` +- バックエンドAPI: `http://localhost:5678/api/v1` +- フロントエンドはAPIリクエストを自動的にバックエンドにプロキシ + +#### 方法2: シングルサービスモード + +**バックエンドがAPIとフロントエンド静的ファイルの両方を提供** + +```bash +# 1. フロントエンドをビルド +cd web +npm run build +cd .. + +# 2. サービスを起動 +go run main.go +``` + +アクセス: `http://localhost:5678` + +### 🗄️ データベース初期化 + +データベーステーブルは初回起動時に自動作成されます(GORM AutoMigrateを使用)。手動マイグレーションは不要です。 + +--- + +## 📦 デプロイ + +### 🐳 Dockerデプロイ(推奨) + +#### 方法1: Docker Compose(推奨) + +```bash +# サービスを起動 +docker-compose up -d + +# ログを表示 +docker-compose logs -f + +# サービスを停止 +docker-compose down +``` + +#### 方法2: Dockerコマンド + +> **注意**: Linuxユーザーはホストサービスにアクセスするために `--add-host=host.docker.internal:host-gateway` を追加する必要があります + +```bash +# Docker Hubから実行 +docker run -d \ + --name huobao-drama \ + -p 5678:5678 \ + -v $(pwd)/data:/app/data \ + --restart unless-stopped \ + huobao/huobao-drama:latest + +# ログを表示 +docker logs -f huobao-drama +``` + +**ローカルビルド**(オプション): +```bash +docker build -t huobao-drama:latest . +docker run -d --name huobao-drama -p 5678:5678 -v $(pwd)/data:/app/data huobao-drama:latest +``` + +**Dockerデプロイの利点:** +- ✅ デフォルト設定ですぐに使用可能 +- ✅ 環境の一貫性、依存関係の問題を回避 +- ✅ ワンクリック起動、Go、Node.js、FFmpegのインストール不要 +- ✅ 移行とスケーリングが容易 +- ✅ 自動ヘルスチェックと再起動 +- ✅ ファイル権限の自動処理 + +#### 🔗 ホストサービスへのアクセス(Ollama/ローカルモデル) + +コンテナは `http://host.docker.internal:ポート番号` を使用してホストサービスにアクセスするよう設定されています。 + +**設定手順:** + +1. **ホストでサービスを起動(全インターフェースでリッスン)** + ```bash + export OLLAMA_HOST=0.0.0.0:11434 && ollama serve + ``` + +2. **フロントエンドAIサービス設定** + - Base URL: `http://host.docker.internal:11434/v1` + - Provider: `openai` + - Model: `qwen2.5:latest` + +--- + +### 🏭 従来のデプロイ方法 + +#### 1. ビルド + +```bash +# 1. フロントエンドをビルド +cd web +npm run build +cd .. + +# 2. バックエンドをコンパイル +go build -o huobao-drama . +``` + +生成ファイル: +- `huobao-drama` - バックエンド実行ファイル +- `web/dist/` - フロントエンド静的ファイル(バックエンドに埋め込み) + +#### 2. デプロイファイルの準備 + +サーバーにアップロードするファイル: +``` +huobao-drama # バックエンド実行ファイル +configs/config.yaml # 設定ファイル +data/ # データディレクトリ(オプション、初回実行時に自動作成) +``` + +#### 3. サーバー設定 + +```bash +# ファイルをサーバーにアップロード +scp huobao-drama user@server:/opt/huobao-drama/ +scp configs/config.yaml user@server:/opt/huobao-drama/configs/ + +# サーバーにSSH接続 +ssh user@server + +# 設定ファイルを編集 +cd /opt/huobao-drama +vim configs/config.yaml +# modeをproductionに設定 +# ドメインとストレージパスを設定 + +# データディレクトリを作成し権限を設定(重要!) +# 注意: YOUR_USERを実際にサービスを実行するユーザー名に置き換え(例: www-data、ubuntu、deploy) +sudo mkdir -p /opt/huobao-drama/data/storage +sudo chown -R YOUR_USER:YOUR_USER /opt/huobao-drama/data +sudo chmod -R 755 /opt/huobao-drama/data + +# 実行権限を付与 +chmod +x huobao-drama + +# サービスを起動 +./huobao-drama +``` + +#### 4. systemdでサービス管理 + +サービスファイル `/etc/systemd/system/huobao-drama.service` を作成: + +```ini +[Unit] +Description=Huobao Drama Service +After=network.target + +[Service] +Type=simple +User=YOUR_USER +WorkingDirectory=/opt/huobao-drama +ExecStart=/opt/huobao-drama/huobao-drama +Restart=on-failure +RestartSec=10 + +# 環境変数(オプション) +# Environment="GIN_MODE=release" + +[Install] +WantedBy=multi-user.target +``` + +サービスを起動: +```bash +sudo systemctl daemon-reload +sudo systemctl enable huobao-drama +sudo systemctl start huobao-drama +sudo systemctl status huobao-drama +``` + +**⚠️ よくある問題: SQLite書き込み権限エラー** + +`attempt to write a readonly database` エラーが発生した場合: + +```bash +# 1. サービスを実行中のユーザーを確認 +sudo systemctl status huobao-drama | grep "Main PID" +ps aux | grep huobao-drama + +# 2. 権限を修正(YOUR_USERを実際のユーザー名に置き換え) +sudo chown -R YOUR_USER:YOUR_USER /opt/huobao-drama/data +sudo chmod -R 755 /opt/huobao-drama/data + +# 3. 権限を確認 +ls -la /opt/huobao-drama/data +# サービスを実行するユーザーが所有者として表示されるはず + +# 4. サービスを再起動 +sudo systemctl restart huobao-drama +``` + +**原因:** +- SQLiteはデータベースファイル**と**そのディレクトリの両方に書き込み権限が必要 +- ディレクトリ内に一時ファイル(例: `-wal`、`-journal`)を作成する必要がある +- **重要**: systemdの`User`がデータディレクトリの所有者と一致していることを確認 + +**一般的なユーザー名:** +- Ubuntu/Debian: `www-data`、`ubuntu` +- CentOS/RHEL: `nginx`、`apache` +- カスタムデプロイ: `deploy`、`app`、現在ログインしているユーザー + +#### 5. Nginxリバースプロキシ + +```nginx +server { + listen 80; + server_name your-domain.com; + + location / { + proxy_pass http://localhost:5678; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + + # 静的ファイルへの直接アクセス + location /static/ { + alias /opt/huobao-drama/data/storage/; + } +} +``` + +--- + +## 🎨 技術スタック + +### バックエンド +- **言語**: Go 1.23+ +- **Webフレームワーク**: Gin 1.9+ +- **ORM**: GORM +- **データベース**: SQLite +- **ログ**: Zap +- **動画処理**: FFmpeg +- **AIサービス**: OpenAI、Gemini、Doubaoなど + +### フロントエンド +- **フレームワーク**: Vue 3.4+ +- **言語**: TypeScript 5+ +- **ビルドツール**: Vite 5 +- **UIコンポーネント**: Element Plus +- **CSSフレームワーク**: TailwindCSS +- **状態管理**: Pinia +- **ルーター**: Vue Router 4 + +### 開発ツール +- **パッケージ管理**: Go Modules、npm +- **コード規約**: ESLint、Prettier +- **バージョン管理**: Git + +--- + +## 📝 よくある質問 + +### Q: DockerコンテナからホストのOllamaにアクセスするには? +A: Base URLとして `http://host.docker.internal:11434/v1` を使用します。注意点: +1. ホストのOllamaは `0.0.0.0` でリッスンする必要があります: `export OLLAMA_HOST=0.0.0.0:11434 && ollama serve` +2. `docker run` を使用するLinuxユーザーは追加が必要: `--add-host=host.docker.internal:host-gateway` + +詳細: [DOCKER_HOST_ACCESS.md](docs/DOCKER_HOST_ACCESS.md) + +### Q: FFmpegがインストールされていない、または見つからない? +A: FFmpegがインストールされ、PATH環境変数に含まれていることを確認してください。`ffmpeg -version` で確認。 + +### Q: フロントエンドがバックエンドAPIに接続できない? +A: バックエンドが実行中で、ポートが正しいか確認してください。開発モードでは、フロントエンドプロキシ設定は `web/vite.config.ts` にあります。 + +### Q: データベーステーブルが作成されない? +A: GORMは初回起動時にテーブルを自動作成します。ログでマイグレーション成功を確認してください。 + +--- + +## 📋 更新履歴 + +### v1.0.2 (2026-01-16) + +#### 🚀 主要アップデート +- 純粋なGo SQLiteドライバー(`modernc.org/sqlite`)、`CGO_ENABLED=0` クロスプラットフォームコンパイルをサポート +- 並行性能を最適化(WALモード)、"database is locked" エラーを解決 +- ホストサービスへのアクセス用 `host.docker.internal` のDockerクロスプラットフォームサポート +- ドキュメントとデプロイガイドの簡素化 + +### v1.0.1 (2026-01-14) + +#### 🐛 バグ修正 / 🔧 改善 +- 動画生成APIレスポンスのパース問題を修正 +- OpenAI Sora動画エンドポイント設定を追加 +- エラー処理とログ出力を最適化 + +--- + +## 🤝 コントリビューション + +IssueとPull Requestを歓迎します! + +1. このプロジェクトをフォーク +2. フィーチャーブランチを作成 (`git checkout -b feature/AmazingFeature`) +3. 変更をコミット (`git commit -m 'Add some AmazingFeature'`) +4. ブランチにプッシュ (`git push origin feature/AmazingFeature`) +5. Pull Requestを作成 + +--- + +## API設定サイト +2分で設定完了: [API集約サイト](https://api.chatfire.site/models) + +## 📧 連絡先 +ビジネス連絡先(WeChat): dangbao1117 + +## コミュニティグループ +![コミュニティグループ](drama.png) +- [Issue](../../issues)を提出 +- プロジェクトメンテナにメール + +--- + +
+ +**⭐ このプロジェクトが役に立ったら、Starをお願いします!** + +## Star履歴 + +[![Star History Chart](https://api.star-history.com/svg?repos=chatfire-AI/huobao-drama&type=date&legend=top-left)](https://www.star-history.com/#chatfire-AI/huobao-drama&type=date&legend=top-left) + +Made with ❤️ by Huobao Team + +
diff --git a/README.md b/README.md index b49889f..0be1c16 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ [功能特性](#功能特性) • [快速开始](#快速开始) • [部署指南](#部署指南) -[简体中文](README.md) | [English](README-EN.md) +[简体中文](README.md) | [English](README-EN.md) | [日本語](README-JA.md) From 7e1220091b286a2e1afb2cadc9e67f15d640efa1 Mon Sep 17 00:00:00 2001 From: kongweigen <421505648@qq.com> Date: Sun, 18 Jan 2026 22:50:07 +0800 Subject: [PATCH 02/15] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=9C=BA?= =?UTF-8?q?=E6=99=AF=E6=8F=90=E7=A4=BA=E8=AF=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/handlers/scene.go | 22 ++++++++++++++ api/routes/routes.go | 1 + .../storyboard_composition_service.go | 22 ++++++++++++++ web/src/api/drama.ts | 8 +++-- web/src/locales/zh-CN.ts | 4 ++- web/src/views/drama/DramaManagement.vue | 20 ++++++++----- web/src/views/drama/EpisodeWorkflow.vue | 29 +++++++++++++++++-- 7 files changed, 92 insertions(+), 14 deletions(-) diff --git a/api/handlers/scene.go b/api/handlers/scene.go index 1367992..cf9fa4f 100644 --- a/api/handlers/scene.go +++ b/api/handlers/scene.go @@ -74,6 +74,28 @@ func (h *SceneHandler) GenerateSceneImage(c *gin.Context) { }) } +func (h *SceneHandler) UpdateScenePrompt(c *gin.Context) { + sceneID := c.Param("scene_id") + + var req services2.UpdateScenePromptRequest + if err := c.ShouldBindJSON(&req); err != nil { + response.BadRequest(c, "Invalid request") + return + } + + if err := h.sceneService.UpdateScenePrompt(sceneID, &req); err != nil { + h.log.Errorw("Failed to update scene prompt", "error", err, "scene_id", sceneID) + if err.Error() == "scene not found" { + response.NotFound(c, "场景不存在") + return + } + response.InternalError(c, err.Error()) + return + } + + response.Success(c, gin.H{"message": "场景提示词已更新"}) +} + func (h *SceneHandler) DeleteScene(c *gin.Context) { sceneID := c.Param("scene_id") diff --git a/api/routes/routes.go b/api/routes/routes.go index 295e7d4..a97fc92 100644 --- a/api/routes/routes.go +++ b/api/routes/routes.go @@ -137,6 +137,7 @@ func SetupRouter(cfg *config.Config, db *gorm.DB, log *logger.Logger, localStora scenes := api.Group("/scenes") { scenes.PUT("/:scene_id", sceneHandler.UpdateScene) + scenes.PUT("/:scene_id/prompt", sceneHandler.UpdateScenePrompt) scenes.DELETE("/:scene_id", sceneHandler.DeleteScene) scenes.POST("/generate-image", sceneHandler.GenerateSceneImage) } diff --git a/application/services/storyboard_composition_service.go b/application/services/storyboard_composition_service.go index 0b203c3..9264729 100644 --- a/application/services/storyboard_composition_service.go +++ b/application/services/storyboard_composition_service.go @@ -399,6 +399,28 @@ func (s *StoryboardCompositionService) GenerateSceneImage(req *GenerateSceneImag return nil, fmt.Errorf("image generation service not available") } +type UpdateScenePromptRequest struct { + Prompt string `json:"prompt"` +} + +func (s *StoryboardCompositionService) UpdateScenePrompt(sceneID string, req *UpdateScenePromptRequest) error { + var scene models.Scene + if err := s.db.Where("id = ?", sceneID).First(&scene).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return fmt.Errorf("scene not found") + } + return fmt.Errorf("failed to find scene: %w", err) + } + + scene.Prompt = req.Prompt + if err := s.db.Save(&scene).Error; err != nil { + return fmt.Errorf("failed to update scene prompt: %w", err) + } + + s.log.Infow("Scene prompt updated", "scene_id", sceneID, "prompt", req.Prompt) + return nil +} + func (s *StoryboardCompositionService) DeleteScene(sceneID string) error { var scene models.Scene if err := s.db.Where("id = ?", sceneID).First(&scene).Error; err != nil { diff --git a/web/src/api/drama.ts b/web/src/api/drama.ts index 34a3acf..12d0cfa 100644 --- a/web/src/api/drama.ts +++ b/web/src/api/drama.ts @@ -108,8 +108,12 @@ export const dramaAPI = { return request.put(`/scenes/${sceneId}`, data) }, - generateSceneImage(data: { scene_id: string; prompt?: string; model?: string }) { - return request.post('/scenes/generate-image', data) + generateSceneImage(data: { scene_id: number; prompt?: string; model?: string }) { + return request.post<{ image_generation: { id: number } }>('/scenes/generate-image', data) + }, + + updateScenePrompt(sceneId: string, prompt: string) { + return request.put(`/scenes/${sceneId}/prompt`, { prompt }) }, deleteScene(sceneId: string) { diff --git a/web/src/locales/zh-CN.ts b/web/src/locales/zh-CN.ts index 8eeaa5f..bd8bd14 100644 --- a/web/src/locales/zh-CN.ts +++ b/web/src/locales/zh-CN.ts @@ -68,7 +68,9 @@ export default { tip: '提示', status: '状态', createdAt: '创建时间', - updatedAt: '更新时间' + updatedAt: '更新时间', + name: '名称', + description: '描述' }, settings: { title: '设置', diff --git a/web/src/views/drama/DramaManagement.vue b/web/src/views/drama/DramaManagement.vue index 8bf61d7..41fcd43 100644 --- a/web/src/views/drama/DramaManagement.vue +++ b/web/src/views/drama/DramaManagement.vue @@ -241,10 +241,10 @@ - + - +