CatPtain commited on
Commit
1578acb
·
verified ·
1 Parent(s): 4ebe091

Upload 2 files

Browse files
Files changed (2) hide show
  1. DEPLOYMENT.md +153 -0
  2. app.py +144 -178
DEPLOYMENT.md ADDED
@@ -0,0 +1,153 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # MoneyPrinterTurbo Huggingface Spaces 部署指南
2
+
3
+ ## 🎉 最新部署状态
4
+
5
+ ✅ **部署成功!** 应用已在Huggingface Spaces上线
6
+ 🔗 **访问地址**: [MoneyPrinterTurbo on HF Spaces](https://huggingface.co/spaces/your-username/MoneyPrinterTurbo)
7
+
8
+ ### 📋 部署完成清单
9
+ - [x] 创建Huggingface Space
10
+ - [x] 上传所有项目文件
11
+ - [x] 配置启动文件 (app.py)
12
+ - [x] 设置依赖文件 (requirements.txt)
13
+ - [x] 优化FREE层级配置
14
+ - [x] 解决启动问题
15
+
16
+ ---
17
+
18
+ ## 🚀 快速部署步骤
19
+
20
+ ### 1. 准备文件
21
+ 确保以下文件已准备好:
22
+ - `app.py` - 简化的Streamlit启动文件
23
+ - `README.md` - 项目说明(从README_HF.md重命名)
24
+ - `requirements.txt` - 精简的依赖列表(从requirements_hf.txt重命名)
25
+ - `config.toml` - 预配置的设置文件
26
+
27
+ ### 2. 创建Huggingface Space
28
+ 1. 访问 https://huggingface.co/spaces
29
+ 2. 点击 "Create new Space"
30
+ 3. 选择 "Streamlit" 作为SDK
31
+ 4. 设置Space名称和描述
32
+
33
+ ### 3. 上传文件
34
+ 将所有项目文件上传到新创建的Space,确保:
35
+ - `app.py` 作为主入口文件
36
+ - 所有必要的项目文件和目录结构完整
37
+
38
+ ### 4. 配置环境变量(重要!)
39
+
40
+ 在Space的Settings页面添加以下环境变量:
41
+
42
+ #### LLM服务商API密钥
43
+ ```bash
44
+ DEEPSEEK_API_KEY=sk-xxxxxx # DeepSeek API密钥
45
+ MOONSHOT_API_KEY=sk-xxxxxx # Moonshot API密钥
46
+ OPENAI_API_KEY=sk-xxxxxx # OpenAI API密钥
47
+ ```
48
+
49
+ #### 视频素材API密钥
50
+ ```bash
51
+ PEXELS_API_KEY=xxxxxx # Pexels视频素材
52
+ PIXABAY_API_KEY=xxxxxx # Pixabay视频素材
53
+ ```
54
+
55
+ #### 语音合成API密钥
56
+ ```bash
57
+ AZURE_SPEECH_KEY=xxxxxx # Azure语音服务密钥
58
+ AZURE_SPEECH_REGION=eastus # Azure服务区域
59
+ ```
60
+
61
+ #### 其他服务
62
+ ```bash
63
+ SILICONFLOW_API_KEY=sk-xxxxxx # SiliconFlow API密钥
64
+ MONEYPRINTER_API_KEY=xxxxxx # MoneyPrinter官方API(可选)
65
+ ```
66
+
67
+ ---
68
+
69
+ ## 🔧 问题解决方案
70
+
71
+ ### ✅ 已解决的问题
72
+
73
+ 1. **启动卡在"Starting"状态**
74
+ - 原因:复杂的启动逻辑和subprocess调用
75
+ - 解决:简化为直接Streamlit应用,移除subprocess启动
76
+
77
+ 2. **依赖包安装失败**
78
+ - 原因:包含不兼容的系统级依赖
79
+ - 解决:使用精简的requirements_hf.txt
80
+
81
+ 3. **资源超限问题**
82
+ - 原因:FREE层级资源限制
83
+ - 解决:优化配置,限制并发任务数
84
+
85
+ ### 🛠️ 当前功能状态
86
+
87
+ - ✅ **基础界面**: 应用启动和配置检查
88
+ - ✅ **环境变量加载**: 自动读取HF Spaces环境变量
89
+ - ✅ **API密钥验证**: 显示已配置的服务状态
90
+ - 🔄 **视频生成**: 核心功能适配中
91
+ - 🔄 **完整界面**: 原Main.py功能迁移中
92
+
93
+ ---
94
+
95
+ ## 📊 API密钥获取指南
96
+
97
+ ### DeepSeek API (推荐)
98
+ 1. 访问 https://platform.deepseek.com/
99
+ 2. 注册账户并获取API密钥
100
+ 3. 新用户通常有免费额度
101
+
102
+ ### Moonshot API
103
+ 1. 访问 https://platform.moonshot.cn/
104
+ 2. 注册并获取API密钥
105
+ 3. 性价比较高的国产LLM
106
+
107
+ ### Pexels API (视频素材)
108
+ 1. 访问 https://www.pexels.com/api/
109
+ 2. 免费注册获取API密钥
110
+ 3. 每月有免费请求限额
111
+
112
+ ### Azure Speech (语音合成)
113
+ 1. 访问 https://azure.microsoft.com/services/cognitive-services/speech-services/
114
+ 2. 创建Azure账户和Speech资源
115
+ 3. 获取API密钥和区域信息
116
+
117
+ ---
118
+
119
+ ## 🎯 使用建议
120
+
121
+ ### FREE层级最佳实践
122
+ 1. **视频时长**: 建议30-60秒
123
+ 2. **并发限制**: 同时只生成1个视频
124
+ 3. **素材选择**: 优先使用缓存的素材
125
+ 4. **API调用**: 合理控制频率
126
+
127
+ ### 性能优化
128
+ - 使用简化界面减少资源占用
129
+ - 启用素材缓存机制
130
+ - 限制同时处理的任务数量
131
+
132
+ ---
133
+
134
+ ## 📞 技术支持
135
+
136
+ 如遇到问题,请检查:
137
+ 1. **Space日志**: 查看启动和运行日志
138
+ 2. **环境变量**: 确认API密钥配置正确
139
+ 3. **网络连接**: 确保API服务可访问
140
+ 4. **资源限制**: 监控内存和CPU使用
141
+
142
+ ---
143
+
144
+ ## 🔄 后续计划
145
+
146
+ 1. **完整功能迁移**: 逐步适配所有视频生成功能
147
+ 2. **性能优化**: 进一步优化FREE层级体验
148
+ 3. **用户界面**: 改进交互体验
149
+ 4. **文档完善**: 添加更多使用教程
150
+
151
+ ---
152
+
153
+ *最后更新: 2024年*
app.py CHANGED
@@ -1,214 +1,180 @@
1
  #!/usr/bin/env python3
2
  """
3
- Huggingface Spaces entry point for MoneyPrinterTurbo
4
- Optimized for FREE tier (2 vCPU + 16GB RAM)
5
  """
6
 
7
  import os
8
  import sys
9
- import subprocess
10
  import toml
11
  from pathlib import Path
12
 
13
- # Add the root directory to Python path
14
- root_dir = os.path.dirname(os.path.abspath(__file__))
15
- sys.path.insert(0, root_dir)
16
-
17
- def setup_environment():
18
- """Setup environment optimized for HF Spaces FREE tier"""
19
- print("📁 Creating storage directories...")
20
- # Create necessary directories
21
- os.makedirs("storage/tasks", exist_ok=True)
22
- os.makedirs("storage/temp", exist_ok=True)
23
- os.makedirs("storage/cache_videos", exist_ok=True)
24
- os.makedirs(".streamlit", exist_ok=True)
25
-
26
- # Create .streamlit/config.toml for proper configuration
27
- streamlit_config = """
28
- [server]
29
- port = 7860
30
- address = "0.0.0.0"
31
- enableCORS = true
32
- enableXsrfProtection = false
33
- enableWebsocketCompression = false
34
-
35
- [browser]
36
- gatherUsageStats = false
37
- """
38
-
39
- with open(".streamlit/config.toml", "w") as f:
40
- f.write(streamlit_config)
41
-
42
- print("✅ Directories and Streamlit config created")
43
 
44
- def load_env_variables():
45
- """Load environment variables into config.toml"""
46
  config_path = "config.toml"
47
 
48
- # Load existing config or create default
49
- try:
50
- if os.path.exists(config_path):
51
- config = toml.load(config_path)
52
- else:
53
- config = {
54
- "app": {"max_concurrent_tasks": 1, "api_enabled": True},
55
- "ui": {"hide_log": False},
56
- "azure": {},
57
- "siliconflow": {}
58
- }
59
- except Exception:
60
- config = {
61
- "app": {"max_concurrent_tasks": 1, "api_enabled": True},
62
- "ui": {"hide_log": False},
63
- "azure": {},
64
- "siliconflow": {}
65
- }
66
 
67
  # Load environment variables
68
- env_mappings = {
69
- # MoneyPrinter API
70
- "MONEYPRINTER_API_KEY": ("app", "api_key"),
71
-
72
- # LLM providers
73
  "DEEPSEEK_API_KEY": ("app", "deepseek_api_key"),
74
- "MOONSHOT_API_KEY": ("app", "moonshot_api_key"),
75
  "OPENAI_API_KEY": ("app", "openai_api_key"),
76
-
77
- # Video sources
78
  "PEXELS_API_KEY": ("app", "pexels_api_keys"),
79
  "PIXABAY_API_KEY": ("app", "pixabay_api_keys"),
80
-
81
- # Azure Speech
82
  "AZURE_SPEECH_KEY": ("azure", "speech_key"),
83
  "AZURE_SPEECH_REGION": ("azure", "speech_region"),
84
-
85
- # SiliconFlow
86
  "SILICONFLOW_API_KEY": ("siliconflow", "api_key"),
 
87
  }
88
 
89
- env_vars_loaded = []
90
- for env_var, (section, key) in env_mappings.items():
91
- value = os.getenv(env_var)
92
  if value:
93
  if section not in config:
94
  config[section] = {}
95
-
96
- # Handle API keys that should be lists
97
- if key in ["pexels_api_keys", "pixabay_api_keys"]:
98
- config[section][key] = [value] if isinstance(value, str) else value
99
  else:
100
- config[section][key] = value
101
-
102
- env_vars_loaded.append(env_var)
103
 
104
- # Save updated config
105
- try:
106
- with open(config_path, "w") as f:
107
- toml.dump(config, f)
108
-
109
- if env_vars_loaded:
110
- print(f"✅ Loaded environment variables: {', '.join(env_vars_loaded)}")
111
- else:
112
- print("ℹ️ No environment variables found, using WebUI configuration")
113
- except Exception as e:
114
- print(f"⚠️ Could not save config: {e}")
115
-
116
- def optimize_for_free_tier():
117
- """Apply FREE tier optimizations"""
118
- print("🔧 Applying FREE tier optimizations...")
119
 
120
- # Set environment variables for optimization
121
- os.environ["STREAMLIT_SERVER_MAX_UPLOAD_SIZE"] = "10" # 10MB limit
122
- os.environ["STREAMLIT_SERVER_MAX_MESSAGE_SIZE"] = "10" # 10MB limit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
123
 
124
- print("✅ FREE tier optimizations applied")
 
 
 
 
 
 
 
 
 
 
125
 
126
- def start_streamlit():
127
- """Start Streamlit application"""
128
- print("🚀 Starting Streamlit application...")
129
 
130
- # Check if we should use SimpleMain (FREE tier) or full Main
131
- use_simple = os.getenv("USE_SIMPLE_UI", "true").lower() == "true"
 
 
 
 
 
 
 
 
132
 
133
- if use_simple:
134
- streamlit_file = "webui/SimpleMain.py"
135
- print("📱 Using SimpleMain.py (FREE tier optimized)")
 
136
  else:
137
- streamlit_file = "webui/Main.py"
138
- print("🖥️ Using Main.py (full features)")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
139
 
140
- # Start Streamlit
141
- try:
142
- subprocess.run([
143
- sys.executable, "-m", "streamlit", "run", streamlit_file,
144
- "--server.port", "7860",
145
- "--server.address", "0.0.0.0",
146
- "--server.enableCORS", "true",
147
- "--server.enableXsrfProtection", "false",
148
- "--browser.gatherUsageStats", "false"
149
- ], check=True)
150
- except subprocess.CalledProcessError as e:
151
- print(f"❌ Failed to start Streamlit: {e}")
152
- # Fallback to simple HTTP server
153
- print("🔄 Falling back to simple HTTP server...")
154
-
155
- # Create a simple status page
156
- html_content = """<!DOCTYPE html>
157
- <html>
158
- <head>
159
- <title>MoneyPrinterTurbo - Starting</title>
160
- <meta charset="utf-8">
161
- <style>
162
- body { font-family: Arial, sans-serif; text-align: center; padding: 50px; }
163
- .container { max-width: 600px; margin: 0 auto; }
164
- h1 { color: #4CAF50; }
165
- .status { padding: 20px; background: #f0f8ff; border-radius: 10px; margin: 20px 0; }
166
- </style>
167
- </head>
168
- <body>
169
- <div class="container">
170
- <h1>🎬 MoneyPrinterTurbo</h1>
171
- <div class="status">
172
- <h2>🔄 应用启动中...</h2>
173
- <p>Streamlit 启动失败,正在尝试备用方案。</p>
174
- <p>请稍后刷新页面或检查日志获取更多信息。</p>
175
- </div>
176
- </div>
177
- </body>
178
- </html>"""
179
-
180
- with open("index.html", "w", encoding="utf-8") as f:
181
- f.write(html_content)
182
-
183
- subprocess.run([
184
- sys.executable, "-m", "http.server", "7860",
185
- "--bind", "0.0.0.0"
186
- ])
187
-
188
- if __name__ == "__main__":
189
- print("🎬 MoneyPrinterTurbo - Huggingface Spaces Edition")
190
- print("=" * 50)
191
 
192
- try:
193
- # Setup environment
194
- setup_environment()
195
-
196
- # Load environment variables
197
- load_env_variables()
198
-
199
- # Apply FREE tier optimizations
200
- optimize_for_free_tier()
201
-
202
- # Start application
203
- start_streamlit()
204
-
205
- except Exception as e:
206
- print(f" Fatal error: {e}")
207
- import traceback
208
- traceback.print_exc()
209
-
210
- # Keep the process alive for debugging
211
- import time
212
- print(" Keeping process alive for debugging...")
213
- while True:
214
- time.sleep(60)
 
 
1
  #!/usr/bin/env python3
2
  """
3
+ MoneyPrinterTurbo - Huggingface Spaces Edition
4
+ Optimized for FREE tier deployment
5
  """
6
 
7
  import os
8
  import sys
9
+ import streamlit as st
10
  import toml
11
  from pathlib import Path
12
 
13
+ # Add project root to Python path
14
+ project_root = Path(__file__).parent
15
+ sys.path.insert(0, str(project_root))
16
+
17
+ # Create necessary directories
18
+ os.makedirs("storage/tasks", exist_ok=True)
19
+ os.makedirs("storage/temp", exist_ok=True)
20
+ os.makedirs("storage/cache_videos", exist_ok=True)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21
 
22
+ def load_config():
23
+ """Load configuration from environment variables"""
24
  config_path = "config.toml"
25
 
26
+ # Default configuration
27
+ config = {
28
+ "app": {
29
+ "max_concurrent_tasks": 1,
30
+ "api_enabled": True,
31
+ "log_level": "INFO"
32
+ },
33
+ "ui": {"hide_log": False, "language": "zh"},
34
+ "azure": {},
35
+ "siliconflow": {}
36
+ }
 
 
 
 
 
 
 
37
 
38
  # Load environment variables
39
+ env_vars = {
 
 
 
 
40
  "DEEPSEEK_API_KEY": ("app", "deepseek_api_key"),
41
+ "MOONSHOT_API_KEY": ("app", "moonshot_api_key"),
42
  "OPENAI_API_KEY": ("app", "openai_api_key"),
 
 
43
  "PEXELS_API_KEY": ("app", "pexels_api_keys"),
44
  "PIXABAY_API_KEY": ("app", "pixabay_api_keys"),
 
 
45
  "AZURE_SPEECH_KEY": ("azure", "speech_key"),
46
  "AZURE_SPEECH_REGION": ("azure", "speech_region"),
 
 
47
  "SILICONFLOW_API_KEY": ("siliconflow", "api_key"),
48
+ "MONEYPRINTER_API_KEY": ("app", "api_key")
49
  }
50
 
51
+ loaded_keys = []
52
+ for env_key, (section, config_key) in env_vars.items():
53
+ value = os.getenv(env_key)
54
  if value:
55
  if section not in config:
56
  config[section] = {}
57
+ if config_key.endswith("_keys"):
58
+ config[section][config_key] = [value]
 
 
59
  else:
60
+ config[section][config_key] = value
61
+ loaded_keys.append(env_key)
 
62
 
63
+ # Save configuration
64
+ with open(config_path, 'w', encoding='utf-8') as f:
65
+ toml.dump(config, f)
 
 
 
 
 
 
 
 
 
 
 
 
66
 
67
+ return config, loaded_keys
68
+
69
+ # Load configuration
70
+ config, loaded_env_vars = load_config()
71
+
72
+ # Set Streamlit page config
73
+ st.set_page_config(
74
+ page_title="MoneyPrinterTurbo - HF Spaces",
75
+ page_icon="🎬",
76
+ layout="wide",
77
+ initial_sidebar_state="expanded"
78
+ )
79
+
80
+ # Custom CSS
81
+ st.markdown("""
82
+ <style>
83
+ .main > div {
84
+ padding-top: 2rem;
85
+ }
86
+ .stAlert {
87
+ margin-top: 1rem;
88
+ }
89
+ </style>
90
+ """, unsafe_allow_html=True)
91
+
92
+ # Main UI
93
+ st.title("🎬 MoneyPrinterTurbo")
94
+ st.markdown("### AI视频生成工具 - Huggingface Spaces版")
95
+
96
+ # Status display
97
+ with st.container():
98
+ col1, col2 = st.columns(2)
99
 
100
+ with col1:
101
+ st.success("✅ 应用已成功启动")
102
+ st.info(f"📊 环境变量加载: {len(loaded_env_vars)} 个")
103
+
104
+ with col2:
105
+ st.warning("⚠️ 这是简化版界面")
106
+ st.info("🔧 为FREE层级优化")
107
+
108
+ # Configuration status
109
+ st.subheader("📋 配置状态")
110
+ config_status = st.container()
111
 
112
+ with config_status:
113
+ # Check API keys
114
+ api_keys_status = []
115
 
116
+ if config.get("app", {}).get("deepseek_api_key"):
117
+ api_keys_status.append(" DeepSeek API")
118
+ if config.get("app", {}).get("moonshot_api_key"):
119
+ api_keys_status.append("✅ Moonshot API")
120
+ if config.get("app", {}).get("openai_api_key"):
121
+ api_keys_status.append("✅ OpenAI API")
122
+ if config.get("app", {}).get("pexels_api_keys"):
123
+ api_keys_status.append("✅ Pexels API")
124
+ if config.get("azure", {}).get("speech_key"):
125
+ api_keys_status.append("✅ Azure Speech")
126
 
127
+ if api_keys_status:
128
+ st.success("🔑 已配置的API密钥:")
129
+ for status in api_keys_status:
130
+ st.write(f" {status}")
131
  else:
132
+ st.error("❌ 未检测到API密钥配置")
133
+ st.info("💡 请在Huggingface Spaces设置中添加环境变量")
134
+
135
+ # Instructions
136
+ st.subheader("🚀 使用说明")
137
+ st.markdown("""
138
+ 1. **配置API密钥**: 在Huggingface Spaces的Settings中添加环境变量
139
+ 2. **选择功能**: 使用下方的功能模块开始创建视频
140
+ 3. **注意限制**: FREE层级有资源限制,建议生成较短的视频
141
+ """)
142
+
143
+ # Quick actions
144
+ st.subheader("⚡ 快速操作")
145
+
146
+ # Simple video generation form
147
+ with st.form("quick_video"):
148
+ video_topic = st.text_input("视频主题", placeholder="例如: 介绍人工智能的发展历史")
149
+ video_duration = st.slider("视频时长 (秒)", 30, 120, 60)
150
 
151
+ col1, col2 = st.columns(2)
152
+ with col1:
153
+ video_style = st.selectbox("视频风格", ["科技", "生活", "教育", "娱乐"])
154
+ with col2:
155
+ video_language = st.selectbox("语言", ["中文", "英文"])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
156
 
157
+ submitted = st.form_submit_button("🎬 生成视频")
158
+
159
+ if submitted:
160
+ if not video_topic:
161
+ st.error("请输入视频主题")
162
+ elif not api_keys_status:
163
+ st.error("请先配置API密钥")
164
+ else:
165
+ with st.spinner("正在生成视频..."):
166
+ st.info("🔄 视频生成功能正在开发中")
167
+ st.success("✅ 配置已保存,等待完整功能上线")
168
+
169
+ # Footer
170
+ st.markdown("---")
171
+ st.markdown("💡 **提示**: 完整版功能正在适配中,敬请期待!")
172
+
173
+ # Debug info (for development)
174
+ if st.checkbox("显示调试信息"):
175
+ st.subheader("🔍 调试信息")
176
+ st.json({
177
+ "loaded_env_vars": loaded_env_vars,
178
+ "config_sections": list(config.keys()),
179
+ "storage_dirs": ["storage/tasks", "storage/temp", "storage/cache_videos"]
180
+ })